今天是大年初一, 先祝大家新春快乐. 希望大家在新的一年里身体健康, 学习工作顺利, 天天开心.
从今天起, 我们就正式进入PA2了. 在PA2中, 我们需要实现一个冯诺依曼计算机系统. 也就是在这章中, 我们可以真正在虚拟机上跑起来一些程序啦!(耶!!!!!!!!)
More on Programs
为了能够在我们自己写的虚拟机上运行程序, 我们必须要完整地理解一个程序运行的规则. 尽管在前面的文章中我对这方面有所涉及, 但是并没有将整个运行过程系统性地展现出来, 因此今天, 我还要更细致地介绍一下程序是如何在计算机上跑起来的.
Program(程序)
要想让程序在计算机上跑起来, 我们要先有一个程序(多新鲜呐). 下面, 我将围绕以下这段程序展开介绍.
有人可能就说了: 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是设计上的选择, 两者之间并没有孰优孰劣之分.
下面我也将同一段程序使用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数列算法.
以下是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.