从0开始做PA-Day05

By ten of hearts

今天是大年初一, 先祝大家新春快乐. 希望大家在新的一年里身体健康, 学习工作顺利, 天天开心.

从今天起, 我们就正式进入PA2了. 在PA2中, 我们需要实现一个冯诺依曼计算机系统. 也就是在这章中, 我们可以真正在虚拟机上跑起来一些程序啦!(耶!!!!!!!!)

More on Programs

为了能够在我们自己写的虚拟机上运行程序, 我们必须要完整地理解一个程序运行的规则. 尽管在前面的文章中我对这方面有所涉及, 但是并没有将整个运行过程系统性地展现出来, 因此今天, 我还要更细致地介绍一下程序是如何在计算机上跑起来的.

Program(程序)

要想让程序在计算机上跑起来, 我们要先有一个程序(多新鲜呐). 下面, 我将围绕以下这段程序展开介绍.

int main()
{
    int a = 1, b = 0, tmp = 0;
    for (int i = 1; i <= 10; i++)
    {
        tmp = a;
        a = a + b;
        b = tmp;
    }
}

有人可能就说了: Fibonacci数列这么经典的递归算法为什么不用递归写呢? 亏你还说喜欢递归! 呸! 恶心!

原因见Appendix

这段程序算出了10以内的斐波那契数列, 但是并没有用它完成任何事情. 要想执行这段代码, 我们还需要一个…

Compiler(编译器)

目前来讲, 上面这段代码就是简单的文本, 对于机器来说, 他们并没有什么特殊的. 虽然我们可能将其命名为fib.c, 但是.c这个后缀名实际上并无什么特殊作用, 要是我们想的话, 也可以将其改成.txt, .py, 甚至.mp3这些其他后缀名, 而不产生什么影响. 想要执行这段代码, 我们必须有一个机器能够看懂的二进制可执行文件.

一个编译器就是能将C, Java等高级语言变成可执行文件的工具. 不同语言有不同的编译器, 每种编译器还有对应不同架构的多个版本. 由于我的虚拟机使用的是Risc-V32架构, 因此我们需要使用gcc(C语言的一个编译器)的Risc-V32版本进行编译, 再将二进制文件转化成汇编语言(一种较为底层的低级语言), 就可以得到这样的一个文件:

# 内存地址       二进制指令                汇编代码

80000000 <_start>:
80000000:       00000413                li      s0,0
80000004:       00009117                auipc   sp,0x9
80000008:       ffc10113                addi    sp,sp,-4 # 80009000 <_end>
8000000c:       00c000ef                jal     ra,80000018 <_trm_init>

80000010 <main>:
80000010:       00000513                li      a0,0
80000014:       00008067                ret

80000018 <_trm_init>:
80000018:       ff010113                addi    sp,sp,-16
8000001c:       00000517                auipc   a0,0x0
80000020:       01c50513                addi    a0,a0,28 # 80000038 <_etext>
80000024:       00112623                sw      ra,12(sp)
80000028:       fe9ff0ef                jal     ra,80000010 <main>
8000002c:       00050513                mv      a0,a0
80000030:       00100073                ebreak
80000034:       0000006f                j       80000034 <_trm_init+0x1c>

这个文件被分为了三列, 第一列是编译出的一行二进制指令所在的内存地址; 第二列是这个地址中存储的二进制程序(32位)的十六进制表示(8位); 第三列则是这个二进制指令所对应的汇编程序, 其中第一列表示指令的名称(操作码), 第二列表示指令所需的操作数或寄存器名称(操作数).

这样的一个二进制文件就是计算机可以执行的程序啦!

ISA(指令集)

Risc-V指令集中定义了一系列指令, 任何Risc-V架构的芯片必须能够实现这些指令(还记得吗, 指令集是一个规范手册).

不同的指令集所提供的指令数量不同, 因此编译器的设计必须也遵顼指令集的约束. Risc-V是一个精简指令集(Risc), 这意味着其中所包含的指令更少, 同时指令的长度是固定的; 而我们更常见到的Intel x86指令集是一个复杂指令集(Cisc), 其中定义的指令更多, 而指令的长度也是会变的.

这里要说明的是, Risc和Cisc是设计上的选择, 两者之间并没有孰优孰劣之分.

  • Risc的每条指令都能在一个时钟周期中执行完毕, 用简单的指令实现更为紧凑的程序执行, 从而提高了运行效率. 同时, 由于Cisc的指令十分复杂, 设计解析指令的电路通常很复杂, 更难以对硬件进行改进更新.
  • Cisc有十分成熟的商业体系. 同时, Cisc更容易支持并行计算. 在这里这里, 我提供两篇文章以供参考.

下面我也将同一段程序使用x86下的gcc进行编译, 会得到这样的二进制文件:

00100000 <_start>:
  100000:       bd 00 00 00 00          mov    $0x0,%ebp
  100005:       bc 00 90 10 00          mov    $0x109000,%esp
  10000a:       e8 05 00 00 00          call   100014 <_trm_init>
  10000f:       90                      nop

00100010 <main>:
  100010:       31 c0                   xor    %eax,%eax
  100012:       c3                      ret
  100013:       90                      nop

00100014 <_trm_init>:
  100014:       55                      push   %ebp
  100015:       89 e5                   mov    %esp,%ebp
  100017:       83 ec 14                sub    $0x14,%esp
  10001a:       68 40 00 10 00          push   $0x100040
  10001f:       e8 ec ff ff ff          call   100010 <main>
  100024:       cc                      int3
  100025:       83 c4 10                add    $0x10,%esp
  100028:       eb fe                   jmp    100028 <_trm_init+0x14>

相信同学们能很明显地看出区别.

Hardware(硬件)

在执行程序时:

  • CPU中的PC寄存器会记录目前所执行到的指令的位置(内存地址), 读出其中的内容并存入一个指令寄存器中(取指);
  • 接着, CPU会通过一个数字电路将指令中的操作码和操作数分别提取出来(译码);
  • 然后, 机器根据指令的内容对于操作数进行一定的操作(执行);
  • 最后, PC中存储的值会被修改, 从而开启下一条指令的执行(更新PC).

这四个步骤是所有计算机执行每一条程序的工作, 也是我们编写虚拟机时需要完成的操作.

编写虚拟机

相信大家都能看出, 在程序执行的前三个部分中(程序, 编译器, 指令集), 我们都有现成的工具可以使用, 因此在PA2.1中, 我们的任务就是利用代码完成硬件的工作, 也就是用软件模拟出一个Risc-V架构的芯片.

内存在计算机中是一个连续的存储空间, 因此我们使用数组模拟内存; 寄存器是一个有明确结构的存储设备, 因此我们用一个结构体模拟寄存器.

  • 取指: 取值是十分简单的, 只需要从数组中读取PC对应的空间即可.
  • 译码: 译码也不困难, 我们依然使用正则表达式进行模式匹配.
  • 执行: 我们需要为每条指令编写对应的代码实现其功能, 对于Risc-V而言, 由于其中的指令功能都较为单一, 因此也比较简单直接. (虽然讲义要求我们RTFM, 但是我个人觉得STFW在这里是更合理的工具)
  • 更新PC: 一般情况下, 程序只需要顺序执行, 这也就意味着只需要每次将PC移到下一条指令的位置即可, 然而, 对于一些设计跳转的指令来说, 就需要对PC进行特殊处理.

就这样, 我们的虚拟机就可以运行C代码啦~


PA2.1 完成.

Appendix

以下是用递归实现的求Fibonacci数列算法.

int fib(int n)
{
    if (n <= 1)
    {
        return n;
    }
    else
    {
        return fib(n-1) + fib(n-2);
    }
}

int main()
{
    for (int i = 0; i <= 10; i++)
    {
        fib(i);
    }
    return 0;
}

以下是riscv64-gcc编译出的程序:

80000000 <_start>:
80000000:       00000413                li      s0,0
80000004:       00009117                auipc   sp,0x9
80000008:       ffc10113                addi    sp,sp,-4 # 80009000 <_end>
8000000c:       418000ef                jal     ra,80000424 <_trm_init>

80000010 <fib>:
80000010:       00100793                li      a5,1
80000014:       3aa7d063                bge     a5,a0,800003b4 <fib+0x3a4>
80000018:       f5010113                addi    sp,sp,-176
8000001c:       ffe50793                addi    a5,a0,-2
80000020:       0a912223                sw      s1,164(sp)
80000024:       02f12423                sw      a5,40(sp)
80000028:       ffd50493                addi    s1,a0,-3
8000002c:       ffe7f793                andi    a5,a5,-2
80000030:       40f487b3                sub     a5,s1,a5
80000034:       fff50f93                addi    t6,a0,-1
80000038:       00048293                mv      t0,s1
8000003c:       0a112623                sw      ra,172(sp)
80000040:       0a812423                sw      s0,168(sp)
80000044:       0b212023                sw      s2,160(sp)
80000048:       09312e23                sw      s3,156(sp)
8000004c:       09412c23                sw      s4,152(sp)
80000050:       09512a23                sw      s5,148(sp)
80000054:       09612823                sw      s6,144(sp)
80000058:       09712623                sw      s7,140(sp)
8000005c:       09812423                sw      s8,136(sp)
80000060:       09912223                sw      s9,132(sp)
80000064:       09a12023                sw      s10,128(sp)
80000068:       07b12e23                sw      s11,124(sp)
8000006c:       02f12223                sw      a5,36(sp)
80000070:       00012623                sw      zero,12(sp)
80000074:       00100393                li      t2,1
80000078:       000f8493                mv      s1,t6
8000007c:       00048a93                mv      s5,s1
80000080:       28748c63                beq     s1,t2,80000318 <fib+0x308>
80000084:       fff48793                addi    a5,s1,-1
80000088:       00f12c23                sw      a5,24(sp)
8000008c:       ffd48793                addi    a5,s1,-3
80000090:       00f12423                sw      a5,8(sp)
80000094:       00012823                sw      zero,16(sp)
80000098:       02912623                sw      s1,44(sp)
8000009c:       02512823                sw      t0,48(sp)
800000a0:       01812783                lw      a5,24(sp)
800000a4:       30778063                beq     a5,t2,800003a4 <fib+0x394>
800000a8:       00812783                lw      a5,8(sp)
800000ac:       ffca8f13                addi    t5,s5,-4
800000b0:       ffea8f93                addi    t6,s5,-2
800000b4:       ffe7f793                andi    a5,a5,-2
800000b8:       40ff07b3                sub     a5,t5,a5
800000bc:       00000493                li      s1,0
800000c0:       01f12e23                sw      t6,28(sp)
800000c4:       02f12023                sw      a5,32(sp)
800000c8:       00048293                mv      t0,s1
800000cc:       000f8a13                mv      s4,t6
800000d0:       1e7f8463                beq     t6,t2,800002b8 <fib+0x2a8>
800000d4:       ffff8793                addi    a5,t6,-1
800000d8:       00000913                li      s2,0
800000dc:       02512c23                sw      t0,56(sp)
800000e0:       00f12a23                sw      a5,20(sp)
800000e4:       ffdf8e93                addi    t4,t6,-3
800000e8:       03e12a23                sw      t5,52(sp)
800000ec:       00090293                mv      t0,s2
800000f0:       01412783                lw      a5,20(sp)
800000f4:       2a778263                beq     a5,t2,80000398 <fib+0x388>
800000f8:       ffea0f13                addi    t5,s4,-2
800000fc:       ffeef713                andi    a4,t4,-2
80000100:       ffca0a13                addi    s4,s4,-4
80000104:       40ea0733                sub     a4,s4,a4
80000108:       000f0993                mv      s3,t5
8000010c:       00000d13                li      s10,0
80000110:       00070d93                mv      s11,a4
80000114:       00098793                mv      a5,s3
80000118:       14798c63                beq     s3,t2,80000270 <fib+0x260>
8000011c:       fff98713                addi    a4,s3,-1
80000120:       ffd98913                addi    s2,s3,-3
80000124:       00000c93                li      s9,0
80000128:       24770c63                beq     a4,t2,80000380 <fib+0x370>
8000012c:       ffe78c13                addi    s8,a5,-2
80000130:       ffa78513                addi    a0,a5,-6
80000134:       ffe97693                andi    a3,s2,-2
80000138:       ffc78613                addi    a2,a5,-4
8000013c:       ffb78493                addi    s1,a5,-5
80000140:       000c0593                mv      a1,s8
80000144:       40d507b3                sub     a5,a0,a3
80000148:       00090893                mv      a7,s2
8000014c:       00000813                li      a6,0
80000150:       00058693                mv      a3,a1
80000154:       0e758063                beq     a1,t2,80000234 <fib+0x224>
80000158:       000c0313                mv      t1,s8
8000015c:       00048b13                mv      s6,s1
80000160:       00088a93                mv      s5,a7
80000164:       00000b93                li      s7,0
80000168:       00048c13                mv      s8,s1
8000016c:       227a8063                beq     s5,t2,8000038c <fib+0x37c>
80000170:       ffe68493                addi    s1,a3,-2
80000174:       ffeb7513                andi    a0,s6,-2
80000178:       ffc68693                addi    a3,a3,-4
8000017c:       40a68433                sub     s0,a3,a0
80000180:       00048e13                mv      t3,s1
80000184:       00000693                li      a3,0
80000188:       000e0513                mv      a0,t3
8000018c:       06612623                sw      t1,108(sp)
80000190:       07e12423                sw      t5,104(sp)
80000194:       07112223                sw      a7,100(sp)
80000198:       06b12023                sw      a1,96(sp)
8000019c:       04c12e23                sw      a2,92(sp)
800001a0:       04f12c23                sw      a5,88(sp)
800001a4:       04e12a23                sw      a4,84(sp)
800001a8:       04d12823                sw      a3,80(sp)
800001ac:       05012623                sw      a6,76(sp)
800001b0:       04512423                sw      t0,72(sp)
800001b4:       05f12223                sw      t6,68(sp)
800001b8:       05d12023                sw      t4,64(sp)
800001bc:       03c12e23                sw      t3,60(sp)
800001c0:       e51ff0ef                jal     ra,80000010 <fib>
800001c4:       03c12e03                lw      t3,60(sp)
800001c8:       05012683                lw      a3,80(sp)
800001cc:       04012e83                lw      t4,64(sp)
800001d0:       ffee0e13                addi    t3,t3,-2
800001d4:       04412f83                lw      t6,68(sp)
800001d8:       04812283                lw      t0,72(sp)
800001dc:       04c12803                lw      a6,76(sp)
800001e0:       05412703                lw      a4,84(sp)
800001e4:       05812783                lw      a5,88(sp)
800001e8:       05c12603                lw      a2,92(sp)
800001ec:       06012583                lw      a1,96(sp)
800001f0:       06412883                lw      a7,100(sp)
800001f4:       06812f03                lw      t5,104(sp)
800001f8:       06c12303                lw      t1,108(sp)
800001fc:       00a686b3                add     a3,a3,a0
80000200:       00100393                li      t2,1
80000204:       f9c412e3                bne     s0,t3,80000188 <fib+0x178>
80000208:       001b7513                andi    a0,s6,1
8000020c:       00d50533                add     a0,a0,a3
80000210:       00048693                mv      a3,s1
80000214:       00ab8bb3                add     s7,s7,a0
80000218:       ffea8a93                addi    s5,s5,-2
8000021c:       ffeb0b13                addi    s6,s6,-2
80000220:       f493c6e3                blt     t2,s1,8000016c <fib+0x15c>
80000224:       00167693                andi    a3,a2,1
80000228:       000c0493                mv      s1,s8
8000022c:       017686b3                add     a3,a3,s7
80000230:       00030c13                mv      s8,t1
80000234:       ffe60613                addi    a2,a2,-2
80000238:       00d80833                add     a6,a6,a3
8000023c:       ffe88893                addi    a7,a7,-2
80000240:       ffe58593                addi    a1,a1,-2
80000244:       ffe48493                addi    s1,s1,-2
80000248:       f0c794e3                bne     a5,a2,80000150 <fib+0x140>
8000024c:       00197693                andi    a3,s2,1
80000250:       010686b3                add     a3,a3,a6
80000254:       000c0793                mv      a5,s8
80000258:       00dc8cb3                add     s9,s9,a3
8000025c:       ffe70713                addi    a4,a4,-2
80000260:       ffe90913                addi    s2,s2,-2
80000264:       ed83c2e3                blt     t2,s8,80000128 <fib+0x118>
80000268:       001a7793                andi    a5,s4,1
8000026c:       019787b3                add     a5,a5,s9
80000270:       ffe98993                addi    s3,s3,-2
80000274:       00fd0d33                add     s10,s10,a5
80000278:       ffea0a13                addi    s4,s4,-2
8000027c:       e93d9ce3                bne     s11,s3,80000114 <fib+0x104>
80000280:       001ef793                andi    a5,t4,1
80000284:       01a787b3                add     a5,a5,s10
80000288:       00f282b3                add     t0,t0,a5
8000028c:       01412783                lw      a5,20(sp)
80000290:       000f0a13                mv      s4,t5
80000294:       ffee8e93                addi    t4,t4,-2
80000298:       ffe78793                addi    a5,a5,-2
8000029c:       00f12a23                sw      a5,20(sp)
800002a0:       e5e3c8e3                blt     t2,t5,800000f0 <fib+0xe0>
800002a4:       03412f03                lw      t5,52(sp)
800002a8:       00028913                mv      s2,t0
800002ac:       03812283                lw      t0,56(sp)
800002b0:       001f7a13                andi    s4,t5,1
800002b4:       012a0a33                add     s4,s4,s2
800002b8:       02012783                lw      a5,32(sp)
800002bc:       ffef8f93                addi    t6,t6,-2
800002c0:       014282b3                add     t0,t0,s4
800002c4:       ffef0f13                addi    t5,t5,-2
800002c8:       e0ff92e3                bne     t6,a5,800000cc <fib+0xbc>
800002cc:       00812783                lw      a5,8(sp)
800002d0:       0017f793                andi    a5,a5,1
800002d4:       005787b3                add     a5,a5,t0
800002d8:       01012703                lw      a4,16(sp)
800002dc:       01c12a83                lw      s5,28(sp)
800002e0:       00f707b3                add     a5,a4,a5
800002e4:       00f12823                sw      a5,16(sp)
800002e8:       01812783                lw      a5,24(sp)
800002ec:       ffe78793                addi    a5,a5,-2
800002f0:       00f12c23                sw      a5,24(sp)
800002f4:       00812783                lw      a5,8(sp)
800002f8:       ffe78793                addi    a5,a5,-2
800002fc:       00f12423                sw      a5,8(sp)
80000300:       db53c0e3                blt     t2,s5,800000a0 <fib+0x90>
80000304:       03012283                lw      t0,48(sp)
80000308:       01012783                lw      a5,16(sp)
8000030c:       02c12483                lw      s1,44(sp)
80000310:       0012fa93                andi    s5,t0,1
80000314:       00fa8ab3                add     s5,s5,a5
80000318:       00c12783                lw      a5,12(sp)
8000031c:       ffe48493                addi    s1,s1,-2
80000320:       ffe28293                addi    t0,t0,-2
80000324:       015787b3                add     a5,a5,s5
80000328:       00f12623                sw      a5,12(sp)
8000032c:       02412783                lw      a5,36(sp)
80000330:       d4f496e3                bne     s1,a5,8000007c <fib+0x6c>
80000334:       02812783                lw      a5,40(sp)
80000338:       00c12703                lw      a4,12(sp)
8000033c:       0ac12083                lw      ra,172(sp)
80000340:       0a812403                lw      s0,168(sp)
80000344:       0017f793                andi    a5,a5,1
80000348:       0a412483                lw      s1,164(sp)
8000034c:       0a012903                lw      s2,160(sp)
80000350:       09c12983                lw      s3,156(sp)
80000354:       09812a03                lw      s4,152(sp)
80000358:       09412a83                lw      s5,148(sp)
8000035c:       09012b03                lw      s6,144(sp)
80000360:       08c12b83                lw      s7,140(sp)
80000364:       08812c03                lw      s8,136(sp)
80000368:       08412c83                lw      s9,132(sp)
8000036c:       08012d03                lw      s10,128(sp)
80000370:       07c12d83                lw      s11,124(sp)
80000374:       00e78533                add     a0,a5,a4
80000378:       0b010113                addi    sp,sp,176
8000037c:       00008067                ret
80000380:       00100693                li      a3,1
80000384:       ffe78c13                addi    s8,a5,-2
80000388:       ecdff06f                j       80000254 <fib+0x244>
8000038c:       00100513                li      a0,1
80000390:       ffe68493                addi    s1,a3,-2
80000394:       e7dff06f                j       80000210 <fib+0x200>
80000398:       00100793                li      a5,1
8000039c:       ffea0f13                addi    t5,s4,-2
800003a0:       ee9ff06f                j       80000288 <fib+0x278>
800003a4:       ffea8713                addi    a4,s5,-2
800003a8:       00100793                li      a5,1
800003ac:       00e12e23                sw      a4,28(sp)
800003b0:       f29ff06f                j       800002d8 <fib+0x2c8>
800003b4:       00008067                ret

800003b8 <main>:
800003b8:       fe010113                addi    sp,sp,-32
800003bc:       00912a23                sw      s1,20(sp)
800003c0:       01212823                sw      s2,16(sp)
800003c4:       01312623                sw      s3,12(sp)
800003c8:       00112e23                sw      ra,28(sp)
800003cc:       00812c23                sw      s0,24(sp)
800003d0:       00000493                li      s1,0
800003d4:       00b00993                li      s3,11
800003d8:       00100913                li      s2,1
800003dc:       00148493                addi    s1,s1,1
800003e0:       03348263                beq     s1,s3,80000404 <main+0x4c>
800003e4:       ff248ce3                beq     s1,s2,800003dc <main+0x24>
800003e8:       00048413                mv      s0,s1
800003ec:       fff40513                addi    a0,s0,-1
800003f0:       ffe40413                addi    s0,s0,-2
800003f4:       c1dff0ef                jal     ra,80000010 <fib>
800003f8:       fe894ae3                blt     s2,s0,800003ec <main+0x34>
800003fc:       00148493                addi    s1,s1,1
80000400:       ff3492e3                bne     s1,s3,800003e4 <main+0x2c>
80000404:       01c12083                lw      ra,28(sp)
80000408:       01812403                lw      s0,24(sp)
8000040c:       01412483                lw      s1,20(sp)
80000410:       01012903                lw      s2,16(sp)
80000414:       00c12983                lw      s3,12(sp)
80000418:       00000513                li      a0,0
8000041c:       02010113                addi    sp,sp,32
80000420:       00008067                ret

80000424 <_trm_init>:
80000424:       ff010113                addi    sp,sp,-16
80000428:       00000517                auipc   a0,0x0
8000042c:       01c50513                addi    a0,a0,28 # 80000444 <_etext>
80000430:       00112623                sw      ra,12(sp)
80000434:       f85ff0ef                jal     ra,800003b8 <main>
80000438:       00050513                mv      a0,a0
8000043c:       00100073                ebreak
80000440:       0000006f                j       80000440 <_trm_init+0x1c>

以下是x86-gcc编译出的程序:

00100000 <_start>:
  100000:       bd 00 00 00 00          mov    $0x0,%ebp
  100005:       bc 00 90 10 00          mov    $0x109000,%esp
  10000a:       e8 d9 02 00 00          call   1002e8 <_trm_init>
  10000f:       90                      nop

00100010 <fib>:
  100010:       55                      push   %ebp
  100011:       89 e5                   mov    %esp,%ebp
  100013:       57                      push   %edi
  100014:       56                      push   %esi
  100015:       53                      push   %ebx
  100016:       83 ec 6c                sub    $0x6c,%esp
  100019:       83 7d 08 01             cmpl   $0x1,0x8(%ebp)
  10001d:       0f 8e 1a 02 00 00       jle    10023d <fib+0x22d>
  100023:       8b 45 08                mov    0x8(%ebp),%eax
  100026:       83 e8 03                sub    $0x3,%eax
  100029:       89 45 b0                mov    %eax,-0x50(%ebp)
  10002c:       8b 55 08                mov    0x8(%ebp),%edx
  10002f:       c7 45 ac 00 00 00 00    movl   $0x0,-0x54(%ebp)
  100036:       83 fa 02                cmp    $0x2,%edx
  100039:       0f 84 4e 02 00 00       je     10028d <fib+0x27d>
  10003f:       8d 42 fe                lea    -0x2(%edx),%eax
  100042:       89 45 9c                mov    %eax,-0x64(%ebp)
  100045:       89 45 c4                mov    %eax,-0x3c(%ebp)
  100048:       83 ea 04                sub    $0x4,%edx
  10004b:       8b 45 b0                mov    -0x50(%ebp),%eax
  10004e:       83 e0 fe                and    $0xfffffffe,%eax
  100051:       29 c2                   sub    %eax,%edx
  100053:       89 55 90                mov    %edx,-0x70(%ebp)
  100056:       c7 45 a8 00 00 00 00    movl   $0x0,-0x58(%ebp)
  10005d:       8b 55 c4                mov    -0x3c(%ebp),%edx
  100060:       83 fa 01                cmp    $0x1,%edx
  100063:       0f 84 1a 02 00 00       je     100283 <fib+0x273>
  100069:       8b 45 c4                mov    -0x3c(%ebp),%eax
  10006c:       83 e8 03                sub    $0x3,%eax
  10006f:       89 45 b4                mov    %eax,-0x4c(%ebp)
  100072:       c7 45 a4 00 00 00 00    movl   $0x0,-0x5c(%ebp)
  100079:       83 fa 02                cmp    $0x2,%edx
  10007c:       0f 84 f0 01 00 00       je     100272 <fib+0x262>
  100082:       8d 42 fe                lea    -0x2(%edx),%eax
  100085:       89 45 98                mov    %eax,-0x68(%ebp)
  100088:       89 45 c0                mov    %eax,-0x40(%ebp)
  10008b:       83 ea 04                sub    $0x4,%edx
  10008e:       8b 45 b4                mov    -0x4c(%ebp),%eax
  100091:       83 e0 fe                and    $0xfffffffe,%eax
  100094:       29 c2                   sub    %eax,%edx
  100096:       89 55 94                mov    %edx,-0x6c(%ebp)
  100099:       c7 45 a0 00 00 00 00    movl   $0x0,-0x60(%ebp)
  1000a0:       8b 4d c0                mov    -0x40(%ebp),%ecx
  1000a3:       83 f9 01                cmp    $0x1,%ecx
  1000a6:       0f 84 bc 01 00 00       je     100268 <fib+0x258>
  1000ac:       8b 45 c0                mov    -0x40(%ebp),%eax
  1000af:       83 e8 03                sub    $0x3,%eax
  1000b2:       89 45 e4                mov    %eax,-0x1c(%ebp)
  1000b5:       c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%ebp)
  1000bc:       83 f9 02                cmp    $0x2,%ecx
  1000bf:       0f 84 99 01 00 00       je     10025e <fib+0x24e>
  1000c5:       8d 71 fc                lea    -0x4(%ecx),%esi
  1000c8:       8d 51 fa                lea    -0x6(%ecx),%edx
  1000cb:       8b 45 e4                mov    -0x1c(%ebp),%eax
  1000ce:       83 e0 fe                and    $0xfffffffe,%eax
  1000d1:       29 c2                   sub    %eax,%edx
  1000d3:       89 55 b8                mov    %edx,-0x48(%ebp)
  1000d6:       c7 45 e0 00 00 00 00    movl   $0x0,-0x20(%ebp)
  1000dd:       89 4d c8                mov    %ecx,-0x38(%ebp)
  1000e0:       89 f1                   mov    %esi,%ecx
  1000e2:       8d 79 02                lea    0x2(%ecx),%edi
  1000e5:       83 f9 ff                cmp    $0xffffffff,%ecx
  1000e8:       0f 84 a1 00 00 00       je     10018f <fib+0x17f>
  1000ee:       8d 41 ff                lea    -0x1(%ecx),%eax
  1000f1:       89 45 dc                mov    %eax,-0x24(%ebp)
  1000f4:       89 4d d0                mov    %ecx,-0x30(%ebp)
  1000f7:       c7 45 d8 00 00 00 00    movl   $0x0,-0x28(%ebp)
  1000fe:       83 ff 02                cmp    $0x2,%edi
  100101:       0f 84 41 01 00 00       je     100248 <fib+0x238>
  100107:       8d 57 fc                lea    -0x4(%edi),%edx
  10010a:       8b 45 dc                mov    -0x24(%ebp),%eax
  10010d:       83 e0 fe                and    $0xfffffffe,%eax
  100110:       29 c2                   sub    %eax,%edx
  100112:       89 55 cc                mov    %edx,-0x34(%ebp)
  100115:       8b 5d d0                mov    -0x30(%ebp),%ebx
  100118:       31 d2                   xor    %edx,%edx
  10011a:       89 de                   mov    %ebx,%esi
  10011c:       83 fb 01                cmp    $0x1,%ebx
  10011f:       0f 84 2f 01 00 00       je     100254 <fib+0x244>
  100125:       c7 45 bc 00 00 00 00    movl   $0x0,-0x44(%ebp)
  10012c:       89 4d 88                mov    %ecx,-0x78(%ebp)
  10012f:       89 55 8c                mov    %edx,-0x74(%ebp)
  100132:       83 ec 0c                sub    $0xc,%esp
  100135:       8d 46 ff                lea    -0x1(%esi),%eax
  100138:       50                      push   %eax
  100139:       e8 d2 fe ff ff          call   100010 <fib>
  10013e:       83 c4 10                add    $0x10,%esp
  100141:       83 ee 02                sub    $0x2,%esi
  100144:       01 45 bc                add    %eax,-0x44(%ebp)
  100147:       83 fe 01                cmp    $0x1,%esi
  10014a:       8b 55 8c                mov    -0x74(%ebp),%edx
  10014d:       8b 4d 88                mov    -0x78(%ebp),%ecx
  100150:       7f da                   jg     10012c <fib+0x11c>
  100152:       8d 43 fe                lea    -0x2(%ebx),%eax
  100155:       83 e3 01                and    $0x1,%ebx
  100158:       8b 75 bc                mov    -0x44(%ebp),%esi
  10015b:       01 de                   add    %ebx,%esi
  10015d:       01 f2                   add    %esi,%edx
  10015f:       89 c3                   mov    %eax,%ebx
  100161:       39 45 cc                cmp    %eax,-0x34(%ebp)
  100164:       75 b4                   jne    10011a <fib+0x10a>
  100166:       8b 45 dc                mov    -0x24(%ebp),%eax
  100169:       83 e0 01                and    $0x1,%eax
  10016c:       01 d0                   add    %edx,%eax
  10016e:       83 ef 02                sub    $0x2,%edi
  100171:       01 45 d8                add    %eax,-0x28(%ebp)
  100174:       83 6d d0 02             subl   $0x2,-0x30(%ebp)
  100178:       83 6d dc 02             subl   $0x2,-0x24(%ebp)
  10017c:       83 ff 01                cmp    $0x1,%edi
  10017f:       0f 8f 79 ff ff ff       jg     1000fe <fib+0xee>
  100185:       89 c8                   mov    %ecx,%eax
  100187:       83 e0 01                and    $0x1,%eax
  10018a:       8b 7d d8                mov    -0x28(%ebp),%edi
  10018d:       01 c7                   add    %eax,%edi
  10018f:       01 7d e0                add    %edi,-0x20(%ebp)
  100192:       83 e9 02                sub    $0x2,%ecx
  100195:       39 4d b8                cmp    %ecx,-0x48(%ebp)
  100198:       0f 85 44 ff ff ff       jne    1000e2 <fib+0xd2>
  10019e:       8b 4d c8                mov    -0x38(%ebp),%ecx
  1001a1:       8b 45 e4                mov    -0x1c(%ebp),%eax
  1001a4:       83 e0 01                and    $0x1,%eax
  1001a7:       03 45 e0                add    -0x20(%ebp),%eax
  1001aa:       83 e9 02                sub    $0x2,%ecx
  1001ad:       01 45 d4                add    %eax,-0x2c(%ebp)
  1001b0:       83 6d e4 02             subl   $0x2,-0x1c(%ebp)
  1001b4:       83 f9 01                cmp    $0x1,%ecx
  1001b7:       0f 8f ff fe ff ff       jg     1000bc <fib+0xac>
  1001bd:       8b 5d c0                mov    -0x40(%ebp),%ebx
  1001c0:       8d 43 fe                lea    -0x2(%ebx),%eax
  1001c3:       83 e3 01                and    $0x1,%ebx
  1001c6:       8b 4d d4                mov    -0x2c(%ebp),%ecx
  1001c9:       01 d9                   add    %ebx,%ecx
  1001cb:       01 4d a0                add    %ecx,-0x60(%ebp)
  1001ce:       89 45 c0                mov    %eax,-0x40(%ebp)
  1001d1:       39 45 94                cmp    %eax,-0x6c(%ebp)
  1001d4:       0f 85 c6 fe ff ff       jne    1000a0 <fib+0x90>
  1001da:       8b 45 b4                mov    -0x4c(%ebp),%eax
  1001dd:       83 e0 01                and    $0x1,%eax
  1001e0:       03 45 a0                add    -0x60(%ebp),%eax
  1001e3:       8b 55 98                mov    -0x68(%ebp),%edx
  1001e6:       01 45 a4                add    %eax,-0x5c(%ebp)
  1001e9:       83 6d b4 02             subl   $0x2,-0x4c(%ebp)
  1001ed:       83 fa 01                cmp    $0x1,%edx
  1001f0:       0f 8f 83 fe ff ff       jg     100079 <fib+0x69>
  1001f6:       8b 5d c4                mov    -0x3c(%ebp),%ebx
  1001f9:       8d 43 fe                lea    -0x2(%ebx),%eax
  1001fc:       83 e3 01                and    $0x1,%ebx
  1001ff:       8b 55 a4                mov    -0x5c(%ebp),%edx
  100202:       01 da                   add    %ebx,%edx
  100204:       01 55 a8                add    %edx,-0x58(%ebp)
  100207:       89 45 c4                mov    %eax,-0x3c(%ebp)
  10020a:       8b 7d 90                mov    -0x70(%ebp),%edi
  10020d:       39 f8                   cmp    %edi,%eax
  10020f:       0f 85 48 fe ff ff       jne    10005d <fib+0x4d>
  100215:       8b 45 b0                mov    -0x50(%ebp),%eax
  100218:       83 e0 01                and    $0x1,%eax
  10021b:       03 45 a8                add    -0x58(%ebp),%eax
  10021e:       8b 55 9c                mov    -0x64(%ebp),%edx
  100221:       01 45 ac                add    %eax,-0x54(%ebp)
  100224:       83 6d b0 02             subl   $0x2,-0x50(%ebp)
  100228:       83 fa 01                cmp    $0x1,%edx
  10022b:       0f 8f 05 fe ff ff       jg     100036 <fib+0x26>
  100231:       8b 45 08                mov    0x8(%ebp),%eax
  100234:       83 e0 01                and    $0x1,%eax
  100237:       03 45 ac                add    -0x54(%ebp),%eax
  10023a:       89 45 08                mov    %eax,0x8(%ebp)
  10023d:       8b 45 08                mov    0x8(%ebp),%eax
  100240:       8d 65 f4                lea    -0xc(%ebp),%esp
  100243:       5b                      pop    %ebx
  100244:       5e                      pop    %esi
  100245:       5f                      pop    %edi
  100246:       5d                      pop    %ebp
  100247:       c3                      ret
  100248:       b8 01 00 00 00          mov    $0x1,%eax
  10024d:       e9 1c ff ff ff          jmp    10016e <fib+0x15e>
  100252:       66 90                   xchg   %ax,%ax
  100254:       b8 ff ff ff ff          mov    $0xffffffff,%eax
  100259:       e9 ff fe ff ff          jmp    10015d <fib+0x14d>
  10025e:       b8 01 00 00 00          mov    $0x1,%eax
  100263:       e9 42 ff ff ff          jmp    1001aa <fib+0x19a>
  100268:       b8 ff ff ff ff          mov    $0xffffffff,%eax
  10026d:       e9 59 ff ff ff          jmp    1001cb <fib+0x1bb>
  100272:       b8 01 00 00 00          mov    $0x1,%eax
  100277:       c7 45 98 00 00 00 00    movl   $0x0,-0x68(%ebp)
  10027e:       e9 60 ff ff ff          jmp    1001e3 <fib+0x1d3>
  100283:       b8 ff ff ff ff          mov    $0xffffffff,%eax
  100288:       e9 77 ff ff ff          jmp    100204 <fib+0x1f4>
  10028d:       b8 01 00 00 00          mov    $0x1,%eax
  100292:       c7 45 9c 00 00 00 00    movl   $0x0,-0x64(%ebp)
  100299:       eb 83                   jmp    10021e <fib+0x20e>
  10029b:       90                      nop

0010029c <main>:
  10029c:       8d 4c 24 04             lea    0x4(%esp),%ecx
  1002a0:       83 e4 f0                and    $0xfffffff0,%esp
  1002a3:       ff 71 fc                push   -0x4(%ecx)
  1002a6:       55                      push   %ebp
  1002a7:       89 e5                   mov    %esp,%ebp
  1002a9:       56                      push   %esi
  1002aa:       53                      push   %ebx
  1002ab:       51                      push   %ecx
  1002ac:       83 ec 0c                sub    $0xc,%esp
  1002af:       31 f6                   xor    %esi,%esi
  1002b1:       46                      inc    %esi
  1002b2:       83 fe 0b                cmp    $0xb,%esi
  1002b5:       74 24                   je     1002db <main+0x3f>
  1002b7:       83 fe 01                cmp    $0x1,%esi
  1002ba:       74 f5                   je     1002b1 <main+0x15>
  1002bc:       89 f3                   mov    %esi,%ebx
  1002be:       83 ec 0c                sub    $0xc,%esp
  1002c1:       8d 43 ff                lea    -0x1(%ebx),%eax
  1002c4:       50                      push   %eax
  1002c5:       e8 46 fd ff ff          call   100010 <fib>
  1002ca:       83 c4 10                add    $0x10,%esp
  1002cd:       83 eb 02                sub    $0x2,%ebx
  1002d0:       83 fb 01                cmp    $0x1,%ebx
  1002d3:       7f e9                   jg     1002be <main+0x22>
  1002d5:       46                      inc    %esi
  1002d6:       83 fe 0b                cmp    $0xb,%esi
  1002d9:       75 dc                   jne    1002b7 <main+0x1b>
  1002db:       31 c0                   xor    %eax,%eax
  1002dd:       8d 65 f4                lea    -0xc(%ebp),%esp
  1002e0:       59                      pop    %ecx
  1002e1:       5b                      pop    %ebx
  1002e2:       5e                      pop    %esi
  1002e3:       5d                      pop    %ebp
  1002e4:       8d 61 fc                lea    -0x4(%ecx),%esp
  1002e7:       c3                      ret

001002e8 <_trm_init>:
  1002e8:       55                      push   %ebp
  1002e9:       89 e5                   mov    %esp,%ebp
  1002eb:       83 ec 14                sub    $0x14,%esp
  1002ee:       68 00 03 10 00          push   $0x100300
  1002f3:       e8 a4 ff ff ff          call   10029c <main>
  1002f8:       cc                      int3
  1002f9:       83 c4 10                add    $0x10,%esp
  1002fc:       eb fe                   jmp    1002fc <_trm_init+0x14>

Now you see.

Tags: work cs