[英]interpreting this assembly code
我試圖解釋以下IA32匯編程序代碼,並用C編寫一個具有同等作用的函數。
假設參數a
, b
和c
被存儲在與偏移量存儲單元8
, 12
和16
相對於在寄存器中的地址%ebp
,和一個適當的函數原型C將是equivFunction(int a, int b, int c);
movl 12(%ebp), %edx // store b into %edx
subl 16(%ebp), %edx // %edx = b - c
movl %edx, %eax // store b - c into %eax
sall $31, %eax // multiply (b-c) * 2^31
sarl $31, %eax // divide ((b-c)*2^31)) / 2^31
imull 8(%ebp), %edx // multiply a * (b - c) into %edx
xorl %edx, %eax // exclusive or? %edx or %eax ? what is going on here?
首先,我是否正確解釋了裝配體? 如果是這樣,我將如何將其轉換為C?
sall
/ sarl
組合的作用是將eax的所有位設置為第零位的值。 首先, sal
將第0位移動到第31位,使其成為符號位。 然后sar
將其移回,並用副本填充寄存器的其余部分。 不要將其視為除法/乘法-將其視為按位移位,即“ s”的實際含義。
因此,如果bc為奇數,則eax為0xffffffff(-1),如果為偶數,則eax為0。 因此, imull
命令會將的負數a或零放入edx。 最后的xor
,那么,無論是反轉的所有位a
(這就是xor
與人做)或離開零值是。
整個片段都帶有人造的氣息。 這是作業嗎?
移位直接操作符號位,而不是乘/除,因此代碼大致
int eqivFunction(int a, int b, int c) {
int t1 = b - c;
unsigned t2 = t1 < 0 ? ~0U : 0;
return (a * t1) ^ t2;
}
交替:
int eqivFunction(int a, int b, int c) {
int t1 = b - c;
int t2 = a * t1;
if (t1 < 0) t2 = -t2 - 1;
return t2;
}
當然,C代碼在整數溢出時具有未定義的行為,而匯編代碼是定義良好的,因此C代碼在所有情況下都可能做不到相同的事情(尤其是在不同體系結構上編譯時)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.