`JMP EBX`和`JMP DWORD PTR DS:[EBX]`之间的主要区别是什么?

时间:2012-09-03 11:03:29

标签: assembly x86

我正在尝试将参数传递给EIP寄存器作为EBX寄存器的跳转指令。

2 个答案:

答案 0 :(得分:4)

JMP EBX表示指示CPU跳转到EBX寄存器值指向的地址。如果EBX12345678h,则会跳转到地址12345678h。因此该指令被解释为JMP 12345678h

JMP DWORD PTR DS:[EBX]表示指示CPU跳转到从DWORD寄存器值和EBX选择器指向的内存地址读取的DS值指向的地址。如果EBX11111111h,则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是第二次使用跳跃的示例。