2015-10-21 81 views
1

enter image description here彙編代碼到C實踐

所以我做了下面的問題,使得彙編代碼C(仍然是一種新的彙編代碼) 假設你知道,當與原型 長decode4功能(長×,長Y,長Z) 被編譯成彙編代碼,該代碼的主體被如下

addq %rsi, %rdi 
imulq %rdx, %rdi  
movq %rdi, %rax  
sarq $15, %rax  
salq $31, %rax  
andq %rdi, %rax  
ret 

參數x,y和z在寄存器%RDI,%RSI,和%傳遞RDX。代碼將返回值存儲在寄存器%rax中。

我如何解釋的代碼是用下面的:

long w =(x+y)*z; 
w=(w>>15); 
w=(<<31); 
return x&w; 

請查看我的代碼,並請該多好!

+0

我生成了程序集並且上面的圖像出現了,我不確定它是否正確。 – Luke12

回答

3

是的,你的解釋是對的。 只需添加。 代碼也可能是 -

addq %rsi, %rdi => x = x + y 
imulq %rdx, %rdi => x = x*z 
movq %rdi, %rax => w = x 
sarq $15, %rax => w = w >> 15 
salq $31, %rax => w = w << 31 
andq %rdi, %rax => w = w & x 
ret    => return w 

++++++++++++++++++++++++++++++++++++ +++++++++++++

long w; 
x=(x+y)*z; 
w=((x>>15)<<31); 
return x&w; 

這一切都取決於編譯器如何決定將其翻譯成ASM,有時還加入了自己的優化。如果你願意,你不能將它精確地轉換成C代碼。

但是你可以做相反的事情。從C文件生成一個asm文件。

gcc -O2 -S -c file.c

+0

等待你的意思是w =(x + y)* z? @WIN_SOM_LIV – Luke12

+1

如果您發現錯誤,請查看我的代碼和評論。 @ Luke12 –