MOV SRC Dest (или) MOV DST SRC?

MOV, вероятно, первая инструкция, которую все изучают, изучая ASM.

Только сейчас я натолкнулся на книгу " Программирование на ассемблере в GNU/Linux для архитектур IA32" Раджата Муны, в которой говорится:

http://i.imagehost.org/0897/mov.gif

Но я узнал, что это MOV dest, src, Это как "Загрузить dest с src"Даже вики говорят то же самое.

Я не говорю, что автор не прав. Я знаю, что он прав. Но чего мне здесь не хватает?

кстати.. он использует GCC as собрать эти инструкции. Но это не должно изменить синтаксис инструкции, верно?

3 ответа

Решение

mov dest, src называется синтаксис Intel.

mov src, dest называется AT&T синтаксис.

Ассемблеры UNIX, включая ассемблер GNU, используют синтаксис AT&T, все другие известные мне ассемблеры x86 используют синтаксис Intel. Вы можете прочитать о различиях в Википедии.

Да, as/gas использует синтаксис AT&T, который использует порядок src,dest. MASM, TASM, NASM и т. Д. Используют порядок 'dest, src". Как это бывает, синтаксис AT&T не очень хорошо подходит для процессоров Intel, и (по крайней мере, IMO) представляет собой почти нечитаемый беспорядок. Например, movzx выходит особенно плохо.

Существует два различных типа синтаксиса ассемблера - Intel и AT&T. Вы можете найти сравнение обоих на странице ассемблера Википедии.

Скорее всего, ваша книга использует синтаксис AT&T, где исходный операнд находится перед адресатом.

Как уже упоминалось в ответе Джерри Коффина, синтаксис Intel лучше подходит для кодирования инструкций для архитектуры x86. Как говорится в комментарии к дизассемблеру моего отладчика, "операнды появляются в инструкции в том же порядке, в каком они появляются в выводе дизассемблера ". Например, рассмотрим эту инструкцию:

-a
1772:0100 test word [AA55], 1234
1772:0106
-u 100 l 1
1772:0100 F70655AA3412      test    word [AA55], 1234
-

Как вы можете прочитать в шестнадцатеричном дампе кода операции, код операции 0F7h сначала, затем байт ModR/M 06h, затем слово смещения с прямым порядком байтов 0AA55h, а затем, наконец, ближайшее слово 1234h. Синтаксис Intel соответствует этому порядку в источнике сборки. В синтаксисе AT&T это будет выглядеть так:testw $0x1234, (0xAA55) который меняет порядок по сравнению с кодировкой.

Другой пример, который подчиняется синтаксическому порядку Intel, - это условия сравнения. Например, рассмотрим эту последовательность:

cmp ax, 26
jae .label

Это перейдет к .label если ax больше или равно 26 (при сравнении без знака). Эта мнемоника верна только дляcmp dest, src порядок операндов, который устанавливает флаги как для dest -= src.

Другие вопросы по тегам