Ошибки новичка при компиляции источника сборки MIPS - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь изучить MIPS Assembly, изучая MIPS Assembly Language Programming . В книге у меня есть этот код ( извлеченный со страницы 37 книги ):

.data
prompt: .asciiz "\n Please Input a Value: "
bye: .asciiz "\n Bye!"
.globl main
.text

main:
   li $v0, 4
   la $a0, prompt
   syscall

   li $v0, 5
   syscall
   beqz $v0, end
   move $a0, $v0
   li $v0, 1
   syscall
   b main


end:
   li $v0, 4
   la $a0, bye
   syscall

   li $v0, 10
   syscall

У меня есть кросс-скомпилированный binutils , нацеленный на mips-elf, но когда я попытался собрать код, я получил несколько ошибок

ubuntu @ eeepc: ~ / Desktop $ mips-elf-as test-mips.asm
test-mips.asm: Сообщения ассемблера:
test-mips.asm: 8: Ошибка: недопустимые операнды 'li'
test-mips.asm: 9: ошибка: недопустимые операнды 'la'
test-mips.asm: 12: ошибка: недопустимые операнды 'li'
test-mips.asm: 14: ошибка: недопустимые операнды 'beqz'
test-mips.asm: 15: ошибка: недопустимые операнды 'move'
test-mips.asm: 16: ошибка: недопустимые операнды 'li'
test-mips.asm: 22: ошибка: недопустимые операнды 'li'
test-mips.asm: 23: ошибка: недопустимые операнды 'la'
test-mips.asm: 26: ошибка: недопустимые операнды 'li'
убунту @ EeePC: ~ / Desktop $

Я использую x86 Ubuntu Hardy Herron для кросс-компиляции в MIPS

Что не так?

Ответы [ 3 ]

4 голосов
/ 28 января 2010

Хорошо, инструкции li и la являются псевдо-инструкциями, которые должны быть распознаны ассемблером, но возможно, вашей среде нужно что-то сделать, чтобы определить их (меня не удивит, если они были макросами).

Попробуйте изменить их на "настоящую" форму:

li $v0,4   -->   lui $v0,0;       ori $v0,$v0,4
la $a0,bye -->   lui $a0,bye>>16; ori $a0,$a0,bye&ffff

Или то, что ваш конкретный ассемблер MIPS использует для RIGHT-SHIFT-16-BITS и AND.

Инструкция ls, которую я никогда раньше не видел. Вы уверены, что это не опечатка для la? И я думаю beqz должно быть beq. Большинство процессоров используют одну и ту же инструкцию по-разному, например, при уменьшении регистра до нуля (z) и при сравнении регистра с чем-либо (eq) устанавливается нулевой флаг.

Ни один из ls, beqz или move не отображается на странице MikS в ассемблере Википедии , хотя последние два перечислены как псевдоинструкции в Patterson & Hennessy .

Так что все больше и больше похоже на то, что вам нужны дополнительные настройки, чтобы заставить работать псевдоинструкции.

3 голосов
/ 29 января 2010

Мне кажется, проблема в том, что вы используете более старую версию binutils, которая не поддерживает символические имена для регистров MIPS.

binutils 2.17 (как указано в инструкциях кросс-компиляции, на которые вы ссылались) не понимает $v0, $a0 и т. Д. (См. этот вопрос ).

Однако, если вы все равно собираете инструменты самостоятельно, хорошим решением было бы перейти на более позднюю версию binutils: версии начиная с 2.18 do поддерживают имена символьных регистров. Ваш пример правильно собирается с версией 2.18 или последней версией 2.20.

0 голосов
/ 18 января 2012

Я думаю, что это ваша последовательность перечисления li и la, если вы не загружаете адрес, вы не можете загрузить немедленно и сказать $ v0, чтобы он удерживал строку, которую вы хотите отобразить .. попробуйте сначала поставить la перед li в каждом случае ... ну, что касается псевдоинструкций, да, это тоже может быть проблемой, но мое предложение стоит попробовать.

...