#include <stdio.h>
int main(void)
{
int x, y, z;
while(1)
{
x = 0;
y = 1;
do {
printf("%d\n", x);
z = x + y;
x = y;
y = z;
} while(x < 255);
}
}
fib:
(__TEXT,__text) section
_main:
0000000100000f30 pushq %rbp
0000000100000f31 movq %rsp, %rbp
0000000100000f34 subq $0x20, %rsp
0000000100000f38 movl $0x0, -0x4(%rbp) //
0000000100000f3f movl $0x0, -0x8(%rbp)
0000000100000f46 movl $0x1, -0xc(%rbp)
0000000100000f4d movl -0x8(%rbp), %esi
0000000100000f50 leaq 0x53(%rip), %rdi
0000000100000f57 movb $0x0, %al
0000000100000f59 callq 0x100000f88
0000000100000f5e movl -0x8(%rbp), %esi
0000000100000f61 addl -0xc(%rbp), %esi
0000000100000f64 movl %esi, -0x10(%rbp)
0000000100000f67 movl -0xc(%rbp), %esi
0000000100000f6a movl %esi, -0x8(%rbp)
0000000100000f6d movl -0x10(%rbp), %esi
0000000100000f70 movl %esi, -0xc(%rbp)
0000000100000f73 movl %eax, -0x14(%rbp)
0000000100000f76 cmpl $0xff, -0x8(%rbp)
0000000100000f7d jl 0x100000f4d
0000000100000f83 jmp 0x100000f3f
第7行,movl 将 0 move到某个地址, %rbp
是stack basepointer, -0x4
是offset,代表相对rbp的偏移量,
第8行,movl 0x0 到 -0x8, 表示 0x8这个位置的值为0,从这里也能知道 x的位置在0x8,y的位置在0xc
从10-13行表示printf函数调用
movl -0x8(%rbp), %esi
表示将x move到esi寄存器中addl -0xc(%rbp), %esi
means add value of y to esi registermovl %esi, -0x10(%rbp)
last move value from esi register to 0x10, which is variable z
movl -0xc(%rbp), %esi
movl %esi, -0x8(%rbp)
这两行代表 将 y的值存到 esi寄存器中,再从esi寄存器中把值move到 -0x8偏移量,也就是变量x
表示 x = y
0000000100000f6d movl -0x10(%rbp), %esi
0000000100000f70 movl %esi, -0xc(%rbp)
将z的值move到esi,再从esi move到y 也就是 y = z
0000000100000f73 movl %eax, -0x14(%rbp)
这一步是将前面printf的返回值move到一个未使用的变量上,eax是另外一个寄存器,存放的是printf的返回值
0000000100000f76 cmpl $0xff, -0x8(%rbp)
比较 0xff (255) 与地址 -0x8, 也就是x的值
jl 表示 jump less than,是condition jump,也就是如果 x < 255 就跳到 f4d 这个位置
否则就jump到 f3f这个位置