如何只替换 MIPS 中字符串的第一个字符?

How can I replace only the first character of a string in MIPS?

我使用 sw 指令编写了 MIPS 汇编语言代码,因此我只能用我选择的字符替换字符串的第一个字符。

但是,发生的事情是,代码没有 更改一个字符,而是更改了第一个字符并破坏了接下来三个字节中的字符。

我怎样才能正确?

我写了下面的代码:

# 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-bte 的数据。

在你的算法中,在指令之后

li $t0, 'X'

您将 'X' 作为 32 位字 写入您的 t0 寄存器。可能你的机器配置为 little endian$t0,即一个 32 位寄存器保存值 0x00000058(0x58 是 X 的 ascii 码)。

当你用sw $t0, ($a0)将它写入内存时,所有的32位都被写入,你的内存内容,原来"ABCDEFGH"变成了"X[=37=][=37=][=37=]EFGH"。

当您要求打印它时,位置 string+1 处的 '\0' 被视为字符串结束符,您只显示 'X'。

修复只是将行替换为

sw $t0, ($a0)

sb $t0, ($a0)

并且只有寄存器的最低有效字节(即 'X')被写入内存。