14.05.2000 Программирование под Linux [-=[U]=-]
   Несмотря   на   то  что  при  при  программировании  для  Unix  обычно
употребляется  исключительно  язык  C,  пользоваться  ассемблером  в этих
системах можно, и даже просто.

Синтаксис AT&T
~~~~~~~~~~~~~~

   Проблема  в  том, что ассемблер для Unix(Linux) кардинально отличается
от DOS/Win32. Он не использует синтаксес предложенный компаний Intel. Как
и  простой  ассемблер AT&T использует латинские буквы и символы (%$*.,_).
Если последовательность допустимых символов, с которой начинается строка,
не  начинается  со  специального  символа  или  цифры  и не заканчивается
двоеточием - это команда процессора:

HLT //остановить процессор

   Если последовательность допустимых символов начинается с символа "%" -
это название регистра процессора:

pushl %eax // поместить в стек сожержимое регистра EAX

   Если последовательность начинается с символа "$" - это непосредственнй
операнд:

pushl $0                //поместить в стек 0,
pushl $0x10             //число 10h и адресс
pushl $variable         //переменной variable


Команды
~~~~~~~

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

 b - байт
 w - слово
 l - двойное слово
 q - учетверенное слово
 s - 32 битное число с плавающей запятой
 l - 64 битное число с плавающей запятой
 t - 80 битное число с плавающей запятой

пример:

 movb $0, variable // mov byte ptr variable,0

 fildq variable    // fild qword ptr variable

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

пример:

movsbl %al,%edx //mov edx, al

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

пример:

lcall $7,$0 // call far 0007:00000000

lret $10 // retf 10


Примеры программ
~~~~~~~~~~~~~~~~

.text
.global _start

_start:

// параметры в linux помещаются слево на право

movl $4,%eax    // системный вызов "write"
xorl $ebx,$ebx
incl %ebx       //%ebx =1 индефикатор stdout

movl $message, %ecx
movl $message_l,%edx
int $0x80

xorl %ebx,%ebx  // выход "exit"
incl %eax
xorl %ebx,%ebx
int $0x80

hlt             //Bzz

.data

message:
.string "Hello world\012"
message_l = .-message

Синтаксис NASM
~~~~~~~~~~~~~~

   Этот  синтаксис  очень  похож на ассемблерный, но имеет некоторые свой
фенки.

   например  в  nasm`е нет команды lea.. Этот компилятор будет удобен для
тех кто использовал AT&T синтаксис или родной DOS(ASM).

   Например  инт  80  можно  вызвать  так:  int 0x80 или int 80h кому как
удобние..

маленький пример программы на NASM с использованнием libc:

section .text
extern puts
global main

main:
   push dword msg
   call puts
   add esp, byte 4
   re

msg:
   db "Hello World!",0

   я  не  стал  писать программу без использованния libc (это тоже самое,
только с int 80h)

   В  этой  статье  я не буду описывать как писать на GAS,TASM под Linux.
потому  что  ни  очень похожи с выше перечисленными синтаксисами. На TASM
писать  очень  легко  вы можите посмотреть исходники вируса diesel в 29#b
#4,  там  же  вы  можите  увидеть как написать простейшую программу hallo
world на TASM под LInux...

          -=[U]=- (c) 2000
"I think age is just a stupid number"

 Статья для журнала Top Device