[英]What is the main difference between `JMP EBX` and `JMP DWORD PTR DS:[EBX]`?
我试图将参数传递给EIP
寄存器,作为对EBX
寄存器的跳转指令。
JMP EBX
意味着指示CPU跳转到EBX
寄存器值指向的地址。 如果EBX
是12345678h
,它将跳转到地址12345678h
。 因此,该指令被解释为JMP 12345678h
。
JMP DWORD PTR DS:[EBX]
意思是指示CPU跳转到从EBX
寄存器值和DS
选择器指向的内存地址读取的DWORD
值指向的地址。 如果EBX
是11111111h
,则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
= 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
,在操作数指定的地址处执行近跳转 (在同一代码段中)。
另一方面, JMP DWORD PTR DS:[EBX]
具有以下签名:
JMP ptr16:32
这里的跳转地址分为两部分。 第一个值(在冒号之前)给出要跳转到的代码段的地址,第二个值(在冒号之后)给出该代码段内的偏移量。 跳转可能会与当前跳转到不同的代码段,因此是很远的跳转 。 处理器通过将第一个值加载到CS
并将第二个值加载到EIP
执行跳转。
此外,第二指令使用[EBX]
相对于EBX
在第一。 这意味着它将以EBX
存储的偏移量读取内存并使用该值。
DWORD PTR
是一个大小指令 ,它告诉汇编程序应将内存视为32位整数。
这是正在使用的第二个跳转的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.