[Назад] [Далее]

11.1.2. Запись команд

Названия команд, не принимающих операндов, совпадают с названиями, принятыми в синтаксисе Intel:

        nop

К названиям команд, имеющих операнды, добавляются суффиксы, отражающие размер операндов:

// mov byte ptr variable,0
        movb       $0,variable
// fild qword ptr variable
        fildq      variable

Команды, принимающие операнды разных размеров, требуют указания двух суффиксов, сначала суффикса источника, а затем приемника:

// movsx   edx,al
        movsbl     %al,%edx

Команды преобразования типов имеют в AT&T; названия из четырех букв — С, размер источника, Т и размер приемника:

// cbw
        cbtw
// cwde
        cwtl
// cwd
        cwtl
// cdq
        cltd

Но многие ассемблеры понимают и принятые в Intel формы для этих четырех команд.

Дальние команды передачи управления (jmp, call, ret) отличаются от ближних префиксом l:

// call far 0007:00000000
        lcall      $7,$0
// retf 10
        lret       $10

Если команда имеет несколько операндов, операнд-источник всегда записывается первым, а приемник — последним, то есть в точности наоборот по сравнению с Intel-синтаксисом:

// mov ax,bx
        movw       %bx,%ax
// imul eax.ecx,16
        imull      $16,%ecx,%eax

Все префиксы имеют имена, которыми они задаются как обычные команды, — перед командой, для которой данный префикс предназначен. Имена префиксов замены сегмента — segcs, segds, segss, segfs, seggs, имена префиксов изменения разрядности адреса и операнда- addr16 и data 16:

        segfs
        movl       variable,%eax
        rep
        stosd

Кроме того, префикс замены сегмента будет включен автоматически, если используется оператор «:» в контексте операнда:

        movl       %fs:variable, %eax

п»ї
"target=_blank><\/a>") //-->