如何在spim中使用预定义的整数值

时间:2016-03-23 21:26:39

标签: spim

我已经编写了这段代码,但遇到了一个问题:

第37行第5列:"":操作数类型不正确

但是我已经宣布并且正确地调用了它,不是吗?与存储在$t1 and $t2的.ascizz数据一样,我知道两个程序都可以运行,因为我可以将它们分开,只是我在第37行放置的条件,这是错误的。

我相信当使用li x,5 5时,问题可能是第3行第3行的错误。我认为这是调用变量x的错误方法。

我是新手,这可能只是一个简单的修复,但是一旦掌握了这个,我可以设置任意数量的变量,即x,y,z。为他们分配数字并应用条件。这是我对这个小练习的期望结果。

 .data
prompt1: .asciiz "\n\n Enter firs integer please: "
prompt2: .asciiz "Enter second integer please: "
result:  .asciiz "The result is:"
x: .word 60
array1: .space  12      #  declare 12 bytes of storage to hold array of 3 integers

.text

main:
    #t0 - to hold first integer
    #t1 - to hold secon integer
    #t2 - to hold sum of $t1 and $t0

    # first number

    li $v0, 4           # system call to print string asking for input
    la $a0, prompt1     # address of string to print
    syscall

    li $v0, 5           # system call to read integer
    syscall
    move $t0, $v0       # move the read number stored in $v0 into $t0

    #second number
    li $v0, 4
    la $a0, prompt2
    syscall

    li $v0, 5
    syscall

    move $t1, $v0
    #thir number

    li x, 5
    syscall
    move $t3, $v0
    add $t2,$0,$0

    add $t2, $t1, $t0   # add contents of $t0 and $t1 and store in $t2
    bge st2, $t3, end     # Branch to Label if st2 ≥ x (signed)

    # print out contents of $t2


    li $2,1             # $v0<-service#1 (print int)
    move $4, $t2        # $a0<-$8, move result to $a0
    syscall             # call to system service

    li $v0, 10          #syscall to exit
    syscall 

    end:
    la  $t0, array1 #  load base address of array into register $t0
    li  $t1, 5      #  $t1 = 5   ("load immediate")
    sw  $t1, ($t0)  #  first array element set to 5; indirect addressing
    li  $t1, 13     #   $t1 = 13
    sw  $t1, 4($t0) #  second array element set to 13
    li  $t1, -7     #   $t1 = -7
    sw  $t1, 8($t0) #  third array element set to -7
    li  $v0, 1
    move $a0, $t2
    syscall

1 个答案:

答案 0 :(得分:0)

li伪指令将立即值放入寄存器。您无法使用它将数据移动到内存中。如果要将数据放在位置x,则需要先将立即值存储在寄存器中,然后使用sw