用户提示未出现在屏幕上

时间:2012-10-11 13:31:09

标签: arrays assembly mips pcspim

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

.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

1 个答案:

答案 0 :(得分:0)

您将再次混淆基准尺寸,就像之前的问题一样。

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

另一个主要问题是gusbro在评论中指出的对齐方式。您正在使用lwsw来访问数组中的数字。这些说明适用于,而不是字节。一个字是四个字节。因此,您的地址需要aligned到四个字节。当我按原样运行你的代码时,我确实得到了一个对齐异常:

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

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

正如gusbro建议的那样,你需要在.align之前使用array指令强制汇编程序将它存储在正确对齐的地址。 你实际上需要一个4的对齐,而不是2 我错了; align n2^n对齐,而不是n字节:

.align 2
array: .space 40

现在工作正常。