[解決済み] MIPSのフェッチアドレスがワード境界にアライメントされていないため、.align 4を使用したが、まだうまくいかない
2022-01-11 22:49:31
質問
コードは次のとおりです。
.data
.align 4 #added this, didnt work
size: .word 7
.align 4 #added this, didnt work
search: .word 30
.align 4 #added this,didnt work
array: .word 10,20,30,40,50,60,70
.align 4
.text
main:
la $a0,array #$a0 = address of array
lw $a1,size #a1 = size of array
lw $a2,search #$a2 = search key
COUNT:
lw $s0,0($a0) #copy arg1 = address array
addi $s1,$zero,7
lw $s1,0($a1) #copy arg2 = size of array
lw $s2,0($a2) #copy arg3 = search key (n)
addi $s2,$zero,30
COUNTLOOP:
add $v0,$zero,$zero #v0 = res
add $t0,$zero,$zero #$t0 = init i to 0
slt $t1,$t0,$s1 #check if i > size of array
beq $t1,$zero,DONECOUNT #i is n so end
sll $t2,$s0,2 #$t2 = get off set for a[i]
lw $t3,0($t2) #$t3 = get value of a[i]
bne $t3,$s2,CLOOPBTM #check if a[i] == seach key
addi $v0,$v0,1 #if above then increment res
CLOOPBTM:
addi $t0,$t0,1
j COUNTLOOP
DONECOUNT:
実行すると、エラーが発生します。
Runtime exception at 0x00400020: fetch address not aligned on word boundary 0x00000007
lw $s1,0($a1) #copy arg2 = 配列のサイズです。
どのように解決するのですか?
このコードの問題は、サイズが格納されているアドレスではなく、サイズそのものを使用していることです。
ここでは、A0にアドレスを、A1にサイズ(7)をロードしています。
la $a0,array
lw $a1,size #a1 = size of array
ここでは、配列に格納されている最初の単語をロードします(10をロードすることになります)。これは、あなたが意図したものではありません。
lw $s0,0($a0) #copy arg1 = address array
addi $s1,$zero,7
ここでは、位置0x000007に格納されている最初の単語をロードします。(あなたのサイズ)。これもおそらく意図したものではなく、アドレスがアライメントされていないため例外が発生します。
lw $s1,0($a1) #copy arg2 = size of array
といった具合です。
LW命令が何をするものなのか、誤解しているようですね。これは、メモリ上の位置をレジスタに読み込むものです。ループのプロローグで必要なのは、レジスタのコピーを作成することです。
そのためには、アセンブラがサポートしていれば、move疑似命令を使うことができます。そうでなければ、OR命令を使って、次のようにレジスタをコピーします。
COUNT:
or $s0, $a0, $a0 #copy arg1 = address array
addi $s1, $zero,7
or $s1, $a1, $a1 #copy arg2 = size of array
or $s2, $a2, $a2 #copy arg3 = search key (n)
addi $s2, $zero,30
COUNTLOOP:
...
線形探索ループの完全な例として、以下を試してみてください (未検証。アセンブラが遅延スロットを気にすることを想定しています)
main:
la $a0,array # $a0 = address of array
lw $a1,size # $a1 = size of array
lw $a2,search # $a2 = search key
beq $a1, $zero, NOTFOUND # handle the size==0 case..
or $v0, $zero, $zero # init counter to zero
LOOP:
lw $s0, 0($a0) # load element
beq $s0, $a2, FOUND # branch if key found:
addiu $a0, $a0, 4 # increment array pointer
addiu $v0, $v0, 1 # increment loop counter
bne $v0, $a1, LOOP # repeat until we've processed the array.
NOTFOUND:
# --------------------------------------
# if you reach this, key does not exist:
# --------------------------------------
li $v0, -1 # load a -1 to signal key not found.
jr $lr # return to caller
FOUND:
# -----------------------------------------
# v0 now contains the position of the key.
# -----------------------------------------
jr $lr
関連
-
batスクリプトからログを出力する方法
-
CE5.2版を使って、武術のベースサイトである第一レベルのメソッドを見つける(グラフィックチュートリアル)。
-
LinuxでRの新バージョンを直接コピーする方法
-
linux シェル学習ノート 4日目
-
[解決済み】R on MacOS Error: vector memory exhausted (limit reached?)
-
[解決済み】GAEで完全に有効なXMLをパースすると「Prologではコンテンツが許可されません」と表示される
-
[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。
-
[解決済み] MIPSのフェッチアドレスがワード境界にアライメントされていないため、.align 4を使用したが、まだうまくいかない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】スレッド "main "での例外 java.util.NoSuchElementException: 行が見つかりません [重複]。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
InstallShield でレジストリキーを取得するスクリプト
-
FcScript V1.0 ヘルプファイル(説明書付き
-
[解決済み】入力文字列のフォーマットが正しくない
-
[解決済み】 munmap_chunk(): 無効なポインタ
-
[解決済み】 lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) でエラー : 'y' に NA/NaN/Inf, あらゆる方法を試したが解決しなかった。
-
[解決済み】ValueError: 入力配列を形状 (224,224,3) から形状 (224,224) にブロードキャストできませんでした。)
-
[解決済み】dyld: ライブラリがロードされない ... 理由: 画像が見つからない
-
[解決済み】マージが終了していない(MERGE_HEADが存在する)。
-
[解決済み】ポインタと整数の比較を警告する
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法とは?