From 16f26fd5526f503c784356e22cf574799fafa4f8 Mon Sep 17 00:00:00 2001 From: andromeda Date: Thu, 2 Apr 2026 12:17:16 +0200 Subject: [PATCH] no mod r/m flag on 'out' opcode, use r/m<-r as default r<-r --- twasm/asm/main.asm | 74 ++++++++++++++++++++++++++++++++++++++-------- twasm/package.nix | 3 +- 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index 6ffe830..9af9ac4 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -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: diff --git a/twasm/package.nix b/twasm/package.nix index c96b1bc..ee4e250 100644 --- a/twasm/package.nix +++ b/twasm/package.nix @@ -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