不正确的操作数类型错误__asm

时间:2017-10-02 23:37:45

标签: assembly

LEA EDX,DWORD PTR SS:[EBP-0x810]
PUSH EDX
LEA EAX,DWORD PTR SS:[EBP-0x80C]
PUSH EAX
PUSH DWORD PTR SS:[EBP+0x8]
CALL HKD_GetTeleportPosition
ADD ESP, 0xC

CMP EAX, -1
JNZ 0x42891B

LEA EDX,DWORD PTR SS:[EBP-0x810]
MOV EAX, 0x042890B
JMP EAX

JNZ 0x42891B我收到错误。怎么了?我什么都不知道。

2 个答案:

答案 0 :(得分:2)

  

在JNZ 0x42891B我收到错误,有什么不对?我没有意识形态

可以想象汇编程序可以接受JNZ 0x42891B作为有效指令。它将计算您提供的绝对地址与该指令所在位置之间的距离,然后编码正确的相对地址。你的汇编程序显然没有!

在大多数汇编器中,条件分支的操作​​数表示为标签。

  CMP EAX, -1
  JNZ YourTarget

  LEA EDX,DWORD PTR SS:[EBP-0x810]
  MOV EAX, 0x042890B
  JMP EAX

YourTarget:
  ...

答案 1 :(得分:0)

x86没有绝对近似跳转编码。如果您知道CS的当前值,理论上可以使用far jmp ptr16:32,但这可能比任何替代方案都慢。

如果你的汇编程序不会为你计算给定绝对地址的相对位移,你可以尝试自己编码(除了我用NASM测试,这不起作用):

;; DOESN'T WORK in NASM or YASM, maybe try in MASM / MSVC
db 0x0F, 0x85              ; The opcode for JNZ rel32
dd 0x42891B - ($+4)        ; The rel32 itself, from the end of the JNZ.

$是当前输出位置,不包括当前指令。 (但跳跃位移是从指令的末尾开始的。)

理论上,这可能在位置相关的代码中(在链接时知道它自己的地址),但可能没有汇编程序/链接器支持它。

YASM不会组装(error: data expression too complex)。 NASM 2.13.01将汇编它,但将其视为$ = 0.因此它向前分支0x42891B - 4个字节。在链接二进制文件中,我得到400093: 0f 85 93 00 40 00 jne 80012c

我没有MASM或MSVC,因此可能值得尝试。

灵活的替代方案(使用寄存器间接JMP)

    CMP   EAX, -1
    jz    @nojump
    mov   ecx, 0x42891B   ; pick any register that you can clobber here
    jmp   ecx
@nojump: