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

问题描述 投票:0回答:1

我使用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

string assembly char byte mips
1个回答
1
投票

您错误地使用存储单词的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”)被写入存储器。

© www.soinside.com 2019 - 2024. All rights reserved.