MIPS汇编语言 - 基本

时间:2016-01-11 18:06:58

标签: assembly mips

对于我的学校项目,我必须使用汇编语言在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?我是汇编语言的新手

3 个答案:

答案 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