1. #include <stdio.h>
    2. int main(void)
    3. {
    4. int x, y, z;
    5. while(1)
    6. {
    7. x = 0;
    8. y = 1;
    9. do {
    10. printf("%d\n", x);
    11. z = x + y;
    12. x = y;
    13. y = z;
    14. } while(x < 255);
    15. }
    16. }
    1. fib:
    2. (__TEXT,__text) section
    3. _main:
    4. 0000000100000f30 pushq %rbp
    5. 0000000100000f31 movq %rsp, %rbp
    6. 0000000100000f34 subq $0x20, %rsp
    7. 0000000100000f38 movl $0x0, -0x4(%rbp) //
    8. 0000000100000f3f movl $0x0, -0x8(%rbp)
    9. 0000000100000f46 movl $0x1, -0xc(%rbp)
    10. 0000000100000f4d movl -0x8(%rbp), %esi
    11. 0000000100000f50 leaq 0x53(%rip), %rdi
    12. 0000000100000f57 movb $0x0, %al
    13. 0000000100000f59 callq 0x100000f88
    14. 0000000100000f5e movl -0x8(%rbp), %esi
    15. 0000000100000f61 addl -0xc(%rbp), %esi
    16. 0000000100000f64 movl %esi, -0x10(%rbp)
    17. 0000000100000f67 movl -0xc(%rbp), %esi
    18. 0000000100000f6a movl %esi, -0x8(%rbp)
    19. 0000000100000f6d movl -0x10(%rbp), %esi
    20. 0000000100000f70 movl %esi, -0xc(%rbp)
    21. 0000000100000f73 movl %eax, -0x14(%rbp)
    22. 0000000100000f76 cmpl $0xff, -0x8(%rbp)
    23. 0000000100000f7d jl 0x100000f4d
    24. 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 register
    movl %esi, -0x10(%rbp) last move value from esi register to 0x10, which is variable z

    1. movl -0xc(%rbp), %esi
    2. movl %esi, -0x8(%rbp)

    这两行代表 将 y的值存到 esi寄存器中,再从esi寄存器中把值move到 -0x8偏移量,也就是变量x
    表示 x = y

    1. 0000000100000f6d movl -0x10(%rbp), %esi
    2. 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的值

    image.png

    jl 表示 jump less than,是condition jump,也就是如果 x < 255 就跳到 f4d 这个位置

    否则就jump到 f3f这个位置
    image.png