当前位置:文档之家› MIPS汇编范例复习过程

MIPS汇编范例复习过程

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。

相关主题