long dw_loop(long x){ long y=x*x; long *p=&x; long n=2*x; do{ x +=y; (*p)++; n--; }while(n>0) return x; }
GCC产生的汇编代码如下:
long dw_loop(long x) x initially in %rdi dw_loop: movq %rdi, %rax movq %rdi, %rcx imulq %rdi, %rcx leaq (%rdi,%rdi),%rdi .L2: leaq 1(%rcx,%rax), %rax subq $1, %rdx testq %rdx, %rdx jg .L2 rep;ret
A. 哪些寄存器用来存放程序值x、y和n?
B. 编译器如何消除对指针变量p和表达式(*p)++隐含的指针间接引用的需求?
C.对汇编代码添加一些注释,描述程序的操作,类似于图3-19c中所示的那样。