我制作了一个我正在使用数组的程序。问题是程序没有在屏幕上显示它应该的提示。在此程序中使用数组之前,提示工作正常。这是代码:
.data
User: .asciiz "\nEnter 10 number:\n"
Reverse: .asciiz "\nThe reverse order array is:\n"
array: .space 10
.text
main:
la $a0,User
li $v0,4
syscall
li $t1,0
li $t3,0 # counter
la $t0,array
j Input
Input:
li $v0,5
syscall
add $t2,$t3,$t0
sw $v0,0($t2)
addi $t3,$t3,4
beq $t1,9,ReverseInitialization
addi $t1,$t1,1
j Input
ReverseInitialization:
li $t3,36
la $a0,Reverse # NOT DISPLAYING THIS PROMTE
li $v0,4
syscall
j ReverseDisplay
ReverseDisplay:
lw $a0,0($t2)
li $v0,1
syscall
beq $t1,0,Exit
j ReverseDisplay
答案 0 :(得分:0)
您将再次混淆基准尺寸,就像之前的问题一样。
你有一系列数字。根据第一个提示,有10个数字。您正在使用syscall 5
来阅读每个号码。 syscall 5
将整数读入$v0
,因此,整数的最大大小是$v0
寄存器的最大大小。寄存器的大小是四个字节,而不是一个。乘以10,突然你的数组使用 40字节,而不是10.因此,将数组更改为40而不是10。
另一个主要问题是gusbro在评论中指出的对齐方式。您正在使用lw
和sw
来访问数组中的数字。这些说明适用于字,而不是字节。一个字是四个字节。因此,您的地址需要aligned到四个字节。当我按原样运行你的代码时,我确实得到了一个对齐异常:
Runtime exception at 0x00400030: store address not aligned on word boundary 0x10010031
地址0x10010031
未与四个字节对齐,因为它不能被4整除。
正如gusbro建议的那样,你需要在.align
之前使用array
指令强制汇编程序将它存储在正确对齐的地址。 你实际上需要一个4的对齐,而不是2 我错了; align n
与2^n
对齐,而不是n
字节:
.align 2
array: .space 40
现在工作正常。