Я пишу сборку или NASM? - PullRequest
       21

Я пишу сборку или NASM?

3 голосов
/ 20 мая 2010

Я сыт по горло этим. Некоторое время я пытался овладеть сборкой, но мне кажется, что я пишу не для языка, а для своего компилятора.

Я использовал этот учебник , и до сих пор он дает мне ад. Я использую 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 ]

8 голосов
/ 20 мая 2010

Думайте об этом так: архитектуры 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 может быть регистр или ячейка памяти, но вы задаете ему константу.

6 голосов
/ 20 мая 2010

Одна из особенностей ассемблера, как и любого другого языка, заключается в том, что он частично определяется ассемблером. Этот «div 5» кажется мне очень странным, но я изучал ассемблер с использованием MASM, который имеет другой синтаксис. Исходя из комментариев в учебнике, похоже, что ассемблер, используемый для этого учебника, имеет некоторые «подразумеваемые» операнды для инструкции, тогда как NASM этого не делает, и ожидает синтаксис Intel для инструкции div.

ИМХО, вам лучше всего будет использовать NASM, но получить учебник, который либо специфичен для NASM, либо ориентирован на «чистый» синтаксис Intel. Книга Art of Assembly - хороший ресурс для синтаксиса Intel.

5 голосов
/ 20 мая 2010

Intel не поддерживает непосредственный аргумент div (только регистр и память), поэтому любой учебник, который вы используете, создан для нестандартного ассемблера.

2 голосов
/ 20 мая 2010

Хммм, вы используете другой диалект ассемблерного компилятора ... в руководстве четко и недвусмысленно указано, что его ассемблер A86 является условно-бесплатным ассемблерным пакетом (ну, это давным-давно !!!) чтобы проверить некоторые учебники по назму, кстати, был задан вопрос здесь о лучшем учебнике по назму ..

x86 Ассемблер независимо от того, что вы используете, такие как GAS, NASM, A86, TASM, MASM, в целом одинаковы, у некоторых может быть дополнительный синтаксический сахар, у других - нет ...

...