diff options
| -rw-r--r-- | example/samples/x86_64.S | 7 | ||||
| -rw-r--r-- | miasm2/arch/x86/arch.py | 5 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 7 |
3 files changed, 14 insertions, 5 deletions
diff --git a/example/samples/x86_64.S b/example/samples/x86_64.S index d090a01b..c37d30fa 100644 --- a/example/samples/x86_64.S +++ b/example/samples/x86_64.S @@ -1,10 +1,9 @@ main: MOV R9, 0x0 - MOV R8, title - MOV RDX, msg + LEA R8, QWORD PTR [title] + LEA RDX, QWORD PTR [msg] MOV RCX, 0x0 - MOV RAX, QWORD PTR [ MessageBoxA ] - CALL RAX + CALL QWORD PTR [ MessageBoxA ] RET title: diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 724f6b86..b5c72d32 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -1738,7 +1738,9 @@ def parse_mem(expr, parent, w8, sx=0, xmm=0, mm=0): else: return None, None, False - if (parent.mode == 64 and ptr.size == 32 and + if (not isinstance(ptr, ExprInt) and + parent.mode == 64 and + ptr.size == 32 and parent.admode != 1): return None, None, False dct_expr = {f_isad: True} @@ -1980,6 +1982,7 @@ class x86_rm_arg(m_arg): v = v.items() v.sort() v = tuple(v) + admode = 64 if p.mode == 64 else admode if not v in modrm2byte[admode]: continue xx = modrm2byte[admode][v] diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index 49cfacf4..f3a01d97 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -790,6 +790,13 @@ reg_tests = [ (m64, "00000000 CALL QWORD PTR [RAX+RBX+0x11223344]", "ff941844332211"), + (m64, "XXXXXXXX CALL QWORD PTR [EAX+EBX]", + "67ff1418"), + (m64, "XXXXXXXX CALL QWORD PTR [0x11223344]", + "ff142544332211"), + (m64, "XXXXXXXX CALL QWORD PTR [RIP+0x11223344]", + "ff1544332211"), + (m32, "00000000 CALL FAR DWORD PTR [EAX]", "ff18"), |