我有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/

10-13 07:52