1. ホーム
  2. string

[解決済み] MIPSで文字列の最初の文字だけを置換するにはどうすればよいですか?

2022-02-17 05:58:55

質問内容

MIPSのアセンブリ言語コードは sw という命令で、文字列の1文字目だけを好きな文字に置き換えることができます。

しかし、何が起こるかというと、その代わりに のみ は1文字を変更し、コードは1文字目を変更し、次の3バイトの文字を破壊します。

どうしたらうまくいくのでしょうか?

以下のようなコードを書きました。

# replace 1st character of a string
.data
string: .asciiz "ABCDEFGH"

.text
main:
# load string's 1st address into the memory
la $a0, string
li $t0, 'X'
#addi $t0,$t0, 48

sw $t0, ($a0)

# print string  
la $a0, string # load 1st address of the string
li $v0, 4 # syscall for string print   
syscall

# exit program
li $v0, 10
syscall

入力します。 ABCDEFGH
期待される結果 XBCDEFGH
実際の結果 X

解決方法は?

を誤って使用した場合 sw は、ワード、つまり4バイトのデータを格納するものです。

あなたのアルゴリズムでは、命令の後に

li $t0, 'X'

を書くと、'X' 32ビットのワードとして をt0レジスタに登録してください。おそらく、あなたのマシンは次のように構成されています。 リトルエンディアン $t0 これは32ビットのレジスタで、0x00000058(0x58はXのアスキーコード)の値を保持します。

でメモリに書き込むと sw $t0, ($a0) 32ビットが全て書き込まれ、元々 "ABCDEFGH" であったメモリの内容が "X0GH" になるのです。

印刷を依頼すると、' \0' の位置が string+1 が文字列の終端とみなされ、'X'だけが表示されます。

修正方法は、その行を

sw $t0, ($a0)

sb $t0, ($a0)

で、レジスタの最下位バイト(つまり'X')だけがメモリに書き込まれます。