簡體   English   中英

解釋此匯編代碼

[英]interpreting this assembly code

我試圖解釋以下IA32匯編程序代碼,並用C編寫一個具有同等作用的函數。

假設參數abc被存儲在與偏移量存儲單元81216相對於在寄存器中的地址%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM