介绍x86程序集

时间:2015-03-21 05:42:37

标签: c assembly x86 intel

我正在查看CSAPP(计算机系统 - 程序员的第二篇)中的汇编示例,我只是想知道我对汇编代码的理解是否正确。

练习题3.23

int fun_b(unsigned x) {
   int val = 0;
   int i;
   for ( ____;_____;_____) {
   }
   return val;
}

gcc C编译器生成以下汇编代码:

x at %ebp+8
// what I've gotten so far

1 movl 8(%ebp), %ebx  // ebx: x
2 movl $0, %eax  // eax: val, set to 0 since eax is where the return 
// value is stored and val is being returned at the end
3 movl $0, %ecx  // ecx: i, set to 0
4 .L13:  // loop
5 leal (%eax,%eax), %edx  // edx = val+val 
6 movl %ebx, %eax  // val = x (?)
7 andl $1, %eax // x = x & 1
8 orl %edx, %eax  // x = (val+val) | (x & 1)
9 shrl %ebx Shift right by 1  // x = x >> 1
10 addl $1, %ecx  // i++
11 cmpl $32, %ecx  // if i < 32 jump back to loop
12 jne .L13 

关于解决方案的同一问题也有类似的帖子,但我正在寻找更多的演练和逐行解释汇编代码。

1 个答案:

答案 0 :(得分:1)

你似乎已经明白了指令的含义。行7-8上的评论稍有不妥,因为那些eax分配给val而不是x

7 andl $1, %eax // val = val & 1 = x & 1
8 orl %edx, %eax  // val = (val+val) | (x & 1)

将其放入C模板可以是:

for(i = 0; i < 32; i++, x >>= 1) {
    val = (val + val) | (x & 1);
}

请注意(val + val)只是一个左移,所以这个函数正在做的是从右边的x移出位并从右移到val。因此,它反映了这些内容。

PS:如果for的正文必须为空,您当然可以将其合并到第三个表达式中。