Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

195

Приложение 3. Сравнение двух синтаксисов ассемблера

Синтаксис AT&T характерен для ассемблеров Unix-систем AS и GAS. Ассемблеры

MASM, MASM32, TASM, NASM, FASM и большинство других используют Intel-

синтаксис.

Современные версии GAS поддерживают директиву .intel_syntax, которая позволяет использовать Intel-синтаксис в GAS.

Таблица П3.1. Сравнение двух синтаксисов ассемблера, с примерами кода

 

Intel Syntax

 

 

 

 

AT&T Syntax

 

 

 

 

Регистры записываются без каких-либо

Перед регистрами всегда ставится знак

префиксов: eax, ebx, ecx, ...

 

 

 

процента: %eax, %abx, %ecx, …

 

 

 

 

 

 

 

 

Перед

непосредственными

операндами

не

Перед

непосредственными

операндами

указывается никаких символов:

 

 

указывается символ "$":

 

 

 

push 1

 

 

 

 

 

push $1

 

 

 

 

sub esp,50h

 

 

 

 

sub $0x50,%esp

 

 

 

Для обозначения шестнадцатеричного числа в

Для обозначения шестнадцатеричного числа в

инструкциях используется суффикс h:

 

инструкциях используется префикс "0x":

 

int 80h

 

 

 

 

int $0x80

 

 

 

В командах с несколькими операндами,

В командах с несколькими операндами,

первым

указывается

приемник,

а

первым

указывается

источник,

а

последним — источник:

 

 

 

последним — приемник, то есть в точности,

mov eax,1

 

 

 

 

наоборот, по сравнению с Intel-синтаксисом:

 

 

 

 

 

movb $1,%eax

 

 

 

imul eax,edx,13

 

 

 

 

 

 

 

 

 

 

 

imul $13,%edx,%eax

 

 

 

 

 

 

 

 

 

 

 

 

Для

отражения

размера

операндов

К названиям команд добавляются суффиксы,

используются директивы: byte ptr – байт,

отражающие размер операндов: b – байт, w –

word ptr – слово, dword ptr – двойное слово.

слово, l – двойное слово. Примеры:

 

Примеры:

 

 

 

 

movb $1,var1

 

 

 

mov byte ptr var1,1

 

 

 

 

 

 

 

 

 

movw $100,var2

 

 

 

mov word ptr var2,100

 

 

 

 

 

 

 

 

 

pushl var3

 

 

 

push dword ptr var3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для объявления 32-, 16- и 8-разрядных чисел

Для объявления 32-, 16- и 8-разрядных чисел

используются директивы dd, dw и db

используются директивы .int (или .long),

соответственно:

 

 

 

 

.word и .byte соответственно, при этом

var1 db 5Ah

 

 

 

 

переменные объявляются так же как метки (с

 

 

 

 

помощью двоеточия):

 

 

 

var2 dw 0

 

 

 

 

var1: .byte 0x5A

 

 

 

var3 dd 30

 

 

 

 

 

 

 

 

 

 

 

var2: .word 0

 

 

 

str db "строка символов", 0

 

 

 

 

 

 

 

var3: .int 30

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Также используются другие директивы:

 

 

 

 

 

 

.ascii или .string – для объявления строки

 

 

 

 

 

 

байтов, .asciz – для объявления строки

 

 

 

 

 

 

байтов

с автоматически

 

добавляемым

 

 

 

 

 

 

нулем в конце, .float – 32-битные числа с

 

 

 

 

 

 

плавающей запятой, .double – 64-битные

 

 

 

 

 

 

числа с плавающей запятой и др.

 

 

 

 

 

 

 

str: .asciz "строка символов"

 

Для разыменования значения по указанному

Для разыменования значения по указанному

адресу в памяти, используются квадратные

адресу в памяти, используются круглые

скобки: [var1]

 

 

 

 

скобки: (var1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.sklyaroff.ru

 

 

 

 

 

 

196

 

 

 

 

 

Таблица П3.1. (окончание)

 

 

 

 

 

 

 

Для адресации переменной со смещением

Для

адресации

переменной

со

 

лежащем в регистре, прибавляется или

смещением

лежащем

в

регистре,

 

вычитается необходимое количество байт

необходимое

количество

прибавляемых

 

внутри квадратных скобок:

или вычитаемых байт указывается до

 

mov

ebx,[ebp + 8]

круглых скобок:

 

 

 

 

 

mov

edx,[ebp - 4]

movl

8(%ebp),%ebx

 

 

 

 

 

 

 

movl

-4(%ebp),%edx

 

 

 

 

 

Косвенная адресация имеет форму:

Косвенная адресация имеет форму:

 

 

 

СЕКЦИЯ:[БАЗА + ИНДЕКС*МАСШТАБ +

%СЕКЦИЯ:СМЕЩЕНИЕ(БАЗА, ИНДЕКС,

 

 

СМЕЩЕНИЕ]

МАСШТАБ)

 

 

 

 

 

 

Примеры:

Примеры:

 

 

 

 

 

 

mov eax,base_addr[ebx+edi*3]

movl base_addr(%ebx,%edi,3),%eax

 

 

mov eax,[var1+esi*4]

movl var1(,%esi,4),%eax

 

 

 

 

Длинные переходы и вызовы записываются

Длинные переходы и вызовы записываются

 

как:

 

как:

 

 

 

 

 

 

 

call/jmp far SECTION:OFFSET

lcall/ljmp $SECTION,$OFFSET

 

 

 

Комментарии должны начинаться с символа

Поддерживаются комментарии в стиле C (/*

 

";" и записываться в одну строку:

*/), в стиле C++ (//) и в стиле shell (#):

 

 

; Это комментарий Intel-синтаксиса,

# Это комментарий AT&T-синтаксиса.

 

; каждая строка должна начинаться

/* Это многострочный комментарий

 

 

; с символа ";".

AT&T-синтаксиса. */

 

 

 

 

 

 

 

//Это тоже комментарий в стиле AT&T

http://www.sklyaroff.ru

197

Список литературы

1.Гук М., Юров В. Процессоры Pentium, Athlon и Duron. — СПб.: Питер, 2001.

2.Зубков С. Assembler для DOS, Windows и UNIX. — М., 2000.

3.Туториалы Iczelion'а. http://wasm.ru.

4.Румянцев П. В. Азбука программирования в Win32 API. — 4-е изд. — М.: Горячая линия – Телеком, 2004.

5.Румянцев П. В. Работа с файлами в Win32 API. — 2-е изд. — М.: Горячая линия – Телеком, 2002.