今天是大年初一, 先祝大家新春快乐. 希望大家在新的一年里身体健康, 学习工作顺利, 天天开心.
从今天起, 我们就正式进入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是设计上的选择, 两者之间并没有孰优孰劣之分.
下面我也将同一段程序使用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.