c - x86 汇编简介

标签 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 

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

最佳答案

您似乎已经明白了说明的含义。然而,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的主体必须为空,您当然可以将其合并到第三个表达式中。

关于c - x86 汇编简介,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179666/

相关文章:

c++ - SIMD 延迟吞吐量

c++ - CMake C/C++宏生成

c++ - GNU C 内联汇编中的输入操作数 `"m"(var )` and Output Operand ` "=m"(var)` ?不使用任何指令作为屏障?

assembly - 基本 block 的开始是什么?

c - 在 Assembly 中使用 ATOI 将字符串转换为整数时出现问题

c - 如何将汇编代码关联到 C 程序中的确切行?

c - 从汇编逆向工程优化的 C 代码

C - 段错误 : 11

c - 控制可能会达到非无效功能的终点。 C

c - 原始套接字和 NF_INET_POST_ROUTING