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