0

我正在尝试将参数EIP作为注册跳转指令传递给EBX注册。

4

2 回答 2

4

JMP EBX意思是指示 CPU 跳转到EBX寄存器值所指向的地址。如果EBX12345678h,它会跳转到 address 12345678h。所以指令被解释为JMP 12345678h.

JMP DWORD PTR DS:[EBX]表示指示 CPU 跳转到从寄存器值和选择器DWORD指向的内存地址读取的值指向的地址。如果是,CPU将从内存中的地址读取值,然后跳转到该值指向的地址(来自内存的值)。如果内存中的值为,它将跳转到 address 。所以指令被解释为. 读取内存后,它将被解释为.EBXDSEBX11111111hDWORDDS:11111111hDWORDDWORD22222222h22222222hJMP DWORD PTR DS:[11111111h]JMP 22222222h

于 2012-09-03T13:14:40.160 回答
4

简短的回答

JMP EBX将跳转到EBX当前代码段内的寄存器中存储的地址。 将跳转到存储在 .指向的代码段内的JMP DWORD PTR DS:[EBX]内存偏移处的地址。EBXDS

例如, let DS= 0x0440 , EBX= 0x00006200 ,地址0x00006200的前四个内存字节为0x00003500 在 little-endian 机器上将存储为00 35 00 00 )。
JMP EBX变成JMP 0x00006200.
JMP DWORD PTR DS:[EBX]变成JMP 0x0440:0x00003500

长答案

JMP EBX具有以下签名:

JMP r/m32

在这种情况下,跳转地址要么存储在 32 位寄存器(您的情况)中,要么作为 32 位变量存储在内存中。处理器通过将值加载EIP.

JMP DWORD PTR DS:[EBX],另一方面,具有以下签名:

JMP ptr16:32

这里的跳转地址分两部分提供。第一个值(在冒号之前)给出了要跳转到的代码段的地址,第二个值(在冒号之后)给出了该代码段内的偏移量。跳转可能是到与当前不同的代码段,因此是远跳转CS处理器通过将第一个值加载到并将第二个值加载到 来执行跳转EIP
此外,第二条指令使用[EBX],而不是第一条指令EBX。这意味着它将读取存储在其中的偏移量的内存EBX并使用该值。
DWORD PTR是一个size 指令,它告诉汇编器内存应该被视为 32 位整数。

是使用中的第二次跳转的示例。

于 2012-09-03T13:49:15.223 回答