Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C x86汇编简介_C_Assembly_X86_Intel - Fatal编程技术网

C x86汇编简介

C x86汇编简介,c,assembly,x86,intel,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

我正在看一个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 
x在%ebp+8处
//到目前为止我得到了什么
1月8日(%ebp),%ebx//ebx:x
2 movl$0,%eax//eax:val,设置为0,因为eax是返回的位置
//存储值,并在末尾返回val
3 movl$0,%ecx//ecx:i,设置为0
4.L13://循环
5 leal(%eax,%eax),%edx//edx=val+val
6movl%ebx,%eax//val=x(?)
7和1美元,%eax//x=x和1
8或%edx,%eax//x=(val+val)|(x&1)
9 shrl%ebx向右移动1//x=x>>1
10加1美元,%ecx//i++
11 cmpl$32,%ecx//如果i<32跳回循环
12约13

关于解决方案的同一个问题,也有类似的帖子,但我想逐行了解和解释汇编代码

您似乎已经理解了说明的含义。但是,行
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);
}
(i=0;i<32;i++,x>=1)的
{
val=(val+val)|(x&1);
}
请注意,
(val+val)
只是一个左移位,因此此函数所做的是从右侧的
x
中移出位,然后从右侧将它们移入
val
。因此,它是镜像位


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

什么?这不是x86-32汇编程序手册!