所以我正在做以下问题,使汇编代码为C(仍然是汇编代码的新东西) 假设你知道当一个函数有原型时 long decode4(长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;
请查看我的代码,请保持友善!
答案 0 :(得分: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