




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 9 讲计算机指令系统数字逻辑与处置器; MIPS模拟器模拟器 MIPS汇编言语程序设计汇编言语程序设计 一个排序算法的实例一个排序算法的实例计算机指令系统计算机指令系统(2);MIPS模拟器模拟器 SPIM SPIM是主要的是主要的MIPS模拟器,可以运转和调模拟器,可以运转和调试试MIPS汇编言语程序汇编言语程序 SPIM支持支持Uinx、Windows等多个操作系等多个操作系统平台统平台 /larus/spim.html;MIPS模拟器模拟器存放器窗口存放器窗口正文段正文段数据与堆栈段数据与堆栈段SPIM音讯音讯;MIPS模拟器模拟器 MARS MAR
2、S 是是MIPS Assembler and Runtime Simulator (MIPS汇编器和运转时模拟器汇编器和运转时模拟器)的缩写的缩写 可以运转和调试可以运转和调试MIPS汇编言语程序汇编言语程序 MARS采用采用Java开发,跨平台开发,跨平台 /KenVollmar/MARS/;MIPS模拟器模拟器; MIPS的寻址方式的寻址方式 MIPS模拟器模拟器 MIPS汇编言语程序设计汇编言语程序设计计算机指令系统计算机指令系统(2);MIPS汇编器:语法汇编器:语法 注释行以注释行以“#开场;开场; 标识符由字母、下划线标识符由字母、
3、下划线_、点、点.构成,但构成,但不能以数字开头,指令操作码是一些保管字,不不能以数字开头,指令操作码是一些保管字,不能用作标识符;能用作标识符; 标号放在行首,后跟冒号标号放在行首,后跟冒号:,例如,例如 2022-5-198 .data #将子数据项,存放到数据段中Item: .word 1,2 #将2个32位数值送入地址延续的内存字中 .text #将子串即指令或字送入用户文件段 .global main #必需为全局变量Main: lw $t0, itemMIPS汇编中的命令见Page625;MIPS汇编言语程序设计:汇编言语程序设计:MIPS汇编言语语句格式汇编言语语句格式指令与伪指
4、令语句指令与伪指令语句Label: Arg1, Arg2, Arg3 #comment汇编命令汇编命令(directive)语句语句Label: .Directive arg1, arg2, . . . #comment;MIPS汇编言语程序设计汇编言语程序设计汇编命令汇编命令directive)汇编器用来定义数据段、代码段以及为数据汇编器用来定义数据段、代码段以及为数据分配存储空间分配存储空间.data address # 定义数据段定义数据段 # address为可选为可选的地址的地址.text address # 定义正文段定义正文段(即代即代码段码段) # address为可选的地址为
5、可选的地址.align n # 以以 2n字节边境对齐数字节边境对齐数据据 # 只能用于数据段只能用于数据段;MIPS汇编言语程序设计汇编言语程序设计汇编命令汇编命令.ascii # 在内存中存放字符串在内存中存放字符串.asciiz # 在内存中存放在内存中存放NULL终了的终了的 # 字符串字符串.word w1, w2, . . . , wn # 在内存中存放在内存中存放n个字个字.half h1, h2, . . . , hn # 在内存中存放在内存中存放n个半字个半字.byte b1, b2, . . . , bn # 在内存中存放在内存中存放n个字节个字节;MIPS汇编器:存储器中
6、位置汇编器:存储器中位置 汇编言语源文件:汇编言语源文件:.s “. MIPS汇编命令标识符汇编命令标识符 “label: label被赋值为当前位置的地被赋值为当前位置的地址址 Fact = 0 x00400100 编译时就确定了编译时就确定了 汇编程序在地址汇编程序在地址0 x00400000开场开场2022-5-1912 move $s5, $31 jal fact sw $s0,f($0) .text 0 x00400100 fact: addiu $s0,$0,1 lw $s1, n($0)loop: mul $s0,$s1,$s0 addi $s1,$s1,-1 bnez $s1,
7、loop jr $31.data 0 x10000200n: .word 4f: .word 00 x004000200 x004000240 x004000280 x004001000 x004001040 x004001080 x0040010C0 x004001100 x004001140 x100002000 x10000204;能运转的版本能运转的版本1:.textmain: ori $s6,$0,0 x1000 sll $s6,$s6,16 addiu $s4,$s6,0 x0200 #$s4=n addiu $s5,$s6,0 x0204 #$s5=f beq $0,$0, fa
8、ct result: sw $s0,0($s5) jr $ra #跳出跳出main2022-5-1913 .text 0 x00400100fact: addiu $s0,$0,1 lw $s1,0($s4) #$s0=n!loop: mul $s0,$s1,$s0addi $s1,$s1,-1bnez $s1,loop #f=n!j result .data 0 x10000200n: .word 4f: .word 0;.data 0 x10000000 .word 4,0.textmain:ori $s6,$0,0 x1000sll $s6,$s6,16addiu $s5,$s6,0 x
9、004fact:addiu $s0,$0,1lw $s1,0($s6)loop: mul $s0,$s1,$s0addi $s1,$s1,-1bnez $s1,loopsw $s0,0($s5)jr $ra14#以下语句行是数据代码行以下语句行是数据代码行#定义了两个字型立刻数定义了两个字型立刻数4和和0#以下语句行是指令代码行以下语句行是指令代码行 # 获得数据起始地址获得数据起始地址# $s6=0 x10000000# $s5=0 x10000004# 循环计数器赋初值循环计数器赋初值 # 把把 word型数型数 4 载入载入 $s1# $s0=n!, n=4# 对应伪指令对应伪指令 su
10、bu $s1,$s1,1# f=n!=24#根据根据ra存放器中的前往地址前往存放器中的前往地址前往能运转的版本2;编程指南编程指南1变量变量2分支分支3数组数组4过程调用过程调用5阅读、改良程序阅读、改良程序6设计实例设计实例2022-5-1915单指令计算机单指令计算机;编程指南:编程指南:1变量变量 变量存储在主存储器内而不是存放器内变量存储在主存储器内而不是存放器内 由于我们通常有很多的变量要存,不止由于我们通常有很多的变量要存,不止32个个 为了实现功能为了实现功能, 用用LW 语句将变量加载到存放器中语句将变量加载到存放器中, 对存放器进展操作对存放器进展操作, 然后再把结果然后再
11、把结果SW回去回去 对于比较长的操作对于比较长的操作(e.g., loops): 让变量在存放器中保管时间越长越好让变量在存放器中保管时间越长越好 LW and SW 只在一块代码开场和终了时运用只在一块代码开场和终了时运用 节省指令节省指令 also, 现实上现实上LW and SW 比存放器操作要慢得多比存放器操作要慢得多得多!得多! 由于一条指令只能采用两个输入由于一条指令只能采用两个输入,所以必需采用暂所以必需采用暂时存放器计算复杂的问题时存放器计算复杂的问题e.g., (x+y)+(x-y)2022-5-1916;编程指南:编程指南:1变量变量2022-5-1917.data 0 x
12、10000000 .word 4,0.textmain:addu $s3,$ra,$0ori $s6,$0,0 x1000sll $s6,$s6,16addiu $s5,$s6,4fact:addiu $s0,$0,1lw $s1,0($s6)loop:mul $s0,$s1,$s0addi $s1,$s1,-1bnez $s1,loopsw $s0,0($s5)jr $ra#s1 get 4#s0 hold result#return result in s0lui $s6, 0 x1000在程序起始处保管ra是一种习惯,目的是防止在程序中有jal指令修正了ra,我们跳不回去了,本程序中没有
13、用可删除以节省存放器和指令数。;编程指南:编程指南:2分支分支 在符号汇编语句中在符号汇编语句中,分支语分支语句的目的位置是用绝对地址句的目的位置是用绝对地址方式写的方式写的 e.g., beq $0,$0,fact means PC 0 x00400100 不过在实现中不过在实现中,要用相对于要用相对于PC的地址来定义的地址来定义 e.g., beq $0,$0,0 x3f means PC 0 x0040010018.textmain:addu $s3,$ra,$0 ori $s6,$0,0 x1000 sll $s6,$s6,16 addiu $s4,$s6,0 x0200 addiu
14、$s5,$s6,0 x0204 beq $0,$0, fact result: sw $s0,0($s5) addu $ra,$s3,$0 jr $ra .text 0 x00400100fact:sw $ra,0($s7) addiu $s0,$0,1 lw $s1,0($s4) #$s0=n!loop:mul $s0,$s1,$s0addi $s1,$s1,-1bnez $s1,loop #f=n!j result .data 0 x10000200n: .word 4f: .word 0;分支语句中的偏移量的运用分支语句中的偏移量的运用 偏移量偏移量= 从下一条指令对应的从下一条指令对应
15、的PC开场到标号位置还有多开场到标号位置还有多少条指令少条指令 e.g., beq $0,$0,fact假设位于地址假设位于地址0 x00400000 的话的话, word displacement=(target - (+4) / 4 =(0 x00400100-0 x00400004)/4 =0 xfc/4=0 x3f 偏移量为偏移量为0那么表示执行下一条指令不产生任何跳转那么表示执行下一条指令不产生任何跳转 为什么在代码中用相对的偏移量为什么在代码中用相对的偏移量? relocatable 代码代码(可重新定位的可重新定位的) 分支语句可以在每次被加载到内存不同位置的情况下正分支语句可以
16、在每次被加载到内存不同位置的情况下正常任务常任务2022-5-1919;编程指南:编程指南:2分支分支 分支分支 假设和假设和 0比较比较, 那么直接运用那么直接运用blez,bgez,bltz,bgtz, bnez e.g., loop example before 更复杂的比较更复杂的比较, 采用比较指令如采用比较指令如slt, 然后再用然后再用与与0比较比较 Example: if ( x = 0 )y = x;elsey = -x;2022-5-1920;21 .data 0 x10000000.word -6,0.textmain:ori $s6,$0,0 x1000sll $s6,
17、$s6,16addiu $s5,$s6,4lw $s0,0($s6)slt $s2,$0,$s0beqz $s2,elsemove $s1,$s0j doneelse:sub $s1,$0,$s0done: sw $s1,0($s5)jr $ra#x:-6, y:0 #计算内存中数据存放地址计算内存中数据存放地址#$s6=x, #$s5=y#0 x, $s2=1#$s2=0, 跳到跳到else#$s2=1, 跳到跳到done功能:求绝对值功能:求绝对值编程指南编程指南:分支分支 test2;编程指南编程指南:3数组数组array 用用 .word来给数组开辟空间来给数组开辟空间 在编译时静态地
18、开辟在编译时静态地开辟n*4 bytes, (n个个32-bit 字字) n=17 运用运用LW和和SW的的$2和和$4 LW $1, const($2) SW $3, const($4) 将将 const 作为数组偏移量作为数组偏移量 将存放器将存放器$2和和$4作为数组中的开场地址作为数组中的开场地址(A0)2022-5-1922 ;#编程指南编程指南:3数组数组array test3.data 0 x10000000.word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17.textmain:addu $s7,$ra,$0ori $s5,$0,0 x1
19、000sll $s5,$s5,16 #$s5=A =0 x10000000,addiu $s6,$s5,0 x400 #$s6=B =0 x10000400addiu $s0,$0,0 x11 #Size(A)=Size(B)=0 x11loop:subu $s0,$s0,1 # 计数计数addiu $s1,$0,4mul $s2,$s1,$s0 # 换算地址换算地址addu $s3,$s2,$s5 #计算计算A偏移量偏移量,送到送到$s3lw $s4,0($s3) #读出读出A中的值中的值addu $s3,$s2,$s6 #计算计算B偏移量偏移量,送到送到$s3sw $s4,0($s3) #
20、写到写到B中去中去bnez $s0,loopaddu $ra,$0,$s7 #前往调用程序前往调用程序 jr $ra23;编程指南编程指南:3数组数组array数组访问数组访问 SLLV by k 等价于等价于 MUL by 2k SRLV by k 等价于等价于 DIV by 2k 很有用,由于很有用,由于 MUL 和和DIV普通都比普通都比SLL 和和SRL慢慢 想想怎样实现想想怎样实现MUL和和DIV 对于有符号数用对于有符号数用 SRA 高位用符号位填充高位用符号位填充(在在2的补码表示情况下的补码表示情况下) e.g., R1 = -6 = 0b1111010SRL $R1,$R1,
21、1 0b0111101 SRA $R1,$R1,1 0b1111101=-3 想想为什么这样是对的想想为什么这样是对的 2022-5-1924只对无符号数成立只对无符号数成立;编程指南编程指南:3数组数组array数组访问数组访问25 add $s0,$0,$a2 # i = N loop: subu $s0 $s0,1 # i- addiu $s1,$0,4 # $s1=4 mul $s2,$s1,$s0 # $s2 = i*4 addiu $t0,$0,2 # $t0=2 div $s0,$t0 # 商存放商存放$lo=floor(i/2) mflo $t1 # $t1=floor(i/2
22、) mul $t1,$s1,$t1 # $t1=$t1*4 add $t2,$t1,$a0 # 计算数组计算数组A地址地址 lw $s4,0($t2) # $s4=Ai/2 add $t3,$s2,$a1 # 计算数组计算数组B地址地址 sw $s4,0($t3) # Bi =$s4 bnez $s0,loop # while(i!=0) loopdone: 数组数组A的基地址存放在的基地址存放在$a0中中取对应的数组元素取对应的数组元素数组数组B的基地址存放在的基地址存放在$a1中中数组长度数组长度N = 0 x100,存放在,存放在$a2中中数组长度计数器数组长度计数器$s0计算计算4字节
23、地址偏移量字节地址偏移量;Side Note #1: 用移位替代乘法用移位替代乘法对无符号数对无符号数SLL by k 等价于等价于 MUL by 2kSRL by k 等价于等价于 DIV by 2k对于有符号数用对于有符号数用 SRA高位用符号位填充高位用符号位填充(在在2的补码表示情况下的补码表示情况下)2022-5-1926 add $s0,$0,$a2 # i = Nloop: subu $s0 $s0,1 # i- sll $s2,$s0,2 # dest = i*4 sra $t1,$s0,1 # $t1=floor(i/2) sll $t1,$t1,2 # $t1=$t1*4
24、add $t2,$t1,$a0 lw $s4,0($t2) # $s4=Ai/2 add $t3,$s2,$a1 sw $s4,0($t3) # Bi = $s4 bnez $s0,loop # while(i!=0) loopdone: 编程指南编程指南:3数组数组array数组访问数组访问;编程指南编程指南:4过程调用过程调用 用汇编写程序时需求明确阐明每一次的调用和前往用汇编写程序时需求明确阐明每一次的调用和前往 Why?为什么用?为什么用C编写程序时不需求了解子程序被编写程序时不需求了解子程序被调用的详细细节?调用的详细细节? 大多数有关过程调用的记录集中在一个叫做过程调大多数有关过程
25、调用的记录集中在一个叫做过程调用帧的内存块中,实现:用帧的内存块中,实现: 以参数方式保管调用值以参数方式保管调用值 保管主调过程的运转现场存放器保管主调过程的运转现场存放器 为程序的变量提供足够的内存空间部分变量、暂为程序的变量提供足够的内存空间部分变量、暂时变量时变量 程序的调用和前往严厉服从后进先出程序的调用和前往严厉服从后进先出LIFO原那原那么么2022-5-1927编译程序替他做了!编译程序替他做了!;编程指南编程指南:4过程调用过程调用我们需求存储我们需求存储:前往地址前往地址(old ra) 参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中
26、过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1928unused主存储器主存储器unused地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;unusedunusedunusedunusedunusedunused例如例如调用调用fact(2);运用栈:栈框架运用栈:栈框架我们需求存储我
27、们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1929主存储器主存储器地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;例如例如调用调用fact(2)2retu
28、rn addrtemp varsunusedunusedfact(2)s的栈框架的栈框架unusedunusedunused;运用栈:栈框架运用栈:栈框架我们需求存储我们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1930主存储器主存储器地址减小方向地址减小方向in
29、t fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;例如例如调用调用fact(2)2return addrtemp vars 1unusedunusedreturn addrtemp varsfact(2)s栈框架栈框架fact(1)s栈框架栈框架;运用栈:栈框架运用栈:栈框架我们需求存储我们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每
30、栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1931主存储器主存储器地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;例如例如调用调用fact(2)2return addrtemp vars 1return addrtemp varsfact(2)s框架框架fact(1)s框架框架 0return addrtemp varsfact(0)s框架框架;运用栈:栈框架运用栈:栈框架我们需求存
31、储我们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1932主存储器主存储器地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;例如例如调用调用fact(2)2re
32、turn addrtemp vars 1unusedunusedreturn addrtemp varsfact(2)s栈框架栈框架fact(1)s栈框架栈框架;运用栈:栈框架运用栈:栈框架我们需求存储我们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1933主存储器
33、主存储器地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;例如例如调用调用fact(2)2return addrtemp varsunusedunusedfact(2)s的栈框架的栈框架unusedunusedunused;运用栈:栈框架运用栈:栈框架我们需求存储我们需求存储:前往地址前往地址(old ra)参数参数 n in fact(n)暂时暂时/部分的变量部分的变量 在在f执行执行过程中过程中被破坏的存放器被破坏的存放器想法想法: 存在栈里存在栈里!增长增长(PUSH 进去进去) 栈
34、,每栈,每次调用函数时次调用函数时缩减栈缩减栈(POP 出来出来) 每次前每次前往时往时每次调用都有本人的每次调用都有本人的“栈框栈框架架2022-5-1934unused主存储器主存储器unused地址减小方向地址减小方向int fact( int n ) if (n 0) return fact( n-1 ) * n; else return 1 ;unusedunusedunusedunusedunusedunused例如例如调用调用fact(2);栈的规定栈的规定 主调过程将调用后还需求运用的参数存放器主调过程将调用后还需求运用的参数存放器$a0$a3和暂和暂时存放器时存放器$t0$t
35、9压栈压栈 被调过程将前往地址存放器和在被调过程中修正了的保管被调过程将前往地址存放器和在被调过程中修正了的保管存放器存放器$s0$s7压栈压栈2022-5-1935;MIPS计算机硬件对过程的支持计算机硬件对过程的支持 为新数据分配空间为新数据分配空间 利用堆栈存储过程中不适宜用存放器保管利用堆栈存储过程中不适宜用存放器保管的部分变量如部分数组、或构造的部分变量如部分数组、或构造 过程框架:也叫活动记录,是指包含了过过程框架:也叫活动记录,是指包含了过程保管的存放器和部分变量的堆栈段。程保管的存放器和部分变量的堆栈段。 经过下例了解过程调用之前、之中和之后经过下例了解过程调用之前、之中和之后
36、的堆栈形状的堆栈形状36;MIPS 程序和数据的程序和数据的存储器空间运用商定存储器空间运用商定 从顶端开场,对栈指针初始化为从顶端开场,对栈指针初始化为7fffffff,并向下向数据段增长;,并向下向数据段增长; 在底端,程序代码文本开场于在底端,程序代码文本开场于00400000; 静态数据开场于静态数据开场于10000000; 紧接着是由紧接着是由C中中malloc进展存储器分进展存储器分配的动态数据,朝堆栈段向上增长配的动态数据,朝堆栈段向上增长37$sp$gp0040 0000hex01000 0000hexTextStatic dataDynamic dataStack7fff f
37、fffhex1000 8000hex pcReserved全局指针被设定为易于访问数据的地址,以便运用相对于$gp的16位偏移量10000000hex-1000ffffhex;数据存在哪?数据存在哪?2022-5-1938.data 0 x10000000 .word 4,0.textmain:addu $s7,$ra,$0ori $s6,$0,0 x1000sll $s6,$s6,16addiu $s5,$s6,4fact:addiu $s0,$0,1lw $s1,0($s6)loop:mul $s0,$s1,$s0subu $s1,$s1,1bnez $s1,loopsw $s0,0($s
38、5)addu $ra,$0,$s7jr $ra #s1 get 4#s0 hold result#return result in s0;嵌套过程调用嵌套过程调用 计算计算n! fact:addi $sp, $sp, -8sw $ra, 4($sp)sw$a0, 0($sp)slti $t0, $a0, 1beq$t0, $zero, L1addi $v0, $zero, 1addi $sp, $sp, 8jr $raL1:addi $a0, $a0, -1jalfactlw $a0, 0($sp)lw$ra, 4($sp)addi $sp, $sp, 8mul $v0, $a0, $v0jr
39、 $ra ;为新数据分配空间为新数据分配空间 框架指针框架指针$fp指向框架的第一个字,通常是保管指向框架的第一个字,通常是保管的参数存放器;的参数存放器; 栈指针栈指针$sp指向栈顶,在程序执行的过程中栈指指向栈顶,在程序执行的过程中栈指针有能够改动;针有能够改动; 因此经过固定的框架指针来访问变量要比用栈指因此经过固定的框架指针来访问变量要比用栈指针更简便。针更简便。 假设一个过程的栈中没有部分变量,编译器将不假设一个过程的栈中没有部分变量,编译器将不设置和恢复框架指针,以节省时间。设置和恢复框架指针,以节省时间。 当需求框架指针时,以调用时的当需求框架指针时,以调用时的$sp值作为框架值
40、作为框架指针的初值,调用前往时,根据指针的初值,调用前往时,根据$fp恢复恢复$sp值值40;编程指南编程指南1变量变量2分支分支3数组数组4过程调用过程调用5阅读、改良程序阅读、改良程序6设计实例设计实例2022-5-1941单指令计算机单指令计算机;编程指南编程指南: 5阅读、改良汇编代码阅读、改良汇编代码 这段程序干了啥这段程序干了啥?2022-5-1942 .data#xs address stored in $a0# fs address stored in $a1 .text move $s1,$0 move $s2,$s1 addiu $s3,$0,1 lw $s4,0($a0)
41、 loop: subu $s4,$s4,1 beqz $s4,done move $s1,$s2 move $s2,$s3 addu $s3,$s2,$s1 j loopdone: sw $s3,0($a1) ;阅读汇编代码阅读汇编代码 这段程序干了啥这段程序干了啥?2022-5-1943 .data#xs address stored in $a0# fs address stored in $a1 .text move $s1,$0 move $s2,$s1 addiu $s3,$0,1 lw $s4,0($a0) loop: subu $s4,$s4,1 beqz $s4,done mo
42、ve $s1,$s2 move $s2,$s3 addu $s3,$s2,$s1 j loopdone: sw $s3,0($a1) #$s1=0#$s2=$s1#$s3=1#$s4=x#$s4=$s4-1#if($s4=0)done#$s1=$s2#$s2=$s3#$s3=$s2+$s1#goto loop#store result in f;阅读汇编代码阅读汇编代码这段程序干了啥这段程序干了啥?a = 0; / a = s1b = a; / b = r2res = 1;i = x;while ( -i != 0 ) / decrease i then check if 0 a=b; b=r
43、es; res=a+b;f = res; / note x itself isnt changedx = 1 2 3 4 5 6 7 8 9 10f =2022-5-1944 .data#xs address stored in $a0# fs address stored in $a1 .text move $s1,$0 move $s2,$s1 addiu $s3,$0,1 lw $s4,0($a0) loop: subu $s4,$s4,1 beqz $s4,done move $s1,$s2 move $s2,$s3 addu $s3,$s2,$s1 j loopdone: sw $s
44、3,0($a1) #$s1=0#$s2=$s1#$s3=1#$s4=x#$s4=$s4-1#if($s4=0)done#$s1=$s2#$s2=$s3#$s3=$s2+$s1#goto loop#store result in f;a = 0; / a = s1b = a; / b = s2res = 1;i = x;while ( -i != 0 ) / decrease i then check if 0 a=b; b=res; res=a+b;f = res; / note x itself isnt changedx = 1 2 3 4 5 6 7 8 9 10f = 1 1 2 3
45、5 8 13 21 34 55f = fib(x) (for x 0) (Fibonacci)2022-5-1945阅读汇编代码阅读汇编代码 .data#xs address stored in $a0# fs address stored in $a1 .text move $s1,$0 move $s2,$s1 addiu $s3,$0,1 lw $s4,0($a0) loop: addi $s4,$s4,-1 beqz $s4,done move $s1,$s2 move $s2,$s3 addu $s3,$s2,$s1 j loopdone: sw $s3,0($a1) #$s1=0#
46、$s2=$s1#$s3=1#$s4=x#$s4=$s4-1#if($s4=0)done#$s1=$s2#$s2=$s3#$s3=$s2+$s1#goto loop#store result in f前两项均为前两项均为1,从第三项起,每一项都,从第三项起,每一项都是其前两项的和是其前两项的和 这段程序干了啥?这段程序干了啥?;优化代码优化代码 如何使本部分如何使本部分代码运转更快代码运转更快? 目前运转时间:目前运转时间:= const + 6x 能否到达能否到达 const + 5x?46 .data#x: $a0#f: $a1 .text move $s1,$0 move $s2,$s1
47、addiu $s3,$0,1 lw $s4,0($a0) loop: addi $s4,$s4,-1 beqz $s4,done move $s1,$s2 move $s2,$s3 addu $s3,$s2,$s1 j loopdone: sw $s3,0($a1) #$s1=0#$s2=0#$s3=1#$s4=x#计数器计数器$s4减减1#if($s4=0)done#$s1=0#$s2=1#$s3=$s2+$s1#goto loop#store result in f;Optimizing Codel 运转时间从运转时间从 const+6x 到到const+5xl Trick: 将将 SUB
48、U和和BNEZ移到后面,减掉额外的分移到后面,减掉额外的分支指令支指令l 当当x比较大时,减少了运比较大时,减少了运转时间转时间constant有所添有所添加加l 目前的编译器普通都可以目前的编译器普通都可以支持这类优化支持这类优化2022-5-1947 move $s1,$0 #$s1=0 move $s2,$s1 #$s2=$s1 addiu $s3,$0,1 #$s3=1 lw $s4,0($a0) #$s4=x subu $s4,$s4,1 #$s4=$s4-1 beqz $s4,done #if($s4=0)doneloop: move $s1,$s2 #$s1=$s2 move $
49、s2,$s3 #$s2=$s3 addu $s3,$s2,$s1 addi $s4,$s4,1 #$s4=$s4-1 bnez $s4,loop #while($s4!=0)goto loopdone: sw $s3,0($a1) #store result in f ;编程指南编程指南1变量变量2分支分支3数组数组4过程调用过程调用5阅读、改良程序阅读、改良程序6设计实例设计实例2022-5-1948单指令计算机单指令计算机;MIPS汇编言语程序设计汇编言语程序设计 Hello world.textmain:la$a0, strli $v0, 4syscall# print stringli
50、$v0, 10syscall# exit.datastr: .asciiz Hello world.;MIPS汇编言语程序设计汇编言语程序设计系统调用系统调用MIPS模拟器提供了经过系统调用指令模拟器提供了经过系统调用指令(syscall) 提供了一组类似操作系统的效力提供了一组类似操作系统的效力调用方法:调用方法:将系统调用代码装入将系统调用代码装入$v0($2)存放器存放器将参数将参数(假设有假设有)装入装入$a0($4)$a3($7)或或$f12存放器存放器 Syscall前往值保管在前往值保管在$v0($2)或或$f0存放器中存放器中;MIPS汇编言语程序设计汇编言语程序设计系统调用系
51、统调用代码代码系统调用系统调用参数参数结果结果1print integer$a02print float$f123print double$f124print string$a0 5read integerinteger in $v06read floatfloat in $f07read doubledouble in $f08read string$a0=buffer, $a1=length9sbrk$a0=amountaddress in $v010exit;MIPS汇编言语程序设计汇编言语程序设计系统调用系统调用代码代码系统调用系统调用参数参数结果结果11print char$a012
52、read charchar in $v013open$a0=file name(string), $a1=flags, $a2=modefile descriptor (fd) in $v014read$a0 =fd, $a1=buffer, $a2=lengthnum chars read in $v015write$a0 =fd, $a1=buffer, $a2=lengthnum chars write in $v016close$a0 =fd17exit2$a0=result;MIPS汇编言语程序设计汇编言语程序设计栈动态数据(堆)静态数据正文 (指令)保管系统内存区.textmain
53、:la$a0, strli $v0, 4syscallli$v0, 10syscall.datastr: .asciiz Hello world.7fffeffc100400001001000000400000MARS商定商定;MIPS汇编言语程序设计汇编言语程序设计 从键盘输入两个数,计算并输出这两个数的和从键盘输入两个数,计算并输出这两个数的和.datastr1: .asciiz Enter 2 numbers:str2: .asciiz The sum is .text main: li $v0, 4la $a0, str1 syscall li $v0, 5 syscall add $
54、t0, $v0, $zero li $v0, 5 syscall add $t1, $v0, $zero li $v0, 4 la $a0, str2 syscall li $v0, 1 add $a0, $t1, $t0 syscall;MIPS汇编言语程序设计汇编言语程序设计 计算计算12+22+1002.textmain:li$t0, 1li$t8, 0loop:mul$t7, $t0, $t0add$t8, $t8, $t7addi$t0, $t0, 1ble$t0, 100, loopla$a0, strli $v0, 4syscallli $v0, 1move$a0, $t8syscallli$v0, 10syscall.data.align 2str:.asciiz The sum of square from 1 to 100 is ;一个排序算法的实例一个排序算法的实例void s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年海南省发展和改革委员会下属事业单位真题
- 四年级上册语文学科总结(5篇)
- 2025年秋季运动会通讯稿(19篇)
- 解除合同协议书不给
- 销售合同技术协议书范本
- 药房聘请员工合同协议书
- 合同结算方式变更协议书
- 村网共建合同协议书范文
- 个人装修质保合同协议书
- 业主解除总包合同协议书
- 海外仓合同范本
- 2024妇科恶性肿瘤抗体偶联药物临床应用指南(完整版)
- 2024-2029全球及中国电气电子中的CFD行业市场发展分析及前景趋势与投资发展研究报告
- 悬挑脚手架及卸料平台监理旁站记录表
- 神志病中西医结合临床诊疗指南-精神分裂症
- 人教部编版六年级语文下册第五单元(教案)
- 国有企业经济责任审计工作方案-全套
- 马拉松安保方案
- MOOC 电工学-西北工业大学 中国大学慕课答案
- 口腔科普馆建设方案
- 2024年全国高考物理电学实验真题(附答案)
评论
0/150
提交评论