繁体   English   中英

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

[英]What is the main difference between `JMP EBX` and `JMP DWORD PTR DS:[EBX]`?

我试图将参数传递给EIP寄存器,作为对EBX寄存器的跳转指令。

JMP EBX意味着指示CPU跳转到EBX寄存器值指向的地址。 如果EBX12345678h ,它将跳转到地址12345678h 因此,该指令被解释为JMP 12345678h

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

简短答案

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

例如,假设DS = 0x0440EBX = 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 ,在操作数指定的地址处执行近跳转 (在同一代码段中)。

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

JMP ptr16:32

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

是正在使用的第二个跳转的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM