了解汇编代码行和65535%edx

时间:2014-10-13 21:26:04

标签: c assemblies

我有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中的是什么?

1 个答案:

答案 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的十进制数。