Как удалить символ из 4-байтовой строки в сборке MIPS32, используя сдвиг? - PullRequest
1 голос
/ 01 ноября 2019

Я новичок в сборке MIPS32 и пытаюсь удалить символ в строке (в частности, удалить первый символ), хранящийся в разделе .data, но понятия не имею, как это сделать.

В следующей строке кода есть способ сделать так, чтобы test просто равнялся "bc" вместо "abc"

test:           .asciiz     "abc"

Это просто вопрос использования чего-токак логическое смещение влево на 2, чтобы удалить первый символ, или мне нужно что-то сместить, или есть код операции, чтобы просто удалить его?

1 Ответ

0 голосов
/ 01 ноября 2019

Как Необходимость удаления всех небуквенных элементов из строки в сборке (для x86) объясняет, удаление символа в строке означает копирование всей оставшейся части строки.

В вашем случае это всего 3 байта из 4 (включая завершающий 0). Так что да, вы можете сделать это, просто сдвинув слово на 8 бит (1 байт). Особенно, если вы убедитесь, что test выровнено по слову с .p2align 2 перед ним, чтобы вы могли безопасно lw и sw все 4 байта с одной загрузкой.

Для MIPS с прямым порядком байтов (например,MARS имитирует), это было бы правильным сдвигом, потому что первый байт в памяти является наименее значимым. А сдвиги вправо сдвигают младшие (наименее значимые) биты.

Для MIPS с прямым порядком байтов (старший значащий байт сначала, как работают некоторые реальные процессоры MIPS), это будет сдвиг влево, удаляя самый значимый байти сдвигая младшие биты вверх.


Обратите внимание, что слово test останется равным 'b', 'c', 0, 0. Так что да, в качестве строки неявной длины это "bc".

Также обратите внимание, что если у вас просто есть указатель в регистре, вы можете получить указатель на "bc", просто увеличив его на 1 вместоМодификация памяти. Например, addiu $t0, $t0, 1.

Или, что эквивалентно, la $t0, test+1 - указатель на 1 байт после начала.

...