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レジスタの最大サイズになります。レジスタのサイズは1 バイトではなく4 バイトです。それを 10 倍すると、突然、配列は10 ではなく40 バイトを使用します。したがって、配列のサイズを 10 ではなく 40 に変更します。

もう 1 つの主な問題は、コメントで gusbro が指摘した配置です。lwおよびを使用swして、配列内の数値にアクセスしています。これらの命令は、バイトではなくワードで動作します。1 ワードは4 バイトです。したがって、アドレスは4 バイトに揃える必要があります。コードをそのまま実行すると、アライメント例外が発生します。

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

アドレス0x10010031は 4 で割り切れないため、4 バイトにアラインされません。

gusbro がアドバイスしたように、アセンブラに適切にアラインされたアドレスに格納させるには、.align前にディレクティブを使用する必要があります。実際には、2 ではなく 4 のアライメントが必要です。私は間違っていました。バイトではなくにアラインします:arrayalign n2^nn

.align 2
array: .space 40

今では正常に動作します。

于 2012-10-12T00:00:55.010 に答える