我已经使用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
答案 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)被写入内存。