[[oktatas:programozás:assembly|< Assembly]] ====== Assembly nyelv ====== * **Szerző:** Sallai András * Copyright (c) 2011, Sallai András * Szerkesztve: 2011, 2014, 2019 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Az Assembly nyelvről ===== Az Assembly nyelv utasításai igékből és változókból állnak. A programozás könnyebb, a programkód olvashatóbb. Az Assembly fordító műveleti kódokkal és címekkel helyettesíti az utasításokat. A legtöbb cím relatív, mert a valódi címek csak futáskor állnak elő. Később megjelent a makro assembly, amely lehetővé tette, meghívható makrók létrehozását, amely nagyban megkönnyítette a programozást. ===== EXE program készítése ===== Szükségünk van egy **fordítóra** és egy **linkerre**. Ajánlott az nasm fordító és az alink linker használata. A következő példáknál ezt fogom használni. Készítsük el az alábbi kódot: kiir.asm mov ah, 02h mov dl, 2ah int 21h mov ah, 4ch int 21h Ez után fordítsuk le az nasm fordítóval: nasm -f win32 -o kiir.obj kiir.asm A fordítás után a linkerrel készítsük el a futtatható állományt: alink kiir.obj A program ezek után futásra kész, amely egy csillagot kell a képernyőre írjon. Elemzés * Karaktert szeretnénk kiíratni, ezért az ah regiszterbe 2-t teszünk. * A csillag karaktert szeretnénk kiíratni, ezért annak ASCII kódját a dl regiszterbe tesszük. * A 21-es DOS megszakítás használjuk a karakter kiírására * Előkészülünk a program befejezéséhez. * Megint a 21-es DOS megszakítást használjuk, de most kilépésre. ===== ELF bináris készítése ===== Az ELF bináris a Unix alapú rendszerek formátumba.Az első ELF binárist System V Release 4 rendszeren mutatták be, ami később szabvánnyá vált. Az ELF a **Executable and Linkable Format** rövidítése. ==== Intel szintaktika ==== section .text global _start _start: mov ebx,1 mov ecx,msg mov edx,len mov eax,4 int 0x80 mov ebx,0 mov eax,1 int 0x80 section .data msg db "Helló világ!",0x0a len equ $ - msg Fordítás és linkelés: nasm -f aout main.asm ld -s -o main main.o ==== AT&T szintaktika ==== .text .global _start _start: movl $len,%edx movl $msg,%ecx movl $1,%ebx movl $4,%eax int $0x80 movl $0,%ebx movl $1,%eax int $0x80 .data msg: .ascii "Helló Világ!\n" len = . - msg Fordítás és linkelés: as -o main.o main.S ld -s -o main main.o ==== C inline assembly ==== Az Assembly nyelvet más nyelvekbe beépítve is használjuk. A következő példa egy C nyelvű program, amelybe egy Assembly részt építettem. #include void main() { int x = 10, y; asm ( "movl %1, %%eax;" "movl %%eax, %0;" :"=r"(y) /* y is output operand */ :"r"(x) /* x is input operand */ :"%eax"); /* %eax is clobbered register */ printf("eax tartalma%d\n", y); } ===== 64 bites nasm ===== Példa: section .data msg: db 'helló világ!', 10 section .text global _start _start: mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, 16 syscall mov rax, 60 xor rdi, rdi syscall hello: hello.asm nasm -felf64 hello.asm -o hello.o ld -o hello hello.o ===== Forrás ===== * Igor Zhirkov: * Low-Level Programming * C, Assembly, and Program Execution on Intel 64 Architecture