从0开始做PA-Day05

By ten of hearts

← 返回

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

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

More on Programs

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

Program(程序)

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

 1int main()
 2{
 3    int a = 1, b = 0, tmp = 0;
 4    for (int i = 1; i <= 10; i++)
 5    {
 6        tmp = a;
 7        a = a + b;
 8        b = tmp;
 9    }
10}

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

原因见Appendix

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

Compiler(编译器)

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

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

 1# 内存地址       二进制指令                汇编代码
 2
 380000000 <_start>:
 480000000:       00000413                li      s0,0
 580000004:       00009117                auipc   sp,0x9
 680000008:       ffc10113                addi    sp,sp,-4 # 80009000 <_end>
 78000000c:       00c000ef                jal     ra,80000018 <_trm_init>
 8
 980000010 <main>:
1080000010:       00000513                li      a0,0
1180000014:       00008067                ret
12
1380000018 <_trm_init>:
1480000018:       ff010113                addi    sp,sp,-16
158000001c:       00000517                auipc   a0,0x0
1680000020:       01c50513                addi    a0,a0,28 # 80000038 <_etext>
1780000024:       00112623                sw      ra,12(sp)
1880000028:       fe9ff0ef                jal     ra,80000010 <main>
198000002c:       00050513                mv      a0,a0
2080000030:       00100073                ebreak
2180000034:       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进行编译, 会得到这样的二进制文件:

 100100000 <_start>:
 2  100000:       bd 00 00 00 00          mov    $0x0,%ebp
 3  100005:       bc 00 90 10 00          mov    $0x109000,%esp
 4  10000a:       e8 05 00 00 00          call   100014 <_trm_init>
 5  10000f:       90                      nop
 6
 700100010 <main>:
 8  100010:       31 c0                   xor    %eax,%eax
 9  100012:       c3                      ret
10  100013:       90                      nop
11
1200100014 <_trm_init>:
13  100014:       55                      push   %ebp
14  100015:       89 e5                   mov    %esp,%ebp
15  100017:       83 ec 14                sub    $0x14,%esp
16  10001a:       68 40 00 10 00          push   $0x100040
17  10001f:       e8 ec ff ff ff          call   100010 <main>
18  100024:       cc                      int3
19  100025:       83 c4 10                add    $0x10,%esp
20  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数列算法.

 1int fib(int n)
 2{
 3    if (n <= 1)
 4    {
 5        return n;
 6    }
 7    else
 8    {
 9        return fib(n-1) + fib(n-2);
10    }
11}
12
13int main()
14{
15    for (int i = 0; i <= 10; i++)
16    {
17        fib(i);
18    }
19    return 0;
20}

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

  180000000 <_start>:
  280000000:       00000413                li      s0,0
  380000004:       00009117                auipc   sp,0x9
  480000008:       ffc10113                addi    sp,sp,-4 # 80009000 <_end>
  58000000c:       418000ef                jal     ra,80000424 <_trm_init>
  6
  780000010 <fib>:
  880000010:       00100793                li      a5,1
  980000014:       3aa7d063                bge     a5,a0,800003b4 <fib+0x3a4>
 1080000018:       f5010113                addi    sp,sp,-176
 118000001c:       ffe50793                addi    a5,a0,-2
 1280000020:       0a912223                sw      s1,164(sp)
 1380000024:       02f12423                sw      a5,40(sp)
 1480000028:       ffd50493                addi    s1,a0,-3
 158000002c:       ffe7f793                andi    a5,a5,-2
 1680000030:       40f487b3                sub     a5,s1,a5
 1780000034:       fff50f93                addi    t6,a0,-1
 1880000038:       00048293                mv      t0,s1
 198000003c:       0a112623                sw      ra,172(sp)
 2080000040:       0a812423                sw      s0,168(sp)
 2180000044:       0b212023                sw      s2,160(sp)
 2280000048:       09312e23                sw      s3,156(sp)
 238000004c:       09412c23                sw      s4,152(sp)
 2480000050:       09512a23                sw      s5,148(sp)
 2580000054:       09612823                sw      s6,144(sp)
 2680000058:       09712623                sw      s7,140(sp)
 278000005c:       09812423                sw      s8,136(sp)
 2880000060:       09912223                sw      s9,132(sp)
 2980000064:       09a12023                sw      s10,128(sp)
 3080000068:       07b12e23                sw      s11,124(sp)
 318000006c:       02f12223                sw      a5,36(sp)
 3280000070:       00012623                sw      zero,12(sp)
 3380000074:       00100393                li      t2,1
 3480000078:       000f8493                mv      s1,t6
 358000007c:       00048a93                mv      s5,s1
 3680000080:       28748c63                beq     s1,t2,80000318 <fib+0x308>
 3780000084:       fff48793                addi    a5,s1,-1
 3880000088:       00f12c23                sw      a5,24(sp)
 398000008c:       ffd48793                addi    a5,s1,-3
 4080000090:       00f12423                sw      a5,8(sp)
 4180000094:       00012823                sw      zero,16(sp)
 4280000098:       02912623                sw      s1,44(sp)
 438000009c:       02512823                sw      t0,48(sp)
 44800000a0:       01812783                lw      a5,24(sp)
 45800000a4:       30778063                beq     a5,t2,800003a4 <fib+0x394>
 46800000a8:       00812783                lw      a5,8(sp)
 47800000ac:       ffca8f13                addi    t5,s5,-4
 48800000b0:       ffea8f93                addi    t6,s5,-2
 49800000b4:       ffe7f793                andi    a5,a5,-2
 50800000b8:       40ff07b3                sub     a5,t5,a5
 51800000bc:       00000493                li      s1,0
 52800000c0:       01f12e23                sw      t6,28(sp)
 53800000c4:       02f12023                sw      a5,32(sp)
 54800000c8:       00048293                mv      t0,s1
 55800000cc:       000f8a13                mv      s4,t6
 56800000d0:       1e7f8463                beq     t6,t2,800002b8 <fib+0x2a8>
 57800000d4:       ffff8793                addi    a5,t6,-1
 58800000d8:       00000913                li      s2,0
 59800000dc:       02512c23                sw      t0,56(sp)
 60800000e0:       00f12a23                sw      a5,20(sp)
 61800000e4:       ffdf8e93                addi    t4,t6,-3
 62800000e8:       03e12a23                sw      t5,52(sp)
 63800000ec:       00090293                mv      t0,s2
 64800000f0:       01412783                lw      a5,20(sp)
 65800000f4:       2a778263                beq     a5,t2,80000398 <fib+0x388>
 66800000f8:       ffea0f13                addi    t5,s4,-2
 67800000fc:       ffeef713                andi    a4,t4,-2
 6880000100:       ffca0a13                addi    s4,s4,-4
 6980000104:       40ea0733                sub     a4,s4,a4
 7080000108:       000f0993                mv      s3,t5
 718000010c:       00000d13                li      s10,0
 7280000110:       00070d93                mv      s11,a4
 7380000114:       00098793                mv      a5,s3
 7480000118:       14798c63                beq     s3,t2,80000270 <fib+0x260>
 758000011c:       fff98713                addi    a4,s3,-1
 7680000120:       ffd98913                addi    s2,s3,-3
 7780000124:       00000c93                li      s9,0
 7880000128:       24770c63                beq     a4,t2,80000380 <fib+0x370>
 798000012c:       ffe78c13                addi    s8,a5,-2
 8080000130:       ffa78513                addi    a0,a5,-6
 8180000134:       ffe97693                andi    a3,s2,-2
 8280000138:       ffc78613                addi    a2,a5,-4
 838000013c:       ffb78493                addi    s1,a5,-5
 8480000140:       000c0593                mv      a1,s8
 8580000144:       40d507b3                sub     a5,a0,a3
 8680000148:       00090893                mv      a7,s2
 878000014c:       00000813                li      a6,0
 8880000150:       00058693                mv      a3,a1
 8980000154:       0e758063                beq     a1,t2,80000234 <fib+0x224>
 9080000158:       000c0313                mv      t1,s8
 918000015c:       00048b13                mv      s6,s1
 9280000160:       00088a93                mv      s5,a7
 9380000164:       00000b93                li      s7,0
 9480000168:       00048c13                mv      s8,s1
 958000016c:       227a8063                beq     s5,t2,8000038c <fib+0x37c>
 9680000170:       ffe68493                addi    s1,a3,-2
 9780000174:       ffeb7513                andi    a0,s6,-2
 9880000178:       ffc68693                addi    a3,a3,-4
 998000017c:       40a68433                sub     s0,a3,a0
10080000180:       00048e13                mv      t3,s1
10180000184:       00000693                li      a3,0
10280000188:       000e0513                mv      a0,t3
1038000018c:       06612623                sw      t1,108(sp)
10480000190:       07e12423                sw      t5,104(sp)
10580000194:       07112223                sw      a7,100(sp)
10680000198:       06b12023                sw      a1,96(sp)
1078000019c:       04c12e23                sw      a2,92(sp)
108800001a0:       04f12c23                sw      a5,88(sp)
109800001a4:       04e12a23                sw      a4,84(sp)
110800001a8:       04d12823                sw      a3,80(sp)
111800001ac:       05012623                sw      a6,76(sp)
112800001b0:       04512423                sw      t0,72(sp)
113800001b4:       05f12223                sw      t6,68(sp)
114800001b8:       05d12023                sw      t4,64(sp)
115800001bc:       03c12e23                sw      t3,60(sp)
116800001c0:       e51ff0ef                jal     ra,80000010 <fib>
117800001c4:       03c12e03                lw      t3,60(sp)
118800001c8:       05012683                lw      a3,80(sp)
119800001cc:       04012e83                lw      t4,64(sp)
120800001d0:       ffee0e13                addi    t3,t3,-2
121800001d4:       04412f83                lw      t6,68(sp)
122800001d8:       04812283                lw      t0,72(sp)
123800001dc:       04c12803                lw      a6,76(sp)
124800001e0:       05412703                lw      a4,84(sp)
125800001e4:       05812783                lw      a5,88(sp)
126800001e8:       05c12603                lw      a2,92(sp)
127800001ec:       06012583                lw      a1,96(sp)
128800001f0:       06412883                lw      a7,100(sp)
129800001f4:       06812f03                lw      t5,104(sp)
130800001f8:       06c12303                lw      t1,108(sp)
131800001fc:       00a686b3                add     a3,a3,a0
13280000200:       00100393                li      t2,1
13380000204:       f9c412e3                bne     s0,t3,80000188 <fib+0x178>
13480000208:       001b7513                andi    a0,s6,1
1358000020c:       00d50533                add     a0,a0,a3
13680000210:       00048693                mv      a3,s1
13780000214:       00ab8bb3                add     s7,s7,a0
13880000218:       ffea8a93                addi    s5,s5,-2
1398000021c:       ffeb0b13                addi    s6,s6,-2
14080000220:       f493c6e3                blt     t2,s1,8000016c <fib+0x15c>
14180000224:       00167693                andi    a3,a2,1
14280000228:       000c0493                mv      s1,s8
1438000022c:       017686b3                add     a3,a3,s7
14480000230:       00030c13                mv      s8,t1
14580000234:       ffe60613                addi    a2,a2,-2
14680000238:       00d80833                add     a6,a6,a3
1478000023c:       ffe88893                addi    a7,a7,-2
14880000240:       ffe58593                addi    a1,a1,-2
14980000244:       ffe48493                addi    s1,s1,-2
15080000248:       f0c794e3                bne     a5,a2,80000150 <fib+0x140>
1518000024c:       00197693                andi    a3,s2,1
15280000250:       010686b3                add     a3,a3,a6
15380000254:       000c0793                mv      a5,s8
15480000258:       00dc8cb3                add     s9,s9,a3
1558000025c:       ffe70713                addi    a4,a4,-2
15680000260:       ffe90913                addi    s2,s2,-2
15780000264:       ed83c2e3                blt     t2,s8,80000128 <fib+0x118>
15880000268:       001a7793                andi    a5,s4,1
1598000026c:       019787b3                add     a5,a5,s9
16080000270:       ffe98993                addi    s3,s3,-2
16180000274:       00fd0d33                add     s10,s10,a5
16280000278:       ffea0a13                addi    s4,s4,-2
1638000027c:       e93d9ce3                bne     s11,s3,80000114 <fib+0x104>
16480000280:       001ef793                andi    a5,t4,1
16580000284:       01a787b3                add     a5,a5,s10
16680000288:       00f282b3                add     t0,t0,a5
1678000028c:       01412783                lw      a5,20(sp)
16880000290:       000f0a13                mv      s4,t5
16980000294:       ffee8e93                addi    t4,t4,-2
17080000298:       ffe78793                addi    a5,a5,-2
1718000029c:       00f12a23                sw      a5,20(sp)
172800002a0:       e5e3c8e3                blt     t2,t5,800000f0 <fib+0xe0>
173800002a4:       03412f03                lw      t5,52(sp)
174800002a8:       00028913                mv      s2,t0
175800002ac:       03812283                lw      t0,56(sp)
176800002b0:       001f7a13                andi    s4,t5,1
177800002b4:       012a0a33                add     s4,s4,s2
178800002b8:       02012783                lw      a5,32(sp)
179800002bc:       ffef8f93                addi    t6,t6,-2
180800002c0:       014282b3                add     t0,t0,s4
181800002c4:       ffef0f13                addi    t5,t5,-2
182800002c8:       e0ff92e3                bne     t6,a5,800000cc <fib+0xbc>
183800002cc:       00812783                lw      a5,8(sp)
184800002d0:       0017f793                andi    a5,a5,1
185800002d4:       005787b3                add     a5,a5,t0
186800002d8:       01012703                lw      a4,16(sp)
187800002dc:       01c12a83                lw      s5,28(sp)
188800002e0:       00f707b3                add     a5,a4,a5
189800002e4:       00f12823                sw      a5,16(sp)
190800002e8:       01812783                lw      a5,24(sp)
191800002ec:       ffe78793                addi    a5,a5,-2
192800002f0:       00f12c23                sw      a5,24(sp)
193800002f4:       00812783                lw      a5,8(sp)
194800002f8:       ffe78793                addi    a5,a5,-2
195800002fc:       00f12423                sw      a5,8(sp)
19680000300:       db53c0e3                blt     t2,s5,800000a0 <fib+0x90>
19780000304:       03012283                lw      t0,48(sp)
19880000308:       01012783                lw      a5,16(sp)
1998000030c:       02c12483                lw      s1,44(sp)
20080000310:       0012fa93                andi    s5,t0,1
20180000314:       00fa8ab3                add     s5,s5,a5
20280000318:       00c12783                lw      a5,12(sp)
2038000031c:       ffe48493                addi    s1,s1,-2
20480000320:       ffe28293                addi    t0,t0,-2
20580000324:       015787b3                add     a5,a5,s5
20680000328:       00f12623                sw      a5,12(sp)
2078000032c:       02412783                lw      a5,36(sp)
20880000330:       d4f496e3                bne     s1,a5,8000007c <fib+0x6c>
20980000334:       02812783                lw      a5,40(sp)
21080000338:       00c12703                lw      a4,12(sp)
2118000033c:       0ac12083                lw      ra,172(sp)
21280000340:       0a812403                lw      s0,168(sp)
21380000344:       0017f793                andi    a5,a5,1
21480000348:       0a412483                lw      s1,164(sp)
2158000034c:       0a012903                lw      s2,160(sp)
21680000350:       09c12983                lw      s3,156(sp)
21780000354:       09812a03                lw      s4,152(sp)
21880000358:       09412a83                lw      s5,148(sp)
2198000035c:       09012b03                lw      s6,144(sp)
22080000360:       08c12b83                lw      s7,140(sp)
22180000364:       08812c03                lw      s8,136(sp)
22280000368:       08412c83                lw      s9,132(sp)
2238000036c:       08012d03                lw      s10,128(sp)
22480000370:       07c12d83                lw      s11,124(sp)
22580000374:       00e78533                add     a0,a5,a4
22680000378:       0b010113                addi    sp,sp,176
2278000037c:       00008067                ret
22880000380:       00100693                li      a3,1
22980000384:       ffe78c13                addi    s8,a5,-2
23080000388:       ecdff06f                j       80000254 <fib+0x244>
2318000038c:       00100513                li      a0,1
23280000390:       ffe68493                addi    s1,a3,-2
23380000394:       e7dff06f                j       80000210 <fib+0x200>
23480000398:       00100793                li      a5,1
2358000039c:       ffea0f13                addi    t5,s4,-2
236800003a0:       ee9ff06f                j       80000288 <fib+0x278>
237800003a4:       ffea8713                addi    a4,s5,-2
238800003a8:       00100793                li      a5,1
239800003ac:       00e12e23                sw      a4,28(sp)
240800003b0:       f29ff06f                j       800002d8 <fib+0x2c8>
241800003b4:       00008067                ret
242
243800003b8 <main>:
244800003b8:       fe010113                addi    sp,sp,-32
245800003bc:       00912a23                sw      s1,20(sp)
246800003c0:       01212823                sw      s2,16(sp)
247800003c4:       01312623                sw      s3,12(sp)
248800003c8:       00112e23                sw      ra,28(sp)
249800003cc:       00812c23                sw      s0,24(sp)
250800003d0:       00000493                li      s1,0
251800003d4:       00b00993                li      s3,11
252800003d8:       00100913                li      s2,1
253800003dc:       00148493                addi    s1,s1,1
254800003e0:       03348263                beq     s1,s3,80000404 <main+0x4c>
255800003e4:       ff248ce3                beq     s1,s2,800003dc <main+0x24>
256800003e8:       00048413                mv      s0,s1
257800003ec:       fff40513                addi    a0,s0,-1
258800003f0:       ffe40413                addi    s0,s0,-2
259800003f4:       c1dff0ef                jal     ra,80000010 <fib>
260800003f8:       fe894ae3                blt     s2,s0,800003ec <main+0x34>
261800003fc:       00148493                addi    s1,s1,1
26280000400:       ff3492e3                bne     s1,s3,800003e4 <main+0x2c>
26380000404:       01c12083                lw      ra,28(sp)
26480000408:       01812403                lw      s0,24(sp)
2658000040c:       01412483                lw      s1,20(sp)
26680000410:       01012903                lw      s2,16(sp)
26780000414:       00c12983                lw      s3,12(sp)
26880000418:       00000513                li      a0,0
2698000041c:       02010113                addi    sp,sp,32
27080000420:       00008067                ret
271
27280000424 <_trm_init>:
27380000424:       ff010113                addi    sp,sp,-16
27480000428:       00000517                auipc   a0,0x0
2758000042c:       01c50513                addi    a0,a0,28 # 80000444 <_etext>
27680000430:       00112623                sw      ra,12(sp)
27780000434:       f85ff0ef                jal     ra,800003b8 <main>
27880000438:       00050513                mv      a0,a0
2798000043c:       00100073                ebreak
28080000440:       0000006f                j       80000440 <_trm_init+0x1c>

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

  100100000 <_start>:
  2  100000:       bd 00 00 00 00          mov    $0x0,%ebp
  3  100005:       bc 00 90 10 00          mov    $0x109000,%esp
  4  10000a:       e8 d9 02 00 00          call   1002e8 <_trm_init>
  5  10000f:       90                      nop
  6
  700100010 <fib>:
  8  100010:       55                      push   %ebp
  9  100011:       89 e5                   mov    %esp,%ebp
 10  100013:       57                      push   %edi
 11  100014:       56                      push   %esi
 12  100015:       53                      push   %ebx
 13  100016:       83 ec 6c                sub    $0x6c,%esp
 14  100019:       83 7d 08 01             cmpl   $0x1,0x8(%ebp)
 15  10001d:       0f 8e 1a 02 00 00       jle    10023d <fib+0x22d>
 16  100023:       8b 45 08                mov    0x8(%ebp),%eax
 17  100026:       83 e8 03                sub    $0x3,%eax
 18  100029:       89 45 b0                mov    %eax,-0x50(%ebp)
 19  10002c:       8b 55 08                mov    0x8(%ebp),%edx
 20  10002f:       c7 45 ac 00 00 00 00    movl   $0x0,-0x54(%ebp)
 21  100036:       83 fa 02                cmp    $0x2,%edx
 22  100039:       0f 84 4e 02 00 00       je     10028d <fib+0x27d>
 23  10003f:       8d 42 fe                lea    -0x2(%edx),%eax
 24  100042:       89 45 9c                mov    %eax,-0x64(%ebp)
 25  100045:       89 45 c4                mov    %eax,-0x3c(%ebp)
 26  100048:       83 ea 04                sub    $0x4,%edx
 27  10004b:       8b 45 b0                mov    -0x50(%ebp),%eax
 28  10004e:       83 e0 fe                and    $0xfffffffe,%eax
 29  100051:       29 c2                   sub    %eax,%edx
 30  100053:       89 55 90                mov    %edx,-0x70(%ebp)
 31  100056:       c7 45 a8 00 00 00 00    movl   $0x0,-0x58(%ebp)
 32  10005d:       8b 55 c4                mov    -0x3c(%ebp),%edx
 33  100060:       83 fa 01                cmp    $0x1,%edx
 34  100063:       0f 84 1a 02 00 00       je     100283 <fib+0x273>
 35  100069:       8b 45 c4                mov    -0x3c(%ebp),%eax
 36  10006c:       83 e8 03                sub    $0x3,%eax
 37  10006f:       89 45 b4                mov    %eax,-0x4c(%ebp)
 38  100072:       c7 45 a4 00 00 00 00    movl   $0x0,-0x5c(%ebp)
 39  100079:       83 fa 02                cmp    $0x2,%edx
 40  10007c:       0f 84 f0 01 00 00       je     100272 <fib+0x262>
 41  100082:       8d 42 fe                lea    -0x2(%edx),%eax
 42  100085:       89 45 98                mov    %eax,-0x68(%ebp)
 43  100088:       89 45 c0                mov    %eax,-0x40(%ebp)
 44  10008b:       83 ea 04                sub    $0x4,%edx
 45  10008e:       8b 45 b4                mov    -0x4c(%ebp),%eax
 46  100091:       83 e0 fe                and    $0xfffffffe,%eax
 47  100094:       29 c2                   sub    %eax,%edx
 48  100096:       89 55 94                mov    %edx,-0x6c(%ebp)
 49  100099:       c7 45 a0 00 00 00 00    movl   $0x0,-0x60(%ebp)
 50  1000a0:       8b 4d c0                mov    -0x40(%ebp),%ecx
 51  1000a3:       83 f9 01                cmp    $0x1,%ecx
 52  1000a6:       0f 84 bc 01 00 00       je     100268 <fib+0x258>
 53  1000ac:       8b 45 c0                mov    -0x40(%ebp),%eax
 54  1000af:       83 e8 03                sub    $0x3,%eax
 55  1000b2:       89 45 e4                mov    %eax,-0x1c(%ebp)
 56  1000b5:       c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%ebp)
 57  1000bc:       83 f9 02                cmp    $0x2,%ecx
 58  1000bf:       0f 84 99 01 00 00       je     10025e <fib+0x24e>
 59  1000c5:       8d 71 fc                lea    -0x4(%ecx),%esi
 60  1000c8:       8d 51 fa                lea    -0x6(%ecx),%edx
 61  1000cb:       8b 45 e4                mov    -0x1c(%ebp),%eax
 62  1000ce:       83 e0 fe                and    $0xfffffffe,%eax
 63  1000d1:       29 c2                   sub    %eax,%edx
 64  1000d3:       89 55 b8                mov    %edx,-0x48(%ebp)
 65  1000d6:       c7 45 e0 00 00 00 00    movl   $0x0,-0x20(%ebp)
 66  1000dd:       89 4d c8                mov    %ecx,-0x38(%ebp)
 67  1000e0:       89 f1                   mov    %esi,%ecx
 68  1000e2:       8d 79 02                lea    0x2(%ecx),%edi
 69  1000e5:       83 f9 ff                cmp    $0xffffffff,%ecx
 70  1000e8:       0f 84 a1 00 00 00       je     10018f <fib+0x17f>
 71  1000ee:       8d 41 ff                lea    -0x1(%ecx),%eax
 72  1000f1:       89 45 dc                mov    %eax,-0x24(%ebp)
 73  1000f4:       89 4d d0                mov    %ecx,-0x30(%ebp)
 74  1000f7:       c7 45 d8 00 00 00 00    movl   $0x0,-0x28(%ebp)
 75  1000fe:       83 ff 02                cmp    $0x2,%edi
 76  100101:       0f 84 41 01 00 00       je     100248 <fib+0x238>
 77  100107:       8d 57 fc                lea    -0x4(%edi),%edx
 78  10010a:       8b 45 dc                mov    -0x24(%ebp),%eax
 79  10010d:       83 e0 fe                and    $0xfffffffe,%eax
 80  100110:       29 c2                   sub    %eax,%edx
 81  100112:       89 55 cc                mov    %edx,-0x34(%ebp)
 82  100115:       8b 5d d0                mov    -0x30(%ebp),%ebx
 83  100118:       31 d2                   xor    %edx,%edx
 84  10011a:       89 de                   mov    %ebx,%esi
 85  10011c:       83 fb 01                cmp    $0x1,%ebx
 86  10011f:       0f 84 2f 01 00 00       je     100254 <fib+0x244>
 87  100125:       c7 45 bc 00 00 00 00    movl   $0x0,-0x44(%ebp)
 88  10012c:       89 4d 88                mov    %ecx,-0x78(%ebp)
 89  10012f:       89 55 8c                mov    %edx,-0x74(%ebp)
 90  100132:       83 ec 0c                sub    $0xc,%esp
 91  100135:       8d 46 ff                lea    -0x1(%esi),%eax
 92  100138:       50                      push   %eax
 93  100139:       e8 d2 fe ff ff          call   100010 <fib>
 94  10013e:       83 c4 10                add    $0x10,%esp
 95  100141:       83 ee 02                sub    $0x2,%esi
 96  100144:       01 45 bc                add    %eax,-0x44(%ebp)
 97  100147:       83 fe 01                cmp    $0x1,%esi
 98  10014a:       8b 55 8c                mov    -0x74(%ebp),%edx
 99  10014d:       8b 4d 88                mov    -0x78(%ebp),%ecx
100  100150:       7f da                   jg     10012c <fib+0x11c>
101  100152:       8d 43 fe                lea    -0x2(%ebx),%eax
102  100155:       83 e3 01                and    $0x1,%ebx
103  100158:       8b 75 bc                mov    -0x44(%ebp),%esi
104  10015b:       01 de                   add    %ebx,%esi
105  10015d:       01 f2                   add    %esi,%edx
106  10015f:       89 c3                   mov    %eax,%ebx
107  100161:       39 45 cc                cmp    %eax,-0x34(%ebp)
108  100164:       75 b4                   jne    10011a <fib+0x10a>
109  100166:       8b 45 dc                mov    -0x24(%ebp),%eax
110  100169:       83 e0 01                and    $0x1,%eax
111  10016c:       01 d0                   add    %edx,%eax
112  10016e:       83 ef 02                sub    $0x2,%edi
113  100171:       01 45 d8                add    %eax,-0x28(%ebp)
114  100174:       83 6d d0 02             subl   $0x2,-0x30(%ebp)
115  100178:       83 6d dc 02             subl   $0x2,-0x24(%ebp)
116  10017c:       83 ff 01                cmp    $0x1,%edi
117  10017f:       0f 8f 79 ff ff ff       jg     1000fe <fib+0xee>
118  100185:       89 c8                   mov    %ecx,%eax
119  100187:       83 e0 01                and    $0x1,%eax
120  10018a:       8b 7d d8                mov    -0x28(%ebp),%edi
121  10018d:       01 c7                   add    %eax,%edi
122  10018f:       01 7d e0                add    %edi,-0x20(%ebp)
123  100192:       83 e9 02                sub    $0x2,%ecx
124  100195:       39 4d b8                cmp    %ecx,-0x48(%ebp)
125  100198:       0f 85 44 ff ff ff       jne    1000e2 <fib+0xd2>
126  10019e:       8b 4d c8                mov    -0x38(%ebp),%ecx
127  1001a1:       8b 45 e4                mov    -0x1c(%ebp),%eax
128  1001a4:       83 e0 01                and    $0x1,%eax
129  1001a7:       03 45 e0                add    -0x20(%ebp),%eax
130  1001aa:       83 e9 02                sub    $0x2,%ecx
131  1001ad:       01 45 d4                add    %eax,-0x2c(%ebp)
132  1001b0:       83 6d e4 02             subl   $0x2,-0x1c(%ebp)
133  1001b4:       83 f9 01                cmp    $0x1,%ecx
134  1001b7:       0f 8f ff fe ff ff       jg     1000bc <fib+0xac>
135  1001bd:       8b 5d c0                mov    -0x40(%ebp),%ebx
136  1001c0:       8d 43 fe                lea    -0x2(%ebx),%eax
137  1001c3:       83 e3 01                and    $0x1,%ebx
138  1001c6:       8b 4d d4                mov    -0x2c(%ebp),%ecx
139  1001c9:       01 d9                   add    %ebx,%ecx
140  1001cb:       01 4d a0                add    %ecx,-0x60(%ebp)
141  1001ce:       89 45 c0                mov    %eax,-0x40(%ebp)
142  1001d1:       39 45 94                cmp    %eax,-0x6c(%ebp)
143  1001d4:       0f 85 c6 fe ff ff       jne    1000a0 <fib+0x90>
144  1001da:       8b 45 b4                mov    -0x4c(%ebp),%eax
145  1001dd:       83 e0 01                and    $0x1,%eax
146  1001e0:       03 45 a0                add    -0x60(%ebp),%eax
147  1001e3:       8b 55 98                mov    -0x68(%ebp),%edx
148  1001e6:       01 45 a4                add    %eax,-0x5c(%ebp)
149  1001e9:       83 6d b4 02             subl   $0x2,-0x4c(%ebp)
150  1001ed:       83 fa 01                cmp    $0x1,%edx
151  1001f0:       0f 8f 83 fe ff ff       jg     100079 <fib+0x69>
152  1001f6:       8b 5d c4                mov    -0x3c(%ebp),%ebx
153  1001f9:       8d 43 fe                lea    -0x2(%ebx),%eax
154  1001fc:       83 e3 01                and    $0x1,%ebx
155  1001ff:       8b 55 a4                mov    -0x5c(%ebp),%edx
156  100202:       01 da                   add    %ebx,%edx
157  100204:       01 55 a8                add    %edx,-0x58(%ebp)
158  100207:       89 45 c4                mov    %eax,-0x3c(%ebp)
159  10020a:       8b 7d 90                mov    -0x70(%ebp),%edi
160  10020d:       39 f8                   cmp    %edi,%eax
161  10020f:       0f 85 48 fe ff ff       jne    10005d <fib+0x4d>
162  100215:       8b 45 b0                mov    -0x50(%ebp),%eax
163  100218:       83 e0 01                and    $0x1,%eax
164  10021b:       03 45 a8                add    -0x58(%ebp),%eax
165  10021e:       8b 55 9c                mov    -0x64(%ebp),%edx
166  100221:       01 45 ac                add    %eax,-0x54(%ebp)
167  100224:       83 6d b0 02             subl   $0x2,-0x50(%ebp)
168  100228:       83 fa 01                cmp    $0x1,%edx
169  10022b:       0f 8f 05 fe ff ff       jg     100036 <fib+0x26>
170  100231:       8b 45 08                mov    0x8(%ebp),%eax
171  100234:       83 e0 01                and    $0x1,%eax
172  100237:       03 45 ac                add    -0x54(%ebp),%eax
173  10023a:       89 45 08                mov    %eax,0x8(%ebp)
174  10023d:       8b 45 08                mov    0x8(%ebp),%eax
175  100240:       8d 65 f4                lea    -0xc(%ebp),%esp
176  100243:       5b                      pop    %ebx
177  100244:       5e                      pop    %esi
178  100245:       5f                      pop    %edi
179  100246:       5d                      pop    %ebp
180  100247:       c3                      ret
181  100248:       b8 01 00 00 00          mov    $0x1,%eax
182  10024d:       e9 1c ff ff ff          jmp    10016e <fib+0x15e>
183  100252:       66 90                   xchg   %ax,%ax
184  100254:       b8 ff ff ff ff          mov    $0xffffffff,%eax
185  100259:       e9 ff fe ff ff          jmp    10015d <fib+0x14d>
186  10025e:       b8 01 00 00 00          mov    $0x1,%eax
187  100263:       e9 42 ff ff ff          jmp    1001aa <fib+0x19a>
188  100268:       b8 ff ff ff ff          mov    $0xffffffff,%eax
189  10026d:       e9 59 ff ff ff          jmp    1001cb <fib+0x1bb>
190  100272:       b8 01 00 00 00          mov    $0x1,%eax
191  100277:       c7 45 98 00 00 00 00    movl   $0x0,-0x68(%ebp)
192  10027e:       e9 60 ff ff ff          jmp    1001e3 <fib+0x1d3>
193  100283:       b8 ff ff ff ff          mov    $0xffffffff,%eax
194  100288:       e9 77 ff ff ff          jmp    100204 <fib+0x1f4>
195  10028d:       b8 01 00 00 00          mov    $0x1,%eax
196  100292:       c7 45 9c 00 00 00 00    movl   $0x0,-0x64(%ebp)
197  100299:       eb 83                   jmp    10021e <fib+0x20e>
198  10029b:       90                      nop
199
2000010029c <main>:
201  10029c:       8d 4c 24 04             lea    0x4(%esp),%ecx
202  1002a0:       83 e4 f0                and    $0xfffffff0,%esp
203  1002a3:       ff 71 fc                push   -0x4(%ecx)
204  1002a6:       55                      push   %ebp
205  1002a7:       89 e5                   mov    %esp,%ebp
206  1002a9:       56                      push   %esi
207  1002aa:       53                      push   %ebx
208  1002ab:       51                      push   %ecx
209  1002ac:       83 ec 0c                sub    $0xc,%esp
210  1002af:       31 f6                   xor    %esi,%esi
211  1002b1:       46                      inc    %esi
212  1002b2:       83 fe 0b                cmp    $0xb,%esi
213  1002b5:       74 24                   je     1002db <main+0x3f>
214  1002b7:       83 fe 01                cmp    $0x1,%esi
215  1002ba:       74 f5                   je     1002b1 <main+0x15>
216  1002bc:       89 f3                   mov    %esi,%ebx
217  1002be:       83 ec 0c                sub    $0xc,%esp
218  1002c1:       8d 43 ff                lea    -0x1(%ebx),%eax
219  1002c4:       50                      push   %eax
220  1002c5:       e8 46 fd ff ff          call   100010 <fib>
221  1002ca:       83 c4 10                add    $0x10,%esp
222  1002cd:       83 eb 02                sub    $0x2,%ebx
223  1002d0:       83 fb 01                cmp    $0x1,%ebx
224  1002d3:       7f e9                   jg     1002be <main+0x22>
225  1002d5:       46                      inc    %esi
226  1002d6:       83 fe 0b                cmp    $0xb,%esi
227  1002d9:       75 dc                   jne    1002b7 <main+0x1b>
228  1002db:       31 c0                   xor    %eax,%eax
229  1002dd:       8d 65 f4                lea    -0xc(%ebp),%esp
230  1002e0:       59                      pop    %ecx
231  1002e1:       5b                      pop    %ebx
232  1002e2:       5e                      pop    %esi
233  1002e3:       5d                      pop    %ebp
234  1002e4:       8d 61 fc                lea    -0x4(%ecx),%esp
235  1002e7:       c3                      ret
236
237001002e8 <_trm_init>:
238  1002e8:       55                      push   %ebp
239  1002e9:       89 e5                   mov    %esp,%ebp
240  1002eb:       83 ec 14                sub    $0x14,%esp
241  1002ee:       68 00 03 10 00          push   $0x100300
242  1002f3:       e8 a4 ff ff ff          call   10029c <main>
243  1002f8:       cc                      int3
244  1002f9:       83 c4 10                add    $0x10,%esp
245  1002fc:       eb fe                   jmp    1002fc <_trm_init+0x14>

Now you see.

Tags: work cs

← 返回