对于我的学校项目,我必须使用汇编语言在MARS 4.5中创建一个简单的程序。到目前为止令我困惑的是存储数字。在这个程序中,我必须存储2个用户输入的数字。到目前为止这是我的代码...
.data
.text
main:
jal GetUserInput
li $v0, 10
syscall
GetUserInput:
#get the input
li $v0, 5
syscall
#move the input
move $t0, $v0
#display the input
li $v0, 1
move $a0, $t0
syscall
所以在main函数中它将运行getuserinput函数,然后它将获取输入并将其移动到$ t0。这是否意味着在c#术语中它基本上是一个变量" int $ t0 = 10"提供10是我输入的号码,我可以在程序中稍后更改该号码?现在,如果我想要2个存储的数字,我将另一个存储在哪个,$ t1?我是汇编语言的新手
答案 0 :(得分:0)
您可以将数字存储在各种寄存器中(例如t0,t1,...),但您也可以将这些数字存储在内存中。
如果您使用C编译器进行MIPS并关闭优化,则生成的代码可能会将值存储在内存中。
事实上,MIPS CPU是为程序员(或编译器)提供最大“自由”的CPU之一。
答案 1 :(得分:0)
你的函数正在做的是接受一个输入,临时保存它,然后在控制台上打印该输入。要存储多个数字,您可能需要形成一个返回特定整数的函数,这相当简单。
在 MIPS 处理器上使用 $v0
作为函数返回值是很常见的。当然,您可以随意为自己的函数想出任何您想要的调用约定,但除非您有充分的理由不建议使用 $v0
作为返回值。
为了调用函数,请使用 jal
,因为它会设置 $ra
寄存器,以便您稍后可以使用 jr $ra
返回。
所以为了存储两个整数,你的代码如下:
.data
.text
main:
jal GetUserInput
add $s0,$s0,$v0
li $v0, 1
move $a0,$s0
syscall
jal GetUserInput
add $s1,$s1,$v0
li $v0, 1
move $a0,$s0
syscall
li $v0, 10 #End program
syscall
GetUserInput:
li $v0, 5 #Get the input
syscall
jr $ra
答案 2 :(得分:0)
要存储您不一定需要使用寄存器的任何值,您可以在 .data 部分中创建的变量中存储尽可能多的值。这不仅可以帮助您高效地编写代码,还可以使寄存器免费使用,无需担心丢失值。
.data
# Declare as many variables as you want, so that you have more registers in hand
num1: .word 0 # Number data type initially setting equals to zero
num2: .word 0
line_feed: .asciiz "\n" # Line feed in order to change line.
print_command: .asciiz "Showing you number: "
ask_user: .asciiz "Enter number: "
.text
.globl mian
main:
# Taking input form user
jal take_input
sw $v0, num1 # Storing user input to variable.
jal take_input
sw $v0, num2 # Storing user input to variable.
# Printing first number
li $v0, 4
la $a0, print_command
syscall
lw $t0, num1
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, line_feed
syscall
# Printing second number
li $v0, 4
la $a0, print_command
syscall
lw $t0, num2
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, line_feed
syscall
# Exit Block In order to prevent infinite loop writing it befoere other procedures.
exit:
li $v0, 10
syscall
# A porcedure to take input form user
take_input:
li $v0, 4
la $a0, ask_user
syscall
li $v0, 5
syscall
jr $ra