Я пишу сборку или NASM?
Я сыт по горло этим. Я некоторое время пытался получить контроль над сборкой, но мне кажется, что я пишу не для языка, а для своего компилятора.
Я использовал этот учебник, и пока он дает мне ад. Я использую NASM, что может быть проблемой, но я подумал, что это был самый популярный. Я просто пытаюсь освоить самый общий вид сборки, поэтому я решил изучить x86. Я продолжаю сталкиваться с глупыми ошибками, такими как неспособность увеличить переменную. Вот последний из них: не в состоянии использовать div.
mov bx, 0;
mov cx, 0;
jmp start;
start:
inc cx;
mov ax, cx;
div 3; <-- invalid combination of opcode and operand
cmp ah,0;
jz totalvalue;
mov ax, cx;
div 5; <-- invalid combination of opcode and operand
cmp ah, 0;
jz totalvalue;
cmp cx, 1000;
jz end;
totalvalue:
add bx,cx;
jmp start;
jmp end;
end:
mov ah,4ch;
mov al,00;
int 21h;
Стоит ли менять компиляторы? Кажется, что разделение должно быть стандартным. Нужно ли мне читать два учебника (один на NASM, а другой на x86?). Любая конкретная помощь по этой проблеме?
4 ответа
Одной из особенностей ассемблера, как и любого другого языка, является то, что он частично определяется ассемблером. Этот "div 5" кажется мне очень странным, но я изучал ассемблер с использованием MASM, который имеет другой синтаксис. Исходя из комментариев в учебнике, похоже, что ассемблер, используемый для этого учебника, имеет некоторые "подразумеваемые" операнды для инструкции, тогда как NASM этого не делает, и ожидает синтаксис Intel для инструкции div.
ИМХО, вам лучше всего использовать NASM, но получить учебник, который либо специфичен для NASM, либо ориентирован на "чистый" синтаксис Intel. Книга Art of Assembly - хороший ресурс для синтаксиса Intel.
Думайте об этом так: архитектуры x86 действительно понимают только машинный код. Ассемблеры, такие как NASM, будут переводить из сборки в машинный код. Таким образом, ваш выбор ассемблера действительно не имеет большого значения, если он делает правильный перевод (что делает NASM).
Это аналогично вопросу о том, использовать ли javac
или встроенный компилятор Eclipse. Они оба скомпилируют действительный Java. Я понимаю, что ассемблеры также поддерживают некоторые дополнительные макросы и тому подобное, но, похоже, это не применимо в этой ситуации.
Кроме того, сам сайт NASM просто указывает на документацию Intel для сборки x86, поэтому вы можете быть уверены, что он не ожидает какой-то особой формы.
Теперь я нашел этот сайт, документирующий инструкцию DIV, и он имеет следующее:
Инструкции деления 80x86 выполняют деление 64/32 (только 80386 и более поздние), деление 32/16 или деление 16/8. Эти инструкции принимают форму:
div reg For unsigned division div mem idiv reg For signed division idiv mem aad ASCII adjust for division
Так что это объяснило бы вашу ошибку. Аргумент к div
может быть регистром или ячейкой памяти, но вы даете ему константу.
Intel не поддерживает немедленный аргумент div
(только регистр и память), поэтому любой учебник, который вы используете, создан для нестандартного ассемблера.
Хотя A86 действительно предоставляет несколько крупиц синтаксического сахара, непосредственный операнд div
инструкция не входит в их число. div 7
заставляет A86 выдать ошибку (#21, неверный одиночный операнд).
Я подозреваю, что автор того старого руководства просто не тестировал свой пример кода.
Рекомендуется использовать учебник, соответствующий вашему инструменту (например, PC Assembly Language от Пола Картера для NASM). Возможно, вы захотите почитать учебник "Микропроцессор 8086: программирование и взаимодействие с ПК". Он был написан специально для A86, и его можно будет купить примерно за 5 долларов (в 2020 году) во многих онлайн-магазинах подержанных книг.
Хммм, вы используете другой диалект компилятора ассемблера... в руководстве четко и недвусмысленно указано, что это ассемблер A86, который является условно-бесплатным ассемблерным пакетом (вот это давным-давно!!!). Лучше всего проверить вместо некоторых уроков по назму, между прочим, здесь был задан вопрос о лучшем учебнике по назму..
x86 Ассемблер независимо от того, что вы используете, такие как GAS, NASM, A86, TASM, MASM, в целом одинаковы, некоторые могут иметь дополнительный синтаксический сахар, другие могут не...