您的当前位置:首页正文

MIPS汇编样式规范

2023-08-09 来源:九壹网
 .

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

.

因篇幅问题不能全部显示,请点此查看更多更全内容