1

ソースメモリから宛先メモリに単語をコピーする関数を作成しようとしています。

関数を作成しましたが、コードの実行に問題があります。execption 4エラーとして私に与えています

.data    
.text      
main:

.setnoreorder      
top: beq $a2,0,done 
lw $t1,($a0) 
sw $t1,($a1) 
add $a0,$a0,4 
add $a1,$a1,4 
j top     
sub $a2,$a2,1


done:   
jr  $ra     #return to the main program 
add $0, $0, $0  #nop 

この関数を呼び出して、メモリ内のアドレス 0x50000 から 0x90000 に 800 ワードをコピーするメイン プログラムを作成したいと考えています。しかし、$a0-$a2 に値を追加してコードを実行すると、機能しません。誰でもそれを修正する方法を知っていますか。(C コードを MIPS に変換しているため、C タグを含めました。

乾杯

4

3 に答える 3

1
    .text                       # code starts here 
main:                           # required label
    la      $a0,dest            # point to destination
    la      $a1,srce            # point to source
    li      $a2,1000            # move this many words 
    jal     block_copy          # call the routine 
    nop
    li      $v0,10
    syscall

###############################################################################
#   block copy - moves $a3 words from $a1 to $a0
#
#   register usage:
#       $a0 address of destination 
#       $a1 address of source
#       $a2 block size (number of words to move)
#       $v0 return code (0 means no troubles)
#
block_copy:

    move        $v0,$a2         # counter/rc 
bc_loop:
    lw          $t0,0($a1)      # no DMA here
    sw          $t0,0($a0)      # we have to move a word at a time 
    addiu       $a0,$a0,4       # point to next word in destination
    addiu       $a1,$a1,4       # point to next word in source
    addiu       $v0,$v0,-1      # decrement counter 
    bgtz        $v0,bc_loop     # keep on moving if counter is positive 
    jr          $ra             # return to caller
###############################################################################

    .data 
dest:
    .word       9:1000          # destination 1000 words (all zeroes)
srce:
    .word       0:1000          # source 1000 words (all nines)
于 2012-08-06T02:20:56.850 に答える
0

そうではありませんか:

sub $a2,$a2,1
j top
于 2012-08-06T00:25:31.377 に答える
0

ここでは、2 つの場所に遅延スロットを示します。

j top     
sub $a2,$a2,1

そしてここ

done:   
jr  $ra     #return to the main program 
add $0, $0, $0  #nop

しかし、明らかにここにはありません:

top: beq $a2,0,done 
lw $t1,($a0) 

おそらく問題は、beq に続くロードが実際には遅延スロットであり、$a2 がゼロの場合 (および分岐が発生した場合) でも実行されていることです。ゼロです - おそらく無効なメモリにアクセスし、例外を引き起こしています。

于 2012-08-06T01:22:56.703 に答える