Tartalomjegyzék

< Assembly

Assembly nyelv

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

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.

main.c
#include <stdio.h>		
 
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:

hello.asm
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
Makefile
hello:	hello.asm
	nasm -felf64 hello.asm -o hello.o
	ld -o hello hello.o

Forrás