x86汇编寄存器和mov指令,并跳转抵消
问题描述:
我刚刚有一个问题,我似乎无法找到一个体面的答案。
我给这个代码:x86汇编寄存器和mov指令,并跳转抵消
0020 mov eax, [ebp+0x0c]; value inside = 0x000000ff
0023 mov cl, [ebp+ox08]; value inside- 0x82
0026 cmp al, cl
0028 jl label ;label is at address 003c, jl is signed
002a nop
002b
...
003c label:sub al,cl
如果[ebp+0x08]
值是为0x82和ecx
是0xabcd1234执行该代码之前, 是什么eax
执行此代码后的价值?
它会清除高位,以使ecx
为0x00000082或ecx
为0xabcd1282?
另外指定的jl
指令的偏移量的计算地址是什么?
你将如何确定jl
指令的偏移值?
是不是al
的值大于cl
?所以不会jl
不是跳?
在此先感谢
答
加载cl
后ecx
值是0xabcd1282。
cl
(有符号-126 /无符号130)小于al
(有符号-1 /无符号255),无论它被视为有符号还是无符号。 (在这种情况下,它被视为由jl
签署。)所以不采取跳跃。由于我们不知道0x2b和0x3c之间的指令是什么,因此无法知道eax
和ecx
的最终值是什么。
跳转的偏移量是0x12(0x3c - 0x2a,目标地址减去下一条指令的地址)。
+0
太好了,非常感谢! – Monica
'jl'是一个* signed *小于。你需要将你的数字解释为2的补码。即'0xff-256'和'0x82 - 256',因为它们都设置了它们的符号位。 –
写低8位/低16位寄存器不会修改高位字节。这与编写32位寄存器不同,后者将完整的64位寄存器置零。 https://*.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –
你至少有3个单独的问题在这里。请不要这样做,看[问]。如果您想了解汇编程序如何从指令末尾计算jmp位移,请汇编该代码,然后查看机器代码字节的反汇编+ hexdump。有关手册和指南的链接,另请参阅https://*.com/tags/x86/info。英特尔的x86手册涵盖了指令编码的所有细节。 –