2017-10-06 325 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