以下练习来自CSAPP 3.21:
int loop_while(int a, int b)
{
int result = 1;
while (a < b)
{
result *= (a+b);
a++;
}
return result;
}
gcc生成以下汇编代码:
;a at %ebp+8, b at %ebp+12
movl 8(%ebp), %ecx
movl 12(%ebp), %ebx
movl $1, %eax ; this one
cmpl %ebx, %ecx
jge .L11
leal (%ebx,%ecx), %edx
movl $1, %eax ; and this one
.L12:
imull %edx, %eax
addl $1, %ecx
addl $1, %edx
cmpl %ecx, %ebx
jg .L12
.L11: ......
我对第3行和第7行的movl $1, %eax
感到困惑:{4}中没有修改%eax
cmpl %ebx, %ecx
jge .L11
leal (%ebx,%ecx), %edx
不需要再次movl
。
我尝试使用x86_64-apple-darwin15.3.0
gcc 4.2.1
上生成汇编代码
movl $1, %eax
cmpl %esi, %edi
jge LBB0_2
.align 4, 0x90
LBB0_1:
leal (%rsi,%rdi), %ecx
imull %ecx, %eax
incl %edi
cmpl %edi, %esi
jne LBB0_1
LBB0_2:
popq %rbp
retq
.cfi_endproc
无法找到重复movl
的等效说明。
写第二个movl $1, %eax
的重点是什么?