从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

← 返回