no mod r/m flag on 'out' opcode, use r/m<-r as default r<-r

This commit is contained in:
andromeda
2026-04-02 12:17:16 +02:00
parent 91a609040f
commit 16f26fd552
2 changed files with 63 additions and 14 deletions

View File

@@ -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:

View File

@@ -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