0

64 ビット Windows 7 で QtSpim 9.1.7 を実行しています。シミュレーター/設定/ MIPSの下で、すべてのオプションにチェックを入れています (「ベア マシン」、「疑似命令を受け入れる」、「遅延ブランチを有効にする」、「遅延ロードを有効にする」、「マッピングされた IO を有効にする」、「ロード例外ハンドラ」)。

次のようにハードコードされた値を保存すると、基本的なコードを実行して QtSpim に値を追加できoriますori $t0,$0,4。今、メモリからデータを読み込んで保存したいのですが、うまくいきlwません。

.text
.globl main
main:
lw $t0,num1
.data
num1: .word 4

上記のファイルを再初期化してロードすると、次のエラー メッセージが表示されます。

次にコードをステップ実行しようとすると、[00400024] 行まで到達します。その行をまたぐと、次のエラー メッセージが表示されます。

参考までに、私のコードは次のように解析されます。

User Text Segment [00400000]..[00440000]
[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
[00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit) 
[00400024] 8c080000  lw $8, 0($0) [num1]      ; 4: lw $t0,num1

私が最初に思いつくのは、それ0($0)は確かに の住所ではないということですnum1。私のデータ宣言は間違っていますか? もしそうなら、私は何を間違えましたか?

関連しているかどうかはわかりませんが、次のコマンドlaliコマンドの構文エラーが発生しました(の代替を見つけようとしていたときlw):

  • la $a0,num1
  • li $t0,4
4

3 に答える 3

3

これはバグではありません。シミュレーターはベア モードで実行され、ベア MIPS マシンをシミュレートします。このモードでは、ロード命令には 16 ビット フィールドしかないため、実際にはアドレスを保持できません。非裸モードでは、spim は 2 つの命令シーケンス (lui、lw) を生成して、データを適切にアドレス指定します。

于 2012-10-13T17:25:10.163 に答える
0

これは QtSpimのバグのようです。同じコードが他の 2 つの環境で動作します (QtSpim のバージョンがわずかに異なるため、9.1.7 または環境の回帰かどうかはわかりません)...

環境 1: EE380 CGI SPIM

http://cgi.aggregate.org/cgi-bin/cgispim.cgiでアクセス可能で、SPIM 6.3a を実行しています。エラーを返さずにコードを実行し、次の実行トレースを生成します。

SPIM Version 6.3a of January 14, 2001
Copyright 1990-2000 by James R. Larus (larus@cs.wisc.edu).
All Rights Reserved.

[0x00400000]    0x8fa40000  lw $4, 0($29)                   ; 102: lw $a0, 0($sp) # argc
[0x00400004]    0x27a50004  addiu $5, $29, 4                ; 103: addiu $a1, $sp, 4 # argv
[0x00400008]    0x24a60004  addiu $6, $5, 4                 ; 104: addiu $a2, $a1, 4 # envp
[0x0040000c]    0x00041080  sll $2, $4, 2                   ; 105: sll $v0, $a0, 2 
[0x00400010]    0x00c23021  addu $6, $6, $2                 ; 106: addu $a2, $a2, $v0 
[0x00400014]    0x0c100008  jal 0x00400020 [main]           ; 107: jal main 
[0x00400020]    0x3c011001  lui $1, 4097 [num1]             ; 4: lw $t0,num1
[0x00400024]    0x8c280000  lw $8, 0($1) [num1]

環境 2: Ubuntu

同じコードが 32 ビット Ubuntu 11.10 上の QtSpim 9.1.6 でエラーなしで実行され、次のように生成されます。

User Text Segment [00400000]..[00440000]
[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
[00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit) 
[00400024] 3c011001  lui $1, 4097 [num1]      ; 4: lw $t0,num1 
[00400028] 8c280000  lw $8, 0($1) [num1]      
于 2012-10-08T20:00:07.707 に答える
0

.data はすべての前に来る必要があります

次のように:

.data
num1: .word 4

.text
.globl main
main:
lw $t0,num1

li $v0, 10
syscall
.end    
于 2012-10-07T14:25:59.860 に答える