版权所有南京大学计算机科学与技术系许畅等2022春季版 Console Enter an integer:7 5040 图16.样例2汇编代码的运行结果。 14 write: 15 1i$v0,1 16 syscall 17 1i$v0,4 18 1a$a0, _ret 19 syscall 20 move $v0,$0 2 jr Sra main: 2 addi ssp,Ssp,-4 sw Sra,0(Ssp) 26 jal read lw sra,0(Ssp) 28 addi ssp,Ssp,4 2 move $t1,Sv0 0 11$t3,1 3 bgt stl,st3,label6 2 jlabel7 33 label6: 3 move $a0,$t1 35 addi $sp,Ssp,-4 36 sw$ra,0(Ssp)】 37 jal fact 38 1w Sra,0(Ssp) 39 addi ssp,ssp,4 4 move $t2, $v0 41 jlabel8 label7: 3 1i$t2,1 44 label8: 45 move Sa0,$t2 46 addi ssp,Ssp,-4 47 sw Sra,0(Ssp) 48 jal write 49 1w Sra,0(Ssp) 50 addi ssp,Ssp,4 51 move $v0,S0 52 jr Sra 53 54 fact: 55 1i$t4,1 56 beg Sa0,$t4,labell 57 ilabel2 58 labell: 59 move $v0,Sa0 60 jr Sra 61 label2: 62 addi ssp,Ssp,-8 sw Sa0,(Ssp) 64 sw$ra,4(ssp)】 65 sub Sa0,Sa0,1 66 ial fact 67 1w$a0,($sp) 68 lw sra,4(Ssp) 69 addi ssp,Ssp,8 70 mul $v0,$vo,Sa0 71 ir Sra 98
版权所有 南京大学计算机科学与技术系 许畅等 2022春季版 98 14 write: 15 li $v0, 1 16 syscall 17 li $v0, 4 18 la $a0, _ret 19 syscall 20 move $v0, $0 21 jr $ra 22 23 main: 24 addi $sp, $sp, -4 25 sw $ra, 0($sp) 26 jal read 27 lw $ra, 0($sp) 28 addi $sp, $sp, 4 29 move $t1, $v0 30 li $t3, 1 31 bgt $t1, $t3, label6 32 j label7 33 label6: 34 move $a0, $t1 35 addi $sp, $sp, -4 36 sw $ra, 0($sp) 37 jal fact 38 lw $ra, 0($sp) 39 addi $sp, $sp, 4 40 move $t2, $v0 41 j label8 42 label7: 43 li $t2, 1 44 label8: 45 move $a0, $t2 46 addi $sp, $sp, -4 47 sw $ra, 0($sp) 48 jal write 49 lw $ra, 0($sp) 50 addi $sp, $sp, 4 51 move $v0, $0 52 jr $ra 53 54 fact: 55 li $t4, 1 56 beq $a0, $t4, label1 57 j label2 58 label1: 59 move $v0, $a0 60 jr $ra 61 label2: 62 addi $sp, $sp, -8 63 sw $a0, ($sp) 64 sw $ra, 4($sp) 65 sub $a0, $a0, 1 66 jal fact 67 lw $a0, ($sp) 68 lw $ra, 4($sp) 69 addi $sp, $sp, 8 70 mul $v0, $v0, $a0 71 jr $ra 图16. 样例2汇编代码的运行结果
版权所有南京大学计算机科学与技术系许畅等2022春季版 该汇编程序在QtSPIM中的运行结果如图16所示(输入7,输出5040)。 除了上面给的两个样例以外,你的程序要能够将其它符合假设的C一源代码翻译为目标代 码,我们将通过检查目标代码是否能在SPIM Simulator.上运行并得到正确结果来判断你的程序 的正确性。 99
版权所有 南京大学计算机科学与技术系 许畅等 2022春季版 99 该汇编程序在QtSPIM中的运行结果如图16所示(输入7,输出5040)。 除了上面给的两个样例以外,你的程序要能够将其它符合假设的C−−源代码翻译为目标代 码,我们将通过检查目标代码是否能在SPIM Simulator上运行并得到正确结果来判断你的程序 的正确性
版权所有南京大学计算机科学与技术系许畅等2022春季版 File Simulator Registers Text Segment Data Segment Window Help 心边日d口得,口日 F伊R9 n碱风e[I句 Data Text int Regs [16] 国Tex User Text3ment1o0400oo01,.【0440000】 I90400900】8fa40090154,9t523) 183:Iw sa0 0(sspl arge 等就t口器 =3000ff10 040000c 0004100 112.54.3 16:0a02 00e202 00000 [nain] 188888 or152,50,10 1:1w010 yCa11 192:yca1yca10ext Kerne1Text5 egnent【s00000001,【80o1o009J Ert明 9归a0a2 ut we need to use thea 4c240204 w54,516(停1) mt026,1 andt 4.94.31 ode Field 0000010 97:andi tao tao Oxif 。1 34020001 05:51y1 1110:11 sv0 4 syacall 4 (print_str) e0001c4 0c019000 2672 800001c81 0024002 1w54,384(1 00001d4 080000a 【00001d8】34010018or11,50,24 116:bne sko 0x18 okpe Bad pe exception aeothat 0x00400024 start at 0x00400000 gmain at 0x00000000 图17.QtSPIM运行界面。 5.2 实验指导 在实验三中,我们已经将输入程序翻译为涉及相当多底层细节的中间代码。这些中间代码 在很大程度上已经可以很容易地翻译成许多RSC的机器代码,不过仍然存在以下问题: 1)中间代码与目标代码之间并不是严格一一对应的。有可能某条中间代码对应多条目标 代码,也有可能多条中间代码对应一条目标代码。 2)中间代码中我们使用了数目不受限的变量和临时变量,但处理器所拥有的寄存器数量 是有限的。RISC机器的一大特点就是运算指令的操作数总是从寄存器中获得。 3)中间代码中我们并没有处理有关函数调用的细节。函数调用在中间代码中被抽象为若 干条ARG语句和一条CALL语句,但在目标机器上一般不会有专门的器件为我们进行参数传 递,我们必须借助于寄存器或栈来完成这一点。 其中,第一个问题被称为指令选择(Instruction Selection)问题,第二个问题被称为寄 存器分配(Register Allocation)问题,第三个问题则需要考虑如何对栈进行管理。在实验四 中我们的主要任务就是编写程序来处理这三个问题。 100
版权所有 南京大学计算机科学与技术系 许畅等 2022春季版 100 5.2 实验指导 在实验三中,我们已经将输入程序翻译为涉及相当多底层细节的中间代码。这些中间代码 在很大程度上已经可以很容易地翻译成许多RISC的机器代码,不过仍然存在以下问题: 1) 中间代码与目标代码之间并不是严格一一对应的。有可能某条中间代码对应多条目标 代码,也有可能多条中间代码对应一条目标代码。 2) 中间代码中我们使用了数目不受限的变量和临时变量,但处理器所拥有的寄存器数量 是有限的。RISC机器的一大特点就是运算指令的操作数总是从寄存器中获得。 3) 中间代码中我们并没有处理有关函数调用的细节。函数调用在中间代码中被抽象为若 干条ARG语句和一条CALL语句,但在目标机器上一般不会有专门的器件为我们进行参数传 递,我们必须借助于寄存器或栈来完成这一点。 其中,第一个问题被称为指令选择(Instruction Selection)问题,第二个问题被称为寄 存器分配(Register Allocation)问题,第三个问题则需要考虑如何对栈进行管理。在实验四 中我们的主要任务就是编写程序来处理这三个问题。 图17. QtSPIM运行界面
版权所有南京大学计算机科学与技术系许畅等2022春季版 Data ser data8gent【100000001,10040o00】静态数据区 100100001 65746e456e612072746e592072656765 E n t e r a n i n t e g e r 100100101 000a003a000000000000000000000000 100100201.【1003ffff】00000000 用户栈 User staek [7ttrE9501..[800000001 17EEFF950] 00000002 00400060 00000003004D00 7EEEE9601 0000000004000f000000005 004000f0 TEFEf9701 00000006 004000£0 00000007 004000E0 00000008 04000g4 0040001800000001 一00000000 ++·+··”· +++ 7ffff9b0 ffffec3 [7ffff9c0] 7ffffe49 7ffffe3a 7ffffe00 图18.内存中的数据信息。 ⑧Set Run Parameters Address or label to start running program 0x00400000 Command-line arguments to pass to progran OK 图19.运行参数设置对话框。 5.2.1 QtSPIM简易教程 “工欲善其事,必先利其器”,在着手解决前面所说的三个问题之前,让我们先来考察 实验四所要用到的工具SPIM Simulator。. SPIM Simulator有两种版本:命令行版和GUI版,这两个版本功能相似。命令行版使用更 简洁,GUI版使用更直观,你可以根据自己的喜好进行选择。如果选择命令行版,则可以直接 在终端键入sudo apt-.get install spim命令进行安装(注意需要机器已经连接外网),如果选择 GUI版,则需要访问SPIM Simulator的官方地址htp://pages..cs.wisc.edu/-~larus//spim.html来 下载并安装QtSPIM的Liux版本。命令行版的使用很简单,键入 spim-file[汇编代码文件名] 即可运行。其更详细的使用方法可以通过阅读手册man spim进行学习,下面的介绍主要 针对GUI版本。 成功安装并运行QSPM之后,可以看到如图17所示的界面。其中中间面积最大的一片是 代码区,里面显示了许多MPS用户代码和内核代码,而左侧列出了MPS中的各个寄存器以及 这些寄存器中保存的内容。无论是代码还是寄存器内容,都可以通过上面的菜单选项切换二进 制/十进制/什六进制的显示方式。 101
版权所有 南京大学计算机科学与技术系 许畅等 2022春季版 101 5.2.1 QtSPIM简易教程 “工欲善其事,必先利其器”,在着手解决前面所说的三个问题之前,让我们先来考察 实验四所要用到的工具SPIM Simulator。 SPIM Simulator有两种版本:命令行版和GUI版,这两个版本功能相似。命令行版使用更 简洁,GUI版使用更直观,你可以根据自己的喜好进行选择。如果选择命令行版,则可以直接 在终端键入sudo apt-get install spim命令进行安装(注意需要机器已经连接外网),如果选择 GUI版,则需要访问SPIM Simulator的官方地址http://pages.cs.wisc.edu/~larus/spim.html来 下载并安装QtSPIM的Linux版本。命令行版的使用很简单,键入 spim -file [汇编代码文件名] 即可运行。其更详细的使用方法可以通过阅读手册man spim进行学习,下面的介绍主要 针对GUI版本。 成功安装并运行QtSPIM之后,可以看到如图17所示的界面。其中中间面积最大的一片是 代码区,里面显示了许多MIPS用户代码和内核代码,而左侧列出了MIPS中的各个寄存器以及 这些寄存器中保存的内容。无论是代码还是寄存器内容,都可以通过上面的菜单选项切换二进 制/十进制/十六进制的显示方式。 图18. 内存中的数据信息。 图19. 运行参数设置对话框