我目前正在学习汇编和C编程语言,我有几个关于它的问题。组装与C代码比较
C代码
int arith(int x, int y, int z) {
int t1 = x + y;
int t2 = z*48;
int t3 = t1 & 0xFFFF;
int t4 = t2 * t3;
return t4;
}
汇编代码
movl 16(%ebp),%eax z
leal (%eax,%eax,2), %eax z*3
sall $4,%eax t2 = z*48
movl 12(%ebp),%edx y
addl 8(%ebp),%edx t1 = x+y
andl $65535,%edx t3 = t1&0xFFFF
imull %edx,%eax Return t4 = t2*t3
而不是使用莱亚尔,然后由4移动由48乘Z,可我只是用imull $ 48,%EAX的?
此外,这是多次使用%edx寄存器。这是否意味着t1被覆盖?换句话说,如果我愿意,我还能在t4之前检索t1吗?
是,否(变量't1'被优化掉),并且编号。对于最后一个问题'x + y'是计算出来的,但是从未保存过。 _EDX_在'addl 8(%ebp),%edx'后面具有值'x + y',但是指令'andl $ 65535,%edx'破坏了它。如果您在'addl 8(%ebp),%edx'之后将_EDX_移动到像_ECX_这样的寄存器,那么您仍然可以访问计算的x + y部分。 –
很酷。 C代码是否真的会在幕后翻译,以至于它不会将每个变量存储到它自己的寄存器中? – Dylan
如果不需要它,则不需要。这是优化编译器的功能。 – usr2564301