我有C代码和汇编代码。我不理解汇编代码的第3行和第6行。
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;
}
汇编代码:
x at % ebp+8, y at %ebp*12, z at %ebp+16
mol 16(%ebp), %eax
leal (%eax, %eax, 2) % eax
sall $4, %eax
movl 12(%ebp) %edx
addl 8(%ebp) %edx
andl $65535, %edx
imull %edx. $eax
在第6行,我不明白65535
如何成为0xFFFF
,以便我们t3 = t1 & 0xFFFF
。
不同的问题: 考虑以下C functino原型,其中num_t是使用typedef声明的数据类型:
void store_prod(num_t *dest, unsigned x, num_t y)
{*dest=x*yl}
Gcc生成以下用于实现计算主体的程序集代码:
dest at %ebp+8, x at ebp+12, y at %ebp+16
mov1 12($ebp), $eax
movl 20($ebp), $ecx
imull $eax, $ecx
mull 16(%ebp)
leal (%ecx,%edx), %edx
movl 8(%ebp), %ecx
movl %eax, (%ecx)
movl %edx, 4(%ecx)
行movl 20(%ebp),%ecx有20(%ebp)的值,它是如何抓住y_t的? line leal(%ecx,%edx),%edx; edx中什么都没有?那么添加到%ecx以存储在%edx中的是什么?
答案 0 :(得分:0)
我们想要计算
T2 = Z * 48
为此,我们先做z = z * 3然后将z左移4(乘以16 ==左移4)
第3行计算
z = z * 3(z + 2z)
第4行左移4。
编译器经常生成add和shift的组合来执行乘法,因为乘法更加昂贵 至于第6行,65535是0xFFFF的十进制数。