我有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生成以下实现程序主体的Assemblyu代码:
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?
行检(%ecx,%edx),%edx; edx中没有任何内容吗?那么要添加到%ecx中的什么存储在%edx中?
最佳答案
我们要计算
t2 = z * 48
为此,我们首先执行z = z * 3,然后将z左移4(乘以16 ==左移4)
第三行计算
z = z * 3(z + 2z)
第4行向左移4。
编译器通常生成加法和移位的组合以执行乘法,因为乘法的成本更高
至于第6行,65535是0xFFFF的十进制。
关于c - 了解汇编代码行andl 65535%edx,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26349136/