Сборка MIPS — преобразование строки в двоичное представление

#c #string #assembly #ascii #mips

#c #строка #сборка #ascii #mips

Вопрос:

Я хочу преобразовать строку в ее двоичное представление на C, чтобы она подходила для сборки MIPS (я пишу ассемблер MIPS на C).

Для строки «Сумма» MIPS делает это следующим образом (я извлек раздел MIPS .data):

 00100000011001010110100001010100
00100000011011010111010101110011
01101110001000000110011001101111
01100101011000100110110101110101
01101001001000000111001101110010
01110010011000010010000001101110
00100000011110010110000101110010
  

Буква T 1010100 в двоичном формате. Я вижу 1010100 в конце первой строки, но разве остальные не должны быть равны нулю (так что это знак, расширенный до 32-разрядного, поскольку MIPS имеет дело с 32-разрядными)?

h равно 1101000, а во второй строке даже нет 1101000. Почему это так?

Может кто-нибудь, пожалуйста, объяснить мне это?

Спасибо,

Ответ №1:

Данные ASCII не являются «расширенными знаками». Используя MIPS Mars simulator, я ввел:

 .data 
.asciiz "The sum"

.text
main:
  

Это сгенерировало сегмент данных:

 Address:   Value:
0x10010000 0x20656854
0x10010004 0x006d7573
  

НО ПОДОЖДИТЕ, разве шестнадцатеричное значение «Суммы» не просто 54:68:65:20:73:75:6d ? Да, обратите внимание на порядок, в котором они фактически хранятся. Или, скорее, посмотрите на порядковый номер. Наименьшее значение имеет самый высокий адрес (или самый значимый байт является первым адресом). Строки ASCII хранятся в формате Big Endian.

Итак, когда вы сохраняете свои строки, вычислите шестнадцатеричное значение, разделите строку на слова, а затем сохраните каждый символ в обратном порядке. Затем преобразуйте в двоичный файл.

Комментарии:

1. Имеет ли значение, в какой инструкции находится пробел?

2. В другом вашем вопросе, на который я ответил, пробелы были 0x20 в шестнадцатеричном формате.

3. Да, да, я в курсе этого. Однако будет ли пробел между суммой содержать «the» или «sum»? Или это не имеет значения?

4. Строки разбиваются на единицы памяти, известные как word s, а не на фактические слова. Слово в этом случае состоит из 4 символов. Таким образом, строка «сумма» разбивается на «the» и «sum 0».

5. Да, a word в MIPS равно 4 байтам. Что, если бы у нас были слова больше слова? Итак, скажите: «Привет». Как бы это распалось?

Ответ №2:

 $ echo "00100000011001010110100001010100
00100000011011010111010101110011
01101110001000000110011001101111
01100101011000100110110101110101
01101001001000000111001101110010
01110010011000010010000001101110
00100000011110010110000101110010
"| perl -pe '$_=pack"B*",$_'
 ehT musn foebmui srra n yar
  

Каким-то образом символы этой строки расположены в странном порядке. Вы группируете 4 символа в int ?

Комментарии:

1. Возможно, OP забывает, что mips часто имеет большой конец?

2. Мне просто интересно, как OP извлек это. раздел данных и почему он извлек его в двоичном формате, а не в ASCII или шестнадцатеричном.