我正在尝试将参数传递给EIP
寄存器作为EBX
寄存器的跳转指令。
答案 0 :(得分:4)
JMP EBX
表示指示CPU跳转到EBX
寄存器值指向的地址。如果EBX
为12345678h
,则会跳转到地址12345678h
。因此该指令被解释为JMP 12345678h
。
JMP DWORD PTR DS:[EBX]
表示指示CPU跳转到从DWORD
寄存器值和EBX
选择器指向的内存地址读取的DS
值指向的地址。如果EBX
为11111111h
,则CPU将从地址DWORD
的内存中读取DS:11111111h
值,然后跳转到该DWORD
值指向的地址(来自记忆的价值)。如果内存中的DWORD
值为22222222h
,则会跳转到地址22222222h
。因此该指令被解释为JMP DWORD PTR DS:[11111111h]
。读取内存后,它将被解释为JMP 22222222h
。
答案 1 :(得分:4)
JMP EBX
将跳转到当前代码段中EBX
寄存器中存储的地址。JMP DWORD PTR DS:[EBX]
将跳转到代码中存储在偏移量EBX
的地址DS
指向的细分。
例如,让DS
= 0x0440 ,EBX
= 0x00006200 ,以及地址 0x00006200的内存的前四个字节 0x00003500 (在小端机器上存储为 00 35 00 00 )。
JMP EBX
变为JMP 0x00006200
JMP DWORD PTR DS:[EBX]
变为JMP 0x0440:0x00003500
JMP EBX
具有以下签名:
JMP r/m32
在这种情况下,跳转地址存储在32位寄存器(您的情况)中或存储在内存中的32位变量中。处理器通过将值加载到EIP
中,在操作数指定的地址执行 near jump (在相同的代码段中)。
JMP DWORD PTR DS:[EBX]
具有以下签名:
JMP ptr16:32
这里跳转地址分为两部分。第一个值(冒号前)给出要跳转到的代码段的地址,第二个值(冒号后)给出该代码段内的偏移量。跳转可以是与当前不同的代码段,因此是远跳。处理器通过加载第一个来执行跳转
值为CS
,第二个为EIP
此外,第二条指令使用[EBX]
,而不是第一条EBX
。这意味着它将读取存储在EBX
中的偏移量的内存并使用该值
DWORD PTR
是 size指令,它告诉汇编器应将内存视为32位整数。
Here是第二次使用跳跃的示例。