2017-10-06 323 views
2

我刚刚有一个问题,我似乎无法找到一个体面的答案。
我给这个代码: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不是跳?

在此先感谢

+0

'jl'是一个* signed *小于。你需要将你的数字解释为2的补码。即'0xff-256'和'0x82 - 256',因为它们都设置了它们的符号位。 –

+1

写低8位/低16位寄存器不会修改高位字节。这与编写32位寄存器不同,后者将完整的64位寄存器置零。 https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –

+0

你至少有3个单独的问题在这里。请不要这样做,看[问]。如果您想了解汇编程序如何从指令末尾计算jmp位移,请汇编该代码,然后查看机器代码字节的反汇编+ hexdump。有关手册和指南的链接,另请参阅https://stackoverflow.com/tags/x86/info。英特尔的x86手册涵盖了指令编码的所有细节。 –

回答

3

加载clecx值是0xabcd1282。

cl(有符号-126 /无符号130)小于al(有符号-1 /无符号255),无论它被视为有符号还是无符号。 (在这种情况下,它被视为由jl签署。)所以不采取跳跃。由于我们不知道0x2b和0x3c之间的指令是什么,因此无法知道eaxecx的最终值是什么。

跳转的偏移量是0x12(0x3c - 0x2a,目标地址减去下一条指令的地址)。

+0

太好了,非常感谢! – Monica