From a84f2d7453e6695a677045a479667c3881d773f3 Mon Sep 17 00:00:00 2001 From: andromeda Date: Wed, 11 Mar 2026 20:14:13 +0100 Subject: [PATCH] add get_ModRM --- twasm/asm/main.asm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index 96d15bc..c8dd826 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -320,6 +320,29 @@ get_tte_typed_metadata: ; ------------------------------------------------------------------------------ get_direct_addressing_ModRM: + mov dl, 11b + call get_ModRM + ret + +; ------------------------------------------------------------------------------ +; get_ModRM +; +; description: +; given 2 register tokens and the mod bits, returns the ModR/M byte +; +; parameters: +; di = token table entry `reg` +; si = token table entry `R/M` +; dl = lower 2 bits: mod bits. The rest is ignored +; +; returned: +; al = ModR/M byte; the rest of rax is zeroed +; ------------------------------------------------------------------------------ + +get_ModRM: + and dl, 11b ; mask for mod bits + shl dl, 6 + ; di = tte call get_reg_bits ; al = reg bits @@ -332,12 +355,12 @@ get_direct_addressing_ModRM: call get_reg_bits ; al = reg bits - mov dl, al + mov cl, al xor eax, eax - or al, 11b << 6 ; mod bits - or al, bl ; reg bits - or al, dl ; R/M bits + or al, dl ; mod bits + or al, bl ; reg bits + or al, cl ; R/M bits and rax, 0xFF ; mask for byte ret