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

时间:2019-03-24 19:30:17

标签: string assembly char byte 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

1 个答案:

答案 0 :(得分:1)

您错误地使用了sw来存储单词(即4字节的数据)。

在您的算法中,按照说明进行操作

li $t0, 'X'

您在t0寄存器中以32位字的形式写入“ X” 。可能您的计算机配置为little endian$t0,即一个32位寄存器,其值是0x00000058(0x58是X的ASCII码)。

使用sw $t0, ($a0)将其写入内存时,所有32位都将被写入,并且原来为“ ABCDEFGH”的内存内容将变为“ X \ 0 \ 0 \ 0EFGH”。

当您要求打印它时,位置string+1上的'\ 0'被认为是字符串结束符,并且只显示了'X'。

解决方法是将行替换为

sw $t0, ($a0)

使用

sb $t0, ($a0)

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