如何只替换 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')被写入内存。
我使用 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')被写入内存。