2010-01-28 1 views
2

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

.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 

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

[email protected]:~/Desktop$ mips-elf-as test-mips.asm
test-mips.asm: Assembler messages:
test-mips.asm:8: Error: illegal operands 'li'
test-mips.asm:9: Error: illegal operands 'la'
test-mips.asm:12: Error: illegal operands 'li'
test-mips.asm:14: Error: illegal operands 'beqz'
test-mips.asm:15: Error: illegal operands 'move'
test-mips.asm:16: Error: illegal operands 'li'
test-mips.asm:22: Error: illegal operands 'li'
test-mips.asm:23: Error: illegal operands 'la'
test-mips.asm:26: Error: illegal operands 'li'
[email protected]:~/Desktop$

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

Что не так?

+0

Вы можете увидеть мой вопрос здесь http: // stackoverflow.com/questions/9403667/mips-hex-output/9403758 # comment11954218_9403758 и дать ответ о том, для чего процесс заключается в том, чтобы скомпилировать файл .s как вы уже указывали в объектный файл? Спасибо – NickHalden

ответ

3

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

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

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

+1

Хорошая добыча! Все инструкции, которые не работают, имеют операнды $ v0/$ a0 (за исключением первой «ла», которая немного странная), а ошибки указывают операнды, несмотря на то, что они отображают _opcodes_ (что меня отбросило). +1. – paxdiablo

+0

Оказывается, первая ошибка 'la' вероятно _did_ имеет ошибку. В исходном вопросе было написано «ls» с ошибкой, и вывод ошибки был неправильно обновлен, когда это было изменено (ошибка 'ls' была удалена, но ошибка« la »не была вставлена, я бы предположил). Я изменил вопрос, чтобы вставить фактический вывод ошибки для этой измененной строки (так что вопрос имеет больше смысла). – paxdiablo

4

Ну, инструкции 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 не обнаруживаются в MIPS assembler Wikipedia page хотя последние два перечислены как псевдо-инструкций в Patterson & Hennessy.

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

+0

Извините за 'ls', это была моя ошибка. –

+0

Если я попытаюсь изменить, у меня появилось больше ошибок нелегальных операндов, но теперь с 'lui' и' ori'. –

+0

Взгляните на страницу этой книги, код такой. Теперь я скопировал и вставил. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^