【问题标题】:Assembly code to C practice汇编代码到 C 实践
【发布时间】:2015-10-21 02:49:59
【问题描述】:

所以我正在做以下问题,将汇编代码转换为 C(对于汇编代码来说仍然是一种新事物) 假设你知道当一个带有原型的函数 长解码4(长x,长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;

请检查我的代码,请不要客气!

【问题讨论】:

  • 我生成了程序集,上面的图像出现了,我不确定它是否正确。

标签: c assembly


【解决方案1】:

是的,您的解释是正确的。 只是补充。 代码也可以是 -

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 文件.c

【讨论】:

  • 检查我的代码,如果发现有问题,请发表评论。 @Luke12
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2023-04-10
  • 2021-07-18
相关资源
最近更新 更多