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