MIPS汇编范例复习过程
- 格式:doc
- 大小:82.50 KB
- 文档页数:14
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==mips汇编范例篇一:MIPS汇编范例mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过#########################################################programed by stevie zou #### purpose:to swap two values ######10-15-201X######### ############################### text segment ###############.text.globl mainmain: la$t0, number #读取两个整数并放入寄存器$t1,$t2lw$t1, 0($t0)lw$t2, 4($t0)li$v0, 4#打印msg1la$a0, msg1li$v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli$v0, 4 #打印msg2la$a0, msg2syscallli$v0, 1#打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1#关键部分,在寄存器间move数据move $t1, $t2move $t2, $t3li$v0, 4 #打印msg3la$a0, msg3syscallli$v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli$v0, 4#打印换行符 /nla$a0, msg4syscallli$v0, 1#打印转换后$t2中的值move $a0, $t2########### data segment ##############.datanumber: .word 12,34msg1: .asciiz "the first number is:\n"msg2: .asciiz "\nthe second number is:\n"msg3: .asciiz "\nnow they are swapped as:\n"msg4: .ascii"\n"## end of file程序运行结果为:本文来自CSDN博客,转载请标出处明:mips汇编简单实例——一个小计算器收藏其实开始的时候一直在看 mips的指令格式,看了、忘了,没什么效果。
汇编语言期末复习总结范文(完整版)〔习题1.24〕说明下列指令中源操作数的寻址方式?如果B某=2000H,DI=40H,给出D某的值或有效地址EA的值。
(1)movd某,[1234h]直接寻址,EA=1234H(3)movd某,b某寄存器寻址,D某=2000H(6)movd某,[b某+di]基址变址寻址,EA=2040H第2章8086的指令系统〔习题2.1〕已知DS=2000H、B某=0100H、SI=0002H,存储单元[20220H]~[20223H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后A某寄存器的内容。
(1)mova某,1200hA某=1200H(2)mova某,b某A某=0100H(3)mova某,[1200h]A某=4C2AH;偏移地址=1200h(4)mova某,[b 某]A某=3412H;偏移地址=b某=0100h(5)mova某,[b某+1100h]A某=4C2AH;偏移地址=b某+1100h=1200h (6)mova某,[b某+i]A某=7856H;偏移地址=b某+i=0100h+0002h=0102h(7)mova某,[b某][i+1100h]A某=65B7H;偏移地址b某+i+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)movc某,dl两操作数类型不匹配(2)movip,a某IP指令指针禁止用户访问(3)move,1234h立即数不允许传给段寄存器(DS、CS、SS、ES)(4)move,d段寄存器之间不允许传送(5)moval,300两操作数类型不匹配(6)mov[p],a某目的操作数应为[SI](7)mova某,b某+di源操作数应为[B某+DI](8)mov20h,ah立即数不能作目的操作数〔习题2.8〕请分别用一条汇编语言指令完成如下功能:(1)把B某寄存器和D某寄存器的内容相加,结果存入D某寄存器。
mips金字塔例题引言:MIPS(Microprocessor without Interlocked Pipeline Stages)是一种经典的RISC(Reduced Instruction Set Computing)指令集架构。
在学习MIPS编程的过程中,金字塔例题是一个常见的练习,通过编写MIPS汇编语言来构建一个金字塔的图案。
本文将介绍金字塔的例题,包括实现思路、代码分析和代码实现等方面内容。
一、实现思路金字塔是一个由等腰三角形构成的图案,其中每一行的星号数量递增。
实现金字塔的方法可以通过循环和条件判断语句来实现。
下面是一个实现金字塔的思路:1. 首先,确定金字塔的高度,即金字塔的行数,可以通过用户输入或者在代码中直接指定。
2. 使用两个循环来构建金字塔。
外层循环控制金字塔的行数,内层循环控制每一行的星号数量。
3. 内层循环的次数取决于当前行数,根据公式2*(当前行数)-1可以计算出每一行的星号数量。
4. 在每一行的星号数量确定后,可以通过循环打印星号和空格来构建金字塔。
5. 打印完一行后,换行继续打印下一行的星号。
二、代码分析下面是一个实现金字塔的MIPS汇编代码的分析:1. 通过读取用户输入获取金字塔的高度,保存在寄存器中。
2. 初始化外层循环计数器并保存在寄存器中,用于控制金字塔的行数。
3. 进入外层循环,检查循环计数器是否为0,如果为0则退出循环,否则进入下一次循环。
4. 初始化内层循环计数器并保存在寄存器中,用于控制每一行的星号数量。
5. 进入内层循环,循环计数器递减,检查循环计数器是否为0,如果为0则退出循环,否则进入下一次循环。
6. 打印星号。
7. 内层循环结束,换行。
8. 外层循环计数器递减。
9. 外层循环结束,退出程序。
三、代码实现下面是一个简单实现金字塔的MIPS汇编代码示例:.datamsg: .asciiz "请输入金字塔的高度:"height: .word 0.text.globl mainmain:# 打印提示信息li $v0, 4la $a0, msgsyscall# 读取用户输入li $v0, 5syscallmove $t0, $v0# 保存用户输入到height变量 sw $t0, height# 初始化外层循环计数器li $t1, 1# 外层循环outer_loop:# 判断外层循环是否结束 beqz $t1, exit# 初始化内层循环计数器 move $t2, $t1# 内层循环inner_loop:# 判断内层循环是否结束 beqz $t2, line_break# 打印星号li $v0, 11li $a0, '*'syscall# 内层循环计数器递减 subiu $t2, $t2, 1j inner_loop# 换行line_break:li $v0, 11li $a0, '\n'syscall# 外层循环计数器递减subiu $t1, $t1, 1j outer_loop# 退出程序exit:li $v0, 10syscall结论:通过本文的介绍,我们可以了解到如何使用MIPS汇编语言来实现一个金字塔的例题。
MIPS汇编学习MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等⼀些嵌⼊式设备中。
mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通⽤寄存器,但是不同于x86汇编,mips汇编中没有ebp/rbp寄存器。
mips每条指令都⽤固定的长度,每条指令都是四个字节,所以内存数据的访问必须以32位严格对齐,这⼀点也不同于x86汇编。
通过⼀个demo,⽤mips-linux-gnu-gcc编译,通过IDA远程调试,来理解mips汇编中的⼀些概念。
#include<stdio.h>int sum(int a,int b){return a+b;}int main(){int a=1,b=2,c;c=sum(a,b);printf("%d\n",c);return 0;}32个通⽤寄存器的功能和使⽤约定定义如下:mips汇编中重要的寄存器: 1.堆栈指针$sp,也就是$29指向堆栈的栈顶,类似于x86中的ebp和rbp指针; 2.$0寄存器的值始终为常数0; 3.PC寄存器保留程序执⾏的下⼀条指令,相当于x86架构中的eip寄存器; 4.参数传递的时候,$a0-$a3寄存器保存函数的前四个参数,其他的参数保存在栈中; 5.$ra寄存器,保存着函数的返回地址,这⼀点也不同于x86汇编中将返回地址保存在栈中。
在函数A执⾏到调⽤函数B的指令时,函数调⽤指令复制当前的$PC寄存器的值到$RA寄存器,然后跳转到B函数去执⾏,即当前$RA寄存器的值就是函数执⾏结束时的返回地址。
如上图所⽰,调⽤sum函数之前,$ra寄存器的值是0x7f62eca8。
进⼊分⽀延迟槽之后,$ra寄存器的值被赋值为$pc寄存器的下⼀条指令地址。
在结束sun函数调⽤之后,通过:jr $ra指令跳转回main函数继续执⾏。
5.mips架构下,对静态数据段的访问,通过$gp寄存器配合基址寻址来实现; 7.$30寄存器表⽰帧指针,指向正在被调⽤的栈桢,mips和x86由于堆栈结构的区别,调⽤栈时会出现⼀些不同。
mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过######################################################### programed by stevie zou #### purpose:to swap two values ###### 10-15-2008 ######### ############################### text segment ###############.text.globl mainmain: la $t0, number #读取两个整数并放入寄存器$t1,$t2 lw $t1, 0($t0)lw $t2, 4($t0)li $v0, 4 #打印msg1la $a0, msg1syscallli $v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli $v0, 4 #打印msg2la $a0, msg2syscallli $v0, 1 #打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1 #关键部分,在寄存器间move数据move $t1, $t2move $t2, $t3li $v0, 4 #打印msg3la $a0, msg3syscallli $v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli $v0, 4 #打印换行符/nla $a0, msg4syscallli $v0, 1 #打印转换后$t2中的值move $a0, $t2syscall########### data segment ##############.datanumber: .word 12,34msg1: .asciiz "the first number is:\n"msg2: .asciiz "\nthe second number is:\n"msg3: .asciiz "\nnow they are swapped as:\n"msg4: .ascii "\n"## end of file程序运行结果为:本文来自CSDN博客,转载请标明出处:/yihaozou/archive/2008/10/19/3081322.aspxmips汇编简单实例——一个小计算器收藏其实开始的时候一直在看mips的指令格式,看了、忘了,没什么效果。
MIPS汇编指令学习MIPS汇编语⾔基础 MIPS的系统结构及设计理念⽐较先进,其指令系统经过通⽤处理器指令体系MIPS I、MIPS II、MIPS III、MIPS IV、MIPS V,以及嵌⼊式指令体系MIPS16、MIPS32到MIPS64的发展。
MIPS32的架构是⼀种基于固定长度的定期编码指令集,并采⽤导⼊/存储(load/store)数据模型。
经改进,这种架构可⽀持⾼级语⾔的优化执⾏。
在路由器中,经常使⽤的⼀种MIPS架构就是MIPS32。
MIPS寄存器 RISC的⼀个显著特点就是⼤量使⽤寄存器。
因为寄存器的存取可以在⼀个时钟周期内完成,同时简化了寻找⽅式,所以,MIPS32的指令中除了加载/存储指令以外,都使⽤寄存器或者⽴即数作为操作数,以便让编译器通过保持对寄存器内数据的频繁存取进⼀步优化代码的⽣成性能。
MIPS32寄存器分为两类:通⽤寄存器(GPR)和特殊寄存器。
1、通⽤寄存器(GPR) 在MIPS体系结构中有32个通⽤寄存器,在汇编程序中可以⽤编号$0~$31表⽰,也可以⽤寄存器的名字表⽰,如$sp、$t1、$ta等,如图,堆栈是从内存的⾼地址⽅向向低地址⽅向增长的。
编号寄存器名称寄存器描述0 zero第0号寄存器,其值始终为01$at保留寄存器2~3$v0~v1values, 保存表达式或函数返回结果4-7$a0~a3aruments, 作为函数的前4个参数8~15$t0~$t7temporaries,供汇编程序使⽤的临时寄存器16~23$s0~$s7saved values,⼦函数使⽤时需要先保存原寄存器的值24~25$t8~t9temporaries, 供汇编程序的临时寄存器,补充$t0~t726~27$k0~$k1保留,中断处理函数使⽤28$gp global pointer,全局指针29$sp stack pointer, 堆栈指针,指向堆栈的栈顶30$fp frame pointer, 保存栈指针31$ra return address, 返回地址$0:即$zero,该寄存器总是返回0,为0这个有⽤常数提供了⼀个简洁的编码形式。
M I P S汇编范例mips汇编语言之实现swap函数收藏此程序用来交换两个整数已在pcspim下编译通过#################################################### ##### programed by stevie zou #### purpose:to swap two values ###### 10-15-2008 ######### ############################### text segment ###############.text.globl mainmain: la $t0, number #读取两个整数并放入寄存器$t1,$t2 lw $t1, 0($t0)lw $t2, 4($t0)li $v0, 4 #打印msg1la $a0, msg1syscallli $v0, 1 #打印转换前$t1中的值move $a0, $t1syscallli $v0, 4 #打印msg2la $a0, msg2syscallli $v0, 1 #打印转换前$t2中的值move $a0, $t2syscallmove $t3, $t1 #关键部分,在寄存器间move数据 move $t1, $t2move $t2, $t3li $v0, 4 #打印msg3la $a0, msg3syscallli $v0, 1 #打印转换后$t1中的值move $a0, $t1syscallli $v0, 4 #打印换行符 /nla $a0, msg4syscallli $v0, 1 #打印转换后$t2中的值move $a0, $t2syscall########### data segment ##############.datanumber: .word 12,34msg1: .asciiz "the first number is:\n"msg2: .asciiz "\nthe second number is:\n"msg3: .asciiz "\nnow they are swapped as:\n"msg4: .ascii "\n"## end of file程序运行结果为:本文来自CSDN博客,转载请标明出处:/yihaozou/archive/2008/10/19/3081322.aspxmips汇编简单实例——一个小计算器收藏其实开始的时候一直在看 mips的指令格式,看了、忘了,没什么效果。
现在通过这个例子,简单训练一下: mips汇编中:常用寄存器的使用;系统调用: 1(print_int),4(print_str),5(read_int),10(exit);算术运算: add,sub,mul,div;逻辑运算及跳转;上代码:(汇编写的少,代码书写、风格还很差劲,感谢请大虾指教):view plaincopy to clipboardprint?#sample example 'a small calculater’.text # text section.globl main # call main by SPIMmain:la $t0, value # load address "value" into $t0 la $a0,msg0li $v0,4syscall #print "please choose the operation:" li $v0, 5syscallsw $v0, 8($t0)la $a0,msg1li $v0,4syscall #print "first num:"li $v0, 5syscallsw $v0, 0($t0)la $a0,msg2li $v0,4syscall #print " second num:"li $v0, 5syscallsw $v0, 4($t0) #read the other numla $a0,newlineli $v0,4syscall #print "\n"lw $t1, 0($t0) # load the first numlw $t2, 4($t0) # load the second numlw $t3, 8($t0) # load the operationbeq $t3,1,addOp # if +beq $t3,2,subOp # if -beq $t3,3,mulOp # if *beq $t3,4,divOp # if /addOp:add $t4, $t1, $t2 # $t1 + $t2 = $t4sw $t4, 12($t0) #la $t5,addFlagj printResultsubOp:sub $t4, $t1, $t2 # $t1 - $t2 = $t4 sw $t4, 12($t0)la $t5,subFlagj printResultmulOp:mul $t4, $t1, $t2 # $t1 * $t2 = $t4 sw $t4, 12($t0)la $t5,mulFlagj printResultdivOp:div $t4, $t1, $t2 # $t1 / $t2 = $t4 sw $t4, 12($t0)la $t5,divFlagj printResultprintResult:lw $a0,0($t0)li $v0,1syscall #read first numberla $a0,0($t5)li $v0,4syscall #print opflaglw $a0,4($t0)li $v0,1syscall #print second number la $a0,equalStrli $v0,4syscall #print " = "lw $a0,12($t0)li $v0,1syscall # print sum resultj exitexit:la $a0,newlineli $v0,4syscall #print " \n "li $v0,10syscall # exit# data section.datavalue: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:result msg0 : .asciiz " please choose the operation(1~4):\n\t\t1 : +,addition \n\t\t2 : -,subtracter\n\t\t3 : * multiplication \n\t\t4 : /,division\n"msg1 : .asciiz "first num:"msg2 : .asciiz "second num:"addFlag : .asciiz " + "subFlag : .asciiz " - "mulFlag : .asciiz " * "divFlag : .asciiz " / "equalStr : .asciiz " = "newline : .asciiz "\n===============================\n"#sample example 'a small calculater’.text # text section.globl main # call main by SPIMmain:la $t0, value # load address "value" into $t0la $a0,msg0li $v0,4syscall #print "please choose the operation:"li $v0, 5syscallsw $v0, 8($t0)la $a0,msg1li $v0,4syscall #print "first num:"li $v0, 5syscallsw $v0, 0($t0)la $a0,msg2li $v0,4syscall #print " second num:"li $v0, 5syscallsw $v0, 4($t0) #read the other numla $a0,newlineli $v0,4syscall #print "\n"lw $t1, 0($t0) # load the first numlw $t2, 4($t0) # load the second numlw $t3, 8($t0) # load the operationbeq $t3,1,addOp # if +beq $t3,2,subOp # if -beq $t3,3,mulOp # if *beq $t3,4,divOp # if /addOp:add $t4, $t1, $t2 # $t1 + $t2 = $t4sw $t4, 12($t0) #la $t5,addFlagj printResultsubOp:sub $t4, $t1, $t2 # $t1 - $t2 = $t4sw $t4, 12($t0)la $t5,subFlagj printResultmulOp:mul $t4, $t1, $t2 # $t1 * $t2 = $t4sw $t4, 12($t0)la $t5,mulFlagj printResultdivOp:div $t4, $t1, $t2 # $t1 / $t2 = $t4sw $t4, 12($t0)la $t5,divFlagj printResultprintResult:lw $a0,0($t0)li $v0,1syscall #read first numberla $a0,0($t5)li $v0,4syscall #print opflaglw $a0,4($t0)li $v0,1syscall #print second numberla $a0,equalStrli $v0,4syscall #print " = "lw $a0,12($t0)li $v0,1syscall # print sum resultj exitexit:la $a0,newlineli $v0,4syscall #print " \n "li $v0,10syscall # exit# data section.datavalue: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:result msg0 : .asciiz " please choose the operation(1~4):\n\t\t1 : +,addition \n\t\t2 : -,subtracter\n\t\t3 : * multiplication \n\t\t4 : /,division\n"msg1 : .asciiz "first num:"msg2 : .asciiz "second num:"addFlag : .asciiz " + "subFlag : .asciiz " - "mulFlag : .asciiz " * "divFlag : .asciiz " / "equalStr : .asciiz " = "newline : .asciiz"\n===============================\n"运行效果截图如下:本文来自CSDN博客,转载请标明出处:/oncoding/archive/2009/07/15/4346531.aspx本文来自CSDN博客,转载请标明出处:/oncoding/archive/2009/07/15/4346531.aspx高精度整数除法(MIPS汇编)收藏.datatitle: .asciiz "\t\t高精度除法演示程序\n"tip1: .asciiz "\n请输入被除数:"tip2: .asciiz "请输入除数:"tip3: .asciiz "要输出小数点后多少位:"tip4: .asciiz "\n是否继续?(y/n)"err: .asciiz "\n除数不能为0,请重新输入\n"dot: .asciiz "."sign: .asciiz "-"buf: .byte 0:16.text.globl __start__start:#输出标题li $v0, 4la $a0, titlesyscall#提示输入被除数并接收输入restart:li $v0, 4la $a0, tip1syscallli $v0, 5syscallmove $t0, $v0#提示输入除数并接收输入input_again:li $v0, 4la $a0, tip2syscallli $v0, 5syscallmove $t1, $v0#检测除数是否为0,是则输出错误信息并跳转到除数输入处,否则继续执行 bnez $t1, nextla $a0, errsyscallj input_again#提示输入要求的小数位数并接收输入next:li $v0, 4la $a0, tip3syscallli $v0, 5syscallmove $t2, $v0#两数进行除法运算,把运算结果保存到寄存器$t8和$t9div $t0, $t1move $s0, $zeromflo $t8mfhi $t9#检测商是否为0,是则继续执行下一步,否则跳转到输出整数结果处bnez $t8, int_result#检测被除数是否为非负数,是则检查除数,否则置$s0为1,$s0用来记录负数的个数bgez $t0, next_checkaddi $s0, $zero, 1#检测除数是否为非负数,是则输出-号,否则$s0加1next_check:bgez $t1, print_signaddi $s0, $s0, 1#输出-号,如果$s0值不为1,即负数个数不为奇数,则跳过此步print_sign:bne $s0, 1, int_resultla $a0, signsyscall#输出整数部分结果int_result:li $v0, 1move $a0, $t8syscall#输出小数点li $v0, 4la $a0, dotsyscall#检测余数是否不小于0,是则跳转到下一步执行,否则取反bgez $t9, next_numneg $t9, $t9#检测除数是否不小于0,是则转入下一步,否则取反next_num:bgez $t1, isloopneg $t1, $t1#余数乘以10,再除以除数,得到新的商和余数isloop:move $t8, $t9mul $t8, $t8, 10div $t8, $t1mflo $t8mfhi $t9#输出新的商li $v0, 1move $a0, $t8syscall#小数位数记录减1,当其大于0时继续回到上一标号处执行,否则转入下一步sub $t2, $t2, 1bgtz $t2, isloop#显示提示信息是否要重新开始,li $v0, 4la $a0, tip4syscall#接收字符输入li $v0, 8la $a0, bufli $a1, 16syscall#输入的第一字符为y时则重新开始, 否则结束程序lbu $t3, bufbeq $t3, 121, restartli $v0, 10syscall本文来自CSDN博客,转载请标明出处:/masm32v9/archive/2010/02/28/5331042.aspx。