mips汇编语言之实现swap函数 收藏 此程序用来交换两个整数 已在pcspim下编译通过 ##
################################################## #
#### programed by stevie zou ### # purpose:to swap two values # ##### 10-15-2008 ######### ################ ##
############# text segment ############### .text .globl main
main: 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 la $a0, msg2 syscall li $v0, 1 move $a0, $t2 syscall move $t3, $t1 move $t1, $t2 move $t2, $t3 li $v0, 4 la $a0, msg3 syscall #打印msg2 #打印转换前$t2中的值 #关键部分,在寄存器间move数据 #打印msg3
.
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 ############## .data number: .word 12,34
msg1: .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
博
客
,
转
载
请
标
明
http://blog.csdn.net/yihaozou/archive/2008/10/19/3081322.aspx
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
li $v0, 5 syscall
sw $v0, 4($t0)
la $a0,newline li $v0,4 syscall
#print \" second num:\" #read the other num #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 beq $t3,3,mulOp beq $t3,4,divOp addOp:
add $t4, $t1, $t2 sw $t4, 12($t0) la $t5,addFlag j printResult subOp:
sub $t4, $t1, $t2 sw $t4, 12($t0) la $t5,subFlag j printResult mulOp:
mul $t4, $t1, $t2 sw $t4, 12($t0)
# if - # if * # if / # $t1 + $t2 = $t4 # # $t1 - $t2 = $t4 # $t1 * $t2 = $t4 .
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
la $a0,0($t5) li $v0,4
syscall
lw $a0,4($t0) li $v0,1 syscall
la $a0,equalStr #read first number #print opflag #print second number
.
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(1~4):\\n\\1 : +,addition \\n\\2 : -,subtracter\\n\\3 : * multiplication \\n\\4 : /,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 # call main by SPIM
.globl main main:
la $t0, value la $a0,msg0
# load address \"value\" into $t0
li $v0,4 syscall
li
$v0, 5
#print \"please choose the operation:\"
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
li
$v0, 5
syscall
sw $v0, 4($t0)
la $a0,newline
li $v0,4 syscall
lw $t1, 0($t0) lw $t2, 4($t0) lw $t3, 8($t0)
.
#print \" second num:\"
#read the other num
#print \"\\n\"
# load the first num # load the second num
# load the operation
beq $t3,1,addOp beq $t3,2,subOp beq $t3,3,mulOp beq $t3,4,divOp
addOp: add $t4, $t1, $t2 sw $t4, 12($t0) la $t5,addFlag
j printResult
subOp: sub $t4, $t1, $t2 sw $t4, 12($t0) la $t5,subFlag
j printResult
mulOp: mul $t4, $t1, $t2 sw $t4, 12($t0) la $t5,mulFlag
j printResult
divOp:
div $t4, $t1, $t2
.
# if +
# if -
# if *
# if /
# $t1 + $t2 = $t4
#
# $t1 - $t2 = $t4
# $t1 * $t2 = $t4
# $t1 / $t2 = $t4
sw $t4, 12($t0) la $t5,divFlag j printResult
printResult:
lw $a0,0($t0)
li $v0,1 syscall
la $a0,0($t5)
li $v0,4 syscall
lw $a0,4($t0)
li $v0,1 syscall
la $a0,equalStr
li $v0,4 syscall
lw $a0,12($t0)
.
#read first number
#print opflag
#print second number
#print \" = \"
.
li $v0,1 syscall
j exit
# print sum result
exit:
la $a0,newline
li $v0,4 syscall
#print \" \\n \"
li $v0,10 syscall # data section .data
# exit
value: .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\\1 : +,addition
\\n\\2 : -,subtracter\\n\\3 : * multiplication \\n\\4 : /,division\\n\" msg1 msg2
: :
.asciiz \"first num:\" .asciiz \"second num:\"
addFlag subFlag mulFlag divFlag
: .asciiz \" + \" : .asciiz \" - \" : .asciiz \" * \" : .asciiz \" / \"
.
equalStr : .asciiz \" = \" newline
运行效果截图如下:
:
.asciiz \"\\n===============================\\n\"
本
文
来
自
CSDN
博
客
,
转
载
请
标
明
出
处
:
http://blog.csdn.net/oncoding/archive/2009/07/15/4346531.aspx 本
文
来
自
CSDN
博
客
,
转
载
请
标
明
出
处
:
http://blog.csdn.net/oncoding/archive/2009/07/15/4346531.aspx
.
高精度整数除法(MIPS汇编) 收藏 .data
title: .asciiz \"\\高精度除法演示程序\\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, 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
博
客
,
转
载
请
标
明
http://blog.csdn.net/masm32v9/archive/2010/02/28/5331042.aspx
出
处
.
:
因篇幅问题不能全部显示,请点此查看更多更全内容