我正在尝试将参数EIP
作为注册跳转指令传递给EBX
注册。
2 回答
JMP EBX
意思是指示 CPU 跳转到EBX
寄存器值所指向的地址。如果EBX
是12345678h
,它会跳转到 address 12345678h
。所以指令被解释为JMP 12345678h
.
JMP DWORD PTR DS:[EBX]
表示指示 CPU 跳转到从寄存器值和选择器DWORD
指向的内存地址读取的值指向的地址。如果是,CPU将从内存中的地址读取值,然后跳转到该值指向的地址(来自内存的值)。如果内存中的值为,它将跳转到 address 。所以指令被解释为. 读取内存后,它将被解释为.EBX
DS
EBX
11111111h
DWORD
DS:11111111h
DWORD
DWORD
22222222h
22222222h
JMP DWORD PTR DS:[11111111h]
JMP 22222222h
简短的回答
JMP EBX
将跳转到EBX
当前代码段内的寄存器中存储的地址。 将跳转到存储在 .指向的代码段内的JMP DWORD PTR DS:[EBX]
内存偏移处的地址。EBX
DS
例如, 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 位整数。
这是使用中的第二次跳转的示例。