Как я могу заменить только первый символ строки в MIPS? - PullRequest
0 голосов
/ 24 марта 2019

Я написал код на ассемблере MIPS, используя инструкцию sw, чтобы я мог заменить только 1-й символ строки на символ по своему выбору.

Но, что происходит, вместо только изменения одного символа, код изменяет 1-й символ плюс уничтожает символы в следующих трех байтах.

Как я могу получитьэто верно?

Я написал следующий код:

# 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 Ответ

1 голос
/ 25 марта 2019

Вы неправильно используете sw, в котором хранится слово, то есть 4-битные данные.

В вашем алгоритме после инструкции

li $t0, 'X'

вы пишете 'X' как 32-битное слово в вашем регистре t0. Вероятно, ваш компьютер настроен как little-endian и $t0, то есть 32-битный регистр содержит значение 0x00000058 (0x58 - это код ascii для X).

Когда вы записываете его в память с помощью sw $t0, ($a0), записываются все 32 бита, и содержимое вашей памяти, которое изначально было «ABCDEFGH», становится «X \ 0 \ 0 \ 0EFGH».

Когда вы просите его напечатать, '\ 0' в позиции string+1 рассматривается как терминатор конца строки, и у вас отображается только 'X'.

Исправление - просто заменить строку на

sw $t0, ($a0)

с

sb $t0, ($a0)

и только младший байт вашего регистра (то есть 'X') записывается в память.

...