我使用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'
在t0寄存器中将'X'写为32位字。可能你的机器配置为little endian和$t0
,即32位寄存器保持值0x00000058(0x58是X的ascii代码)。
当你用sw $t0, ($a0)
将它写入内存时,所有32位都被写入,你的内存内容(最初是“ABCDEFGH”)变为“X \ 0 \ 0 \ 0EFFGH”。
当你要求打印它时,位置string+1
的'\ 0'被认为是一个字符串结束终止符,你只显示'X'。
该修复只是用于替换该行
sw $t0, ($a0)
同
sb $t0, ($a0)
并且只有寄存器的最低有效字节(即“X”)被写入存储器。