Несмотря на то что при при программировании для 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
|