1)代码,1到100累加求和
#include <stdio.h>
void main()
{
int ss=0;
for(int i=1;i<100;i++)
{
ss=ss+i;
}
printf("%d\n",ss);
}
2)
运行命令:
rm b5.loop.s b5.exe -f ; gcc -O0 -S b5.loop.c ; gcc -o b5.exe b5.loop.s ; ./b5.exe
3)
.file "b5.loop.c"
.text
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -8(%rbp) # 入栈有什么用?,累加的和,放这里,其实可以放其他寄存器啊
movl $1, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp) # 加1,又进入.L2
.L2:
cmpl $99, -4(%rbp)
jle .L3
movl -8(%rbp), %eax
movl %eax, %esi #把eax弄到esi有什么用?可能是什么默念的规则不知道。
leaq .LC0(%rip), %rdi #跟后面printf对应的
movl $0, %eax
call printf@PLT
nop
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",@progbits
4)
gcc -O3 -S b5.loop.c
直接算出来了,有点意思啊
.file "b5.loop.c"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB23:
.cfi_startproc
leaq .LC0(%rip), %rsi
movl $4950, %edx
movl $1, %edi
xorl %eax, %eax
jmp __printf_chk@PLT
.cfi_endproc
.LFE23:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",@progbits