MIPS汇编范例

上传人:油** 文档编号:49933673 上传时间:2022-01-19 格式:DOC 页数:9 大小:35KB
返回 下载 相关 举报
MIPS汇编范例_第1页
第1页 / 共9页
MIPS汇编范例_第2页
第2页 / 共9页
MIPS汇编范例_第3页
第3页 / 共9页
点击查看更多>>
资源描述
精品文档,仅供学习与交流,如有侵权请联系网站删除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 #打印msg1 la $a0, msg1 syscall li $v0, 1 #打印转换前$t1中的值 move $a0, $t1 syscall li $v0, 4 #打印msg2 la $a0, msg2 syscall li $v0, 1 #打印转换前$t2中的值 move $a0, $t2 syscall move $t3, $t1 #关键部分,在寄存器间move数据 move $t1, $t2 move $t2, $t3 li $v0, 4 #打印msg3 la $a0, msg3 syscall li $v0, 1 #打印转换后$t1中的值 move $a0, $t1 syscall li $v0, 4 #打印换行符 /n la $a0, msg4 syscall li $v0, 1 #打印转换后$t2中的值 move $a0, $t2 syscall# data segment # .datanumber: .word 12,34msg1: .asciiz the first number is:nmsg2: .asciiz nthe second number is:nmsg3: .asciiz nnow they are swapped as:nmsg4: .ascii n# end of file程序运行结果为:本文来自CSDN博客,转载请标明出处:mips汇编简单实例一个小计算器 收藏 其实开始的时候一直在看 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 SPIM main: la $t0, value # load address value into $t0 la $a0,msg0 li $v0,4 syscall #print please choose the operation: li $v0, 5 syscall sw $v0, 8($t0) la $a0,msg1 li $v0,4 syscall #print first num: li $v0, 5 syscall sw $v0, 0($t0) la $a0,msg2 li $v0,4 syscall #print second num: li $v0, 5 syscall sw $v0, 4($t0) #read the other num la $a0,newline li $v0,4 syscall #print n lw $t1, 0($t0) # load the first num lw $t2, 4($t0) # load the second num lw $t3, 8($t0) # load the operation beq $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 = $t4 sw $t4, 12($t0) # la $t5,addFlag j printResult subOp: sub $t4, $t1, $t2 # $t1 - $t2 = $t4 sw $t4, 12($t0) la $t5,subFlag j printResult mulOp: mul $t4, $t1, $t2 # $t1 * $t2 = $t4 sw $t4, 12($t0) la $t5,mulFlag j printResult divOp: div $t4, $t1, $t2 # $t1 / $t2 = $t4 sw $t4, 12($t0) la $t5,divFlag j printResult printResult: lw $a0,0($t0) li $v0,1 syscall #read first number la $a0,0($t5) li $v0,4 syscall #print opflag lw $a0,4($t0) li $v0,1 syscall #print second number la $a0,equalStr li $v0,4 syscall #print = lw $a0,12($t0) li $v0,1 syscall # print sum result j exit exit: la $a0,newline li $v0,4 syscall #print n li $v0,10 syscall # exit # data section .data value: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:result msg0 : .asciiz please choose the operation(14):ntt1 : +,addition ntt2 : -,subtracterntt3 : * multiplication ntt4 : /,divisionn 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,msg0 li $v0,4 syscall#print please choose the operation:li$v0, 5syscallsw$v0, 8($t0)la $a0,msg1 li $v0,4 syscall#print first num:li$v0, 5syscallsw$v0, 0($t0)la $a0,msg2 li $v0,4 syscall#print second num:li$v0, 5syscallsw$v0, 4($t0)#read the other numla $a0,newline li $v0,4 syscall#print nlw $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 = $t4 sw $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,1 syscall#read first numberla $a0,0($t5) li $v0,4 syscall#print opflaglw $a0,4($t0) li $v0,1 syscall#print second numberla $a0,equalStr li $v0,4 syscall#print = lw $a0,12($t0) li $v0,1 syscall# print sum resultj exitexit:la $a0,newline li $v0,4 syscall#print n li $v0,10 syscall# exit# data section.datavalue:.word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:resultmsg0:.asciiz please choose the operation(14):ntt1 : +,addition ntt2 : -,subtracterntt3 : * multiplication ntt4 : /,divisionnmsg1:.asciiz first num:msg2:.asciiz second num:addFlag: .asciiz + subFlag: .asciiz - mulFlag: .asciiz * divFlag: .asciiz / equalStr: .asciiz = newline:.asciiz n=n 运行效果截图如下:本文来自CSDN博客,转载请标明出处:本文来自CSDN博客,转载请标明出处:高精度整数除法(MIPS汇编) 收藏 .datatitle: .asciiz tt高精度除法演示程序ntip1: .asciiz n请输入被除数:tip2: .asciiz 请输入除数:tip3: .asciiz 要输出小数点后多少位:tip4: .asciiz n是否继续?(y/n)err: .asciiz n除数不能为0,请重新输入ndot: .asciiz .sign: .asciiz -buf: .byte 0:16 .text.globl _start_start:#输出标题 li $v0, 4 la $a0, title syscall#提示输入被除数并接收输入 restart: li $v0, 4 la $a0, tip1 syscall li $v0, 5 syscall move $t0, $v0#提示输入除数并接收输入 input_again: li $v0, 4 la $a0, tip2 syscall li $v0, 5 syscall move $t1, $v0#检测除数是否为0,是则输出错误信息并跳转到除数输入处,否则继续执行 bnez $t1, next li $v0, 4 la $a0, err syscall j input_again#提示输入要求的小数位数并接收输入next: li $v0, 4 la $a0, tip3 syscall li $v0, 5 syscall move $t2, $v0#两数进行除法运算,把运算结果保存到寄存器$t8和$t9 div $t0, $t1 move $s0, $zero mflo $t8 mfhi $t9#检测商是否为0,是则继续执行下一步,否则跳转到输出整数结果处 bnez $t8, int_result #检测被除数是否为非负数,是则检查除数,否则置$s0为1,$s0用来记录负数的个数 bgez $t0, next_check addi $s0, $zero, 1#检测除数是否为非负数,是则输出-号,否则$s0加1 next_check: bgez $t1, print_sign addi $s0, $s0, 1#输出-号,如果$s0值不为1,即负数个数不为奇数,则跳过此步 print_sign: bne $s0, 1, int_result li $v0, 4 la $a0, sign syscall#输出整数部分结果 int_result: li $v0, 1 move $a0, $t8 syscall#输出小数点 li $v0, 4 la $a0, dot syscall#检测余数是否不小于0,是则跳转到下一步执行,否则取反 bgez $t9, next_num neg $t9, $t9#检测除数是否不小于0,是则转入下一步,否则取反 next_num: bgez $t1, isloop neg $t1, $t1#余数乘以10,再除以除数,得到新的商和余数 isloop: move $t8, $t9 mul $t8, $t8, 10 div $t8, $t1 mflo $t8 mfhi $t9#输出新的商 li $v0, 1 move $a0, $t8 syscall#小数位数记录减1,当其大于0时继续回到上一标号处执行,否则转入下一步 sub $t2, $t2, 1 bgtz $t2, isloop#显示提示信息是否要重新开始, li $v0, 4 la $a0, tip4 syscall#接收字符输入 li $v0, 8 la $a0, buf li $a1, 16 syscall#输入的第一字符为y时则重新开始, 否则结束程序 lbu $t3, buf beq $t3, 121, restart li $v0, 10 syscall本文来自CSDN博客,转载请标明出处:【精品文档】第 9 页
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!