MIPS 中两个数字的总和
Sum of two numbers in MIPS
我正在尝试练习我在 MIPS 中的编码技能(这是我第一次学习汇编语言)。我在下面写了这段代码来总结两个用户的输入,它是正确的。但是,代码很长..那么,有什么办法可以优化这段代码,使其更短吗?我需要一些建议。谢谢
.data
n1: .asciiz "enter your first number: "
n2: .asciiz "enter your second number: "
result: .asciiz "result is "
.text
#getting first input.
la $a0, n1
li $v0, 4
syscall
li $v0, 5
syscall
move $t0, $v0
#getting second input.
la $a0, n2
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
#calculate and print out the result.
la $a0, result
li $v0, 4
syscall
add $t3, $t0, $t1
move $a0, $t3
li $v0, 1
syscall
#end program.
li $v0, 10
syscall
我也写了一个计算阶乘数的程序。有更好的方法吗?
.data
str: .asciiz "Enter a number: "
result: .asciiz "The result is: "
.text
la $a0, str
li $v0, 4
syscall
li $v0, 5
syscall
move $s0, $v0 # move N into s0
li $s2, 1 # c = 1
li $s1, 1 # fact = 1
LOOP:
blt $s0, $s2, PRINT # if (n < c ) print the result
mul $s1, $s1, $s2 # fact = fact * c
add $s2, $s2, 1 # c = c + 1
j LOOP
PRINT:
la $a0, result
li $v0, 4
syscall
add $a0, $s1, $zero
li $v0, 1
syscall
li $v0, 10
syscall
除了使用临时寄存器$t0,...,$t9
,程序看起来还不错。当调用另一个函数或发出系统调用时,不能保证保留这些寄存器。 $s0,...,$s7
寄存器在调用中保留。
您需要将:move $t0, $v0
替换为move $s0, $v0
; move $t1, $v0
与 move $s1, $v0
和 add $t3, $t0, $t1
与 add $s3, $s0, $s1
。
我正在尝试练习我在 MIPS 中的编码技能(这是我第一次学习汇编语言)。我在下面写了这段代码来总结两个用户的输入,它是正确的。但是,代码很长..那么,有什么办法可以优化这段代码,使其更短吗?我需要一些建议。谢谢
.data
n1: .asciiz "enter your first number: "
n2: .asciiz "enter your second number: "
result: .asciiz "result is "
.text
#getting first input.
la $a0, n1
li $v0, 4
syscall
li $v0, 5
syscall
move $t0, $v0
#getting second input.
la $a0, n2
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
#calculate and print out the result.
la $a0, result
li $v0, 4
syscall
add $t3, $t0, $t1
move $a0, $t3
li $v0, 1
syscall
#end program.
li $v0, 10
syscall
我也写了一个计算阶乘数的程序。有更好的方法吗?
.data
str: .asciiz "Enter a number: "
result: .asciiz "The result is: "
.text
la $a0, str
li $v0, 4
syscall
li $v0, 5
syscall
move $s0, $v0 # move N into s0
li $s2, 1 # c = 1
li $s1, 1 # fact = 1
LOOP:
blt $s0, $s2, PRINT # if (n < c ) print the result
mul $s1, $s1, $s2 # fact = fact * c
add $s2, $s2, 1 # c = c + 1
j LOOP
PRINT:
la $a0, result
li $v0, 4
syscall
add $a0, $s1, $zero
li $v0, 1
syscall
li $v0, 10
syscall
除了使用临时寄存器$t0,...,$t9
,程序看起来还不错。当调用另一个函数或发出系统调用时,不能保证保留这些寄存器。 $s0,...,$s7
寄存器在调用中保留。
您需要将:move $t0, $v0
替换为move $s0, $v0
; move $t1, $v0
与 move $s1, $v0
和 add $t3, $t0, $t1
与 add $s3, $s0, $s1
。