#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 или шестнадцатеричном.