# HG changeset patch # User Mike Pavone # Date 1377363389 25200 # Node ID 75aca5f879696376ea648f54f5eb288d73114fa9 # Parent e823e104b84553d1bc05069d68da38b36ce0d831 A bunch of fixes in x86 instruction encoding diff -r e823e104b845 -r 75aca5f87969 modules/x86.tp --- a/modules/x86.tp Sat Aug 24 09:55:54 2013 -0700 +++ b/modules/x86.tp Sat Aug 24 09:56:29 2013 -0700 @@ -1,8 +1,11 @@ { + regnames <- #["rax" "rcx" "rdx" "rbx" "rsp" "rbp" "rsi" "rdi" "r8" "r9" "r10" "r11" "r12" "r13" "r14" "r15"] + uppernames <- #["ah" "ch" "dh" "bh"] ireg <- :regnum { #{ num <- { regnum } reg <- { regnum and 7u8} + string <- { regnames get: regnum } rm <- :tail { reg or 0xC0u8 | tail } validforSize? <- :size { true } isInteger? <- { false } @@ -33,6 +36,7 @@ #{ num <- { regnum } reg <- { regnum } + string <- { uppernames get: regnum - 4 } rm <- :tail { regnum or 0xC0u8 | tail } validforSize? <- :size { size = byte @@ -88,18 +92,19 @@ if: size = byte { opcode } else: { - opcode or 2u8 + opcode or 1u8 } } opex <- :val { #{ reg <- { val } + string <- { "opex " . val} } } mod_rm:withTail <- :register regmem :end { l <- regmem rm: end - (l value) or (register reg) | (l tail) + (l value) or ( lshift: (register reg) by: 3u8) | (l tail) } mod_rm <- :reg rm { @@ -108,10 +113,10 @@ int_op:withTail <- :value size :tail { if: size >= dword { - tail <- (uint8: (value rshift: 16)) | (uint8: (value rshift: 24)) | tail + tail <- (uint8: (rshift: value by: 16u64)) | (uint8: (rshift: value by: 24u64)) | tail } if: size >= word { - tail <- (uint8: (value rshift: 8)) | tail + tail <- (uint8: (rshift: value by: 8u64)) | tail } (uint8: value) | tail } @@ -122,7 +127,7 @@ int_op64 <- :value size { tail <- [] if: size = qword { - tail <- (uint8: (value rshift: 32)) | (uint8: (value rshift: 40)) | (uint8: (value rshift: 48)) | (uint8: (value rshift: 56)) | tail + tail <- (uint8: (rshift: value by: 32u64)) | (uint8: (rshift: value by: 40u64)) | (uint8: (rshift: value by: 48u64)) | (uint8: (rshift: value by: 56u64)) | tail } int_op: value size withTail: tail } @@ -183,7 +188,7 @@ if: (src isInteger?) { reg <- fakesrc base <- if: size > byte && (((src signed?) && src < 128 && src >= -128) || ((not: (src signed?)) && src < 256)) { - 0x83u8 | (mod_rm: (opex: myopex) dst withTail: [(uint8: src)]) + byteExt | (mod_rm: (opex: myopex) dst withTail: [(uint8: src)]) } else: { if: dst = _rax { (size_bit: immedRax size) | (int_op: src size) @@ -259,6 +264,15 @@ print: "\n" print: ((add: rcx rdx d) map: :el { hex: el }) print: "\n" + prog <- #[ + mov: rdi rax q + sub: 1 rdi q + add: rdi rax q + ret: + ] + ba <- bytearray executableFromBytes: prog + res <- ba runWithArg: 24u64 + print: (string: res) . "\n" 0 } }