Инструкция по сборке MIPS - String (ASCII) - PullRequest
2 голосов
/ 22 октября 2011

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

Теперь MIPS имеет три разные инструкции: R-Type, I-Type и J-Type. Однако в .data. раздел, мы могли бы иметь что-то вроде message: .asciiz "hello world". Как в этом случае преобразовать строку ASCII в машинный код для MIPS?

Спасибо

Ответы [ 3 ]

6 голосов
/ 22 октября 2011

ASCII-текст не преобразуется в машинный код. Он хранится в формате, найденном в Википедии .

ASCII Code Chart

MIPS использует этот формат для хранения строк ASCII. В частности, .asciiz - это строка плюс символ NUL. Таким образом, согласно листу, A - это 41 в шестнадцатеричном формате, а это просто 0100 0001 в двоичном виде. Но не забывайте NUL-символ, поэтому: 0100 0001 0000.

При сохранении строки я возьму симулятор Mars MIPS и просто начну раздел памяти по известному адресу в памяти и сделаю любые ссылки на метку message, установленную в этом месте в памяти.

Обратите внимание, что все в разделе данных не относится ни к типу R, ни к типу I, ни к типу J Это просто необработанные данные.

3 голосов
/ 27 декабря 2018

Как отмечали другие ответы, ascii, содержащаяся в директиве .ascii "string", кодируется в необработанном двоичном формате в сегменте данных объектного файла. Что от того, что происходит от этого, зависит от двоичного формата, в который ассемблер кодирует. Обычно данные не кодируются в машинный код, однако GNU as с радостью соберет это:

.text
start:
  .ascii "Hello, world"
  addi $t1, $zero, 0x1
end:

Если вы разберете вывод в objdump (я использую здесь цепочку инструментов mips-img-elf), вы увидите это:

Disassembly of section .text:

00000000 <message>:
   0:   48656c6c    0x48656c6c
   4:   6f2c2077    0x6f2c2077
   8:   6f726c64    0x6f726c64
   c:   20090001    addi    t1,zero,1

В шестнадцатеричной последовательности 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 написано "Привет, мир". Я пришел сюда в поисках ответа на вопрос, почему ГАЗ ведет себя так. Марс не будет собирать вышеупомянутую программу, из-за ошибки, что директивы данных не могут быть использованы в текстовом сегменте У кого-нибудь есть понимание?

3 голосов
/ 22 октября 2011

Данные не являются исполняемыми и не должны быть преобразованы в машинный код.Он должен быть закодирован в правильном двоичном представлении типа данных для вашей цели.

...