Archive for March 13th, 2008

Асемблер за линукс

Thursday, March 13th, 2008

Днес доста учудващо ни накараха да пишем на асемблер, че и за x86 линукс. Сорса почти ни го метнаха на готово, ама се оказа че е доста елементарно. Което ме вкарва в малко размисъл относно природата на ‘машинната инструкция’ и ‘асемблера’, ама тези размишления са в разрез на всякакви правила и заучени положения и ако ги спомена някой разбирач ще ме насмели 🙂

$ vim test.asm
section .data
msg db ‘hello world’,0xA ; зареждаме текстов низ “здрасти” като променливата msg е указател към началния адрес (ех, това С), 0хА е знак 10, който познайте какво прави
len equ $-msg ; променливата $ (долар) указвала текущия адрес, така че дължината на низа “здравей” ще се сметне лесно
section .text
global _start
_start: ; входна точка
mov EAX, 0x04 ; изписването на текст на конзолата ставало през syscall от кърнела – функция с параметри. В ЕАХ се зарежда номера на функцията, а в следващите регистри параметрите. Функция номер 4 е изписване, която приема следните параметри:
mov EBX, 0x01 ; файлов дескриптор където ще се изписва
mov ECX, msg ; съобщението
mov EDX, len ; дължината му
int 0x80 ; а самото извикване на функцията става през прекъсване на 80h. Единственото възможно прекъсване (wtf)
mov EAX, 0x01 ; пак ще извикваме функция, но този път за край на програмата (функция 1 – return)
int 0x80
$ nasm -f elf test.asm # асемблираме кода
$ ld -o test test.o # свързваме
$ ./test # изпълняваме
hello world
$ ls -lh test* # да видим общия размер на всичко току що създадено
-rwxr-xr-x 1 ivanatora users 757 2008-03-14 20:26 test*
-rw-r–r– 1 ivanatora users 193 2008-03-14 20:30 test.asm
-rw-r–r– 1 ivanatora users 704 2008-03-14 20:30 test.o

Да видим същия резултат постигнат на С:

$ vim hello.c
#include <stdio.h>
int main(void){
printf(“Hello world\n”);
return 0;
}
$ gcc -o hello hello.c
$ ./hello
Hello world
$ ls -lh hello*
-rwxr-xr-x 1 ivanatora users 6.2K 2008-03-14 20:37 hello*
-rw-r–r– 1 ivanatora users 74 2008-03-14 20:37 hello.c

Десет пъти по-голям изпълним файл. Ако същото се компилира пък в M$ Visual Studio, няма да говоря за размера 🙂

ПП. Егх тоя гаден WordPress, нито шрифта е хубав нито индентациите са си на мястото, а и на всичкото отгоре се опитва да ми затвори тага <stdio.h>