0

我制作了一个使用数组的程序。问题是程序没有在屏幕上显示它应该显示的提示。在我在这个程序中使用数组之前,提示符工作正常。这是代码:

.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
4

1 回答 1

0

就像您在上一个问题中所做的那样,您再次混合了您的基准大小。

你有一个数字数组。根据第一个提示,有 10 个号码。你syscall 5用来读取每个数字。syscall 5将整数读入$v0,因此,整数的最大大小是$v0寄存器的最大大小。寄存器的大小是四个字节,而不是一个。将它乘以 10,突然你的数组使用40 个字节,而不是 10。所以将你的数组的大小更改为 40 而不是 10。

gusbro 在评论中指出,另一个主要问题是对齐。您正在使用lwandsw来访问数组中的数字。这些指令对而不是字节进行操作。一个字是四个字节。因此,您的地址需要与四个字节对齐。当我按原样运行您的代码时,果然我得到了一个对齐异常:

Runtime exception at 0x00400030: store address not aligned on word boundary 0x10010031

该地址0x10010031未与四个字节对齐,因为它不能被 4 整除。

正如 gusbro 建议的那样,您需要在强制汇编器将其存储在正确对齐的地址.align之前使用该指令。您实际上需要对齐 4,而不是 2我错了;与 对齐,而不是字节:arrayalign n2^nn

.align 2
array: .space 40

现在它工作正常。

于 2012-10-12T00:00:55.010 回答