no mod r/m flag on 'out' opcode, use r/m<-r as default r<-r
This commit is contained in:
@@ -112,7 +112,6 @@ assemble:
|
||||
|
||||
jmp .unexpected_token ; otherwise, fail
|
||||
|
||||
dq 0,0,0 ; TODO figure out why this does anything and fix it :shrug:
|
||||
.label:
|
||||
push rsi
|
||||
mov rsi, .msg_label
|
||||
@@ -479,9 +478,15 @@ assemble:
|
||||
pop rdi ; di = next tte
|
||||
je .operator_2_register_const
|
||||
|
||||
push rcx
|
||||
push rdi
|
||||
push rsi
|
||||
; di = next tte
|
||||
call get_tte_type
|
||||
; al = type of token
|
||||
pop rsi ; si = dst tte
|
||||
pop rdi ; di = src tte
|
||||
pop rcx ; cx = operator tte
|
||||
|
||||
cmp al, 0x02 ; check if token is a register
|
||||
je .operator_2_register_register ; if so, handle
|
||||
@@ -551,19 +556,20 @@ assemble:
|
||||
push rdi
|
||||
push rsi
|
||||
mov di, cx ; di = tte of operator
|
||||
mov sil, 1 ; dst = reg
|
||||
mov sil, 0 ; dst = r/m
|
||||
; bl = operator flag byte
|
||||
call get_opcode
|
||||
; al = opcode
|
||||
; dl = op flag
|
||||
; TODO do something if the op flag is present
|
||||
; dl = flags
|
||||
call .write_byte
|
||||
pop rsi ; si = tte
|
||||
pop rdi ; di = tte
|
||||
|
||||
push rdx
|
||||
; di = tte
|
||||
call get_tte_typed_metadata
|
||||
; al = register typed metadata
|
||||
pop rdx ; dl = flags
|
||||
and al, 11b ; al = register width
|
||||
|
||||
cmp al, 00b ; 8 bit
|
||||
@@ -581,10 +587,12 @@ assemble:
|
||||
; 16 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x66
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 1
|
||||
@@ -593,10 +601,12 @@ assemble:
|
||||
; 64 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x48
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 0
|
||||
@@ -607,10 +617,12 @@ assemble:
|
||||
; 16 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x66
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 0
|
||||
@@ -619,10 +631,12 @@ assemble:
|
||||
; 64 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x48
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 0
|
||||
@@ -633,10 +647,12 @@ assemble:
|
||||
; 16 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x66
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 0
|
||||
@@ -645,10 +661,12 @@ assemble:
|
||||
; 64 bit
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
mov edi, .buffer_end - .buffer ; length of buffer
|
||||
mov rsi, .buffer ; buffer location
|
||||
mov dl, 0x48
|
||||
call elemb
|
||||
pop rdx ; dl = flags
|
||||
pop rsi ; si = src tte
|
||||
pop rdi ; di = dst tte
|
||||
cmp al, 1
|
||||
@@ -656,14 +674,17 @@ assemble:
|
||||
|
||||
jmp .operator_2_register_register_continue
|
||||
.operator_2_register_register_continue:
|
||||
push rsi
|
||||
mov esi, edi ; si = reg; src tte
|
||||
pop rdi ; di = r/m; dst tte
|
||||
shr dl, 4
|
||||
and dl, 1
|
||||
cmp dl, 1
|
||||
je .operator_2_register_register_continue_no_ModRM
|
||||
; si = reg; src tte
|
||||
; di = r/m; dst tte
|
||||
mov edx, 11b ; dl = mod bits
|
||||
call get_ModRM
|
||||
; al = Mod R/M byte
|
||||
call .write_byte
|
||||
|
||||
.operator_2_register_register_continue_no_ModRM:
|
||||
jmp .loop_next_token
|
||||
.operator_2_register_const:
|
||||
push rsi
|
||||
@@ -1083,7 +1104,15 @@ get_ModRM:
|
||||
;
|
||||
; returned:
|
||||
; al = opcode; the rest of rax is zeroed.
|
||||
; dl = flags
|
||||
; dl = flagsX
|
||||
; +----------------------------------------------------+
|
||||
; | flagsX byte |
|
||||
; +----------+-----------+-------------+---------------+
|
||||
; | 7 5 | 4 | 3 | 2 0 |
|
||||
; +----------+-----------+-------------+---------------+
|
||||
; | reserved | no ModR/M | 0x0F prefix | operator flag |
|
||||
; +----------+-----------+-------------+---------------+
|
||||
;
|
||||
; ------------------------------------------------------------------------------
|
||||
|
||||
get_opcode:
|
||||
@@ -1172,7 +1201,6 @@ get_reg_bits:
|
||||
; rax = number of tokens processed
|
||||
; ------------------------------------------------------------------------------
|
||||
|
||||
align 16 ; idk, fixes some alignment bug sometimes :/
|
||||
tokenise:
|
||||
; rdi -> current byte of program
|
||||
add rsi, rdi ; rsi -> last byte of program
|
||||
@@ -2768,16 +2796,22 @@ opcodes:
|
||||
dw 0x004F
|
||||
db 0xF4 ; opcode
|
||||
db 0x00 ; reserved
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; int3
|
||||
dw 0x0050
|
||||
db 0xCC ; opcode
|
||||
db 0x00 ; reserved
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; xor
|
||||
@@ -2799,8 +2833,11 @@ opcodes:
|
||||
dw 0x0054
|
||||
db 0xFF ; r/m
|
||||
db 0x00
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; dec
|
||||
@@ -2826,6 +2863,7 @@ opcodes:
|
||||
dw 0x0000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; mov bit8
|
||||
@@ -2853,6 +2891,7 @@ opcodes:
|
||||
dw 0x0000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; sub
|
||||
@@ -2889,8 +2928,11 @@ opcodes:
|
||||
dw 0x005A
|
||||
db 0xC3 ; opcode
|
||||
db 0x00 ; reserved
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; cmp
|
||||
@@ -2989,17 +3031,25 @@ opcodes:
|
||||
dw 0x0060
|
||||
db 0x8F ; r/m
|
||||
db 0x00
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
dd 0x00000000
|
||||
|
||||
; out
|
||||
; TODO enforce DX AL requirement, ignore ModR/M correctly
|
||||
dw 0x0061
|
||||
db 0xEE
|
||||
db 0xEE ; r/m <- r
|
||||
db 0x00
|
||||
|
||||
dd 0x00000000
|
||||
dd 0x00000000
|
||||
|
||||
db 0x10 ; 10: no ModRM flag
|
||||
db 0x00
|
||||
dw 0x0000
|
||||
|
||||
dd 0x00000000
|
||||
.by_id_end:
|
||||
|
||||
|
||||
@@ -14,8 +14,7 @@ stdenv.mkDerivation {
|
||||
asm/main.asm \
|
||||
-o out.bin \
|
||||
-w+all \
|
||||
-w-reloc-abs \
|
||||
-O0
|
||||
-w-reloc-abs
|
||||
'';
|
||||
installPhase = ''
|
||||
dd if=/dev/zero of=disk bs=512 count=2880
|
||||
|
||||
Reference in New Issue
Block a user