我剛剛有一個問題,我似乎無法找到一個體面的答案。
我給這個代碼: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
不是跳?
在此先感謝
'jl'是一個* signed *小於。你需要將你的數字解釋爲2的補碼。即'0xff-256'和'0x82 - 256',因爲它們都設置了它們的符號位。 –
寫低8位/低16位寄存器不會修改高位字節。這與編寫32位寄存器不同,後者將完整的64位寄存器置零。 https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –
你至少有3個單獨的問題在這裏。請不要這樣做,看[問]。如果您想了解彙編程序如何從指令末尾計算jmp位移,請彙編該代碼,然後查看機器代碼字節的反彙編+ hexdump。有關手冊和指南的鏈接,另請參閱https://stackoverflow.com/tags/x86/info。英特爾的x86手冊涵蓋了指令編碼的所有細節。 –