Hlavní navigace

Programujeme v jazyce Assembler v Linuxu: jak na adresáře

Martin Podhola

V dnešní části přistoupíme poněkud k praktičtejšímu zacházení s Assemblerem, kde si ukážeme, co vlastně jednotlivé konstanty Asmutils provádějí s kódem při jeho úpravách.

Úvod

V každém operačním systému má programátor k dispozici sadu systémových volání k operacím s adresáři. Použití Asmutils je hodně podobné programování ve vyšších programovacích jazycích.

V dnešní části přistoupíme poněkud k praktičtejšímu zacházení s Assemblerem, kde si ukážeme, co vlastně jednotlivé konstanty Asmutils provádí :) s kódem při jeho úpravách.

Zde je tabulka hodnot nejdůležitějších systémových volání. Některá z nich si ukážeme vždy v sekci kódu bez použití Asmutils. Kompletní seznam těchto hodnot lze nalézt v souboru /usr/src/linux/in­clude/unistd.h.

Tabulka č. 592
chdir 12
chmod 15
setuid 23
mkdir 39
rmdir 40
geteuid 49
ioctl 54
readdir 89
getcwd 183

Budiž světlo – vytvoření adresáře

Použijeme systémové volání mkdir. Toto volání má jako první parametr ukazatel na jméno vytvářeného adresáře, ve druhém parametru předáváme přístupová práva. Na filesystémech, které nepodporují přístupová práva, jsou tyto parametry vynechávány, pokud jsou však v kódu uvedeny, nezpůsobí chybu, dojde k jejich ignoraci a běh programu pokračuje dál. Pro práva lze použít symbolické konstanty.

Adresář testdir uděláme takto:

%include "system.inc"

CODESEG
START:
sys_mkdir jmeno, S_IRWXU
sys_exit 0
DATASEG
jmeno DB "/home/murphy/testdir", 0
END

bez použití symbolických konstant Asmutils program může vypadat takto:

SECTION .text
global _start

_start:
mov eax, 39
mov ebx, jmeno
mov ecx, 700q
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

SECTION .data
jmeno db "/home/murphy/testdir", 0xa

Vytvořili jsme si adresář testdir.

Budiž tma – smazání adresáře

Využijeme systémové volání rmdir. Jeho jediným parametrem je jméno adresáře.

S použitím asmutils:

%include "system.inc"
CODESEG
START:
sys_rmdir jmeno
sys_exit 0
DATASEG
jmeno DB "/home/murphy/testdir", 0
END

Bez použití symbolických konstant:

SECTION .text
global _start

_start:
mov eax, 40
mov ebx, jmeno
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

SECTION .data
jmeno db "/home/murphy/testdir", 0xa

Vstupte prosím – výběr aktuálního adresáře

Tato funkce má jediný parametr, a tím je adresář společně s jeho cestou, který se má stát aktuálním (přejeme si do něho vstoupit). Jedná se o syscall chdir.

Tento program po svém startu vstoupí do mého domovského adresáře /home/murphy:

Se symbolickými konstantami:

%include "system.inc"
CODESEG
START:
sys_chdir vstup

...                     ;zbytek programu

sys_exit 0
DATASEG
vstup DB "/home/murphy/", 0
END

a bez použití konstant:

SECTION .text
global _start

_start:
mov eax, 12
mov ebx, vstup
int 0x80

...                     ;zbytek programu

mov eax, 1
mov ebx, 0
int 0x80

SECTION .data
jmeno db "/home/murphy/testdir", 0xa

Kde to jsme – zjištění aktuálního adresáře

Od jádra 2.0 výše je tento proces velmi zjednodušen. Použijeme systémové volání getcwd, které má dva parametry, první ukazuje na místo, kam se aktuální adresář uloží, druhý specifikuje velikost volné paměti, na niž odkazuje první parametr.

Použití je jednoduché:

S konstantami:

sys_getcwd path, PATHSIZE

a bez konstant

mov eax 183
mov path, ebx
mov size, ecx
int 0x80

Tento program zjistí aktuální adresář a skončí na novém řádku:

Se symbolickými konstantami:

sys_getcwd path, PATHSIZE

mov esi, ebx
xor edx, edx

.next:

inc edx

lodsb
or al, al
jnz .next
mov byte [esi - 1], __n

sub esi, edx
sys_write STDOUT, esi, EMPTY

sys_exit_true

a bez konstant:

SECTION .text
global _start

_start:
mov eax, 183
mov path, ebx
mov size, ecx
int 0x80

mov esi, ebx
xor edx, edx

.next:

inc edx

lodsb
or al, al
jnz .next
mov byte [esi - 1], __n

sub esi, edx
mov eax, 4
mov ebx, 1
mov ecx, path
mov edx, size
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

Kdopak to tu píše – vstup z klávesnice

Klávesnice je reprezentována standardním vstupem (stdin). Chceme-li číst znaky z klávesnice do stisku klávesy enter, použijeme syscall read.

S konstantami:

sys_read STDIN, data_z_klavesnice, MAX_DATA

a bez konstant:

mov eax, 3
mov ebx, 0
mov data, ecx
mov max, edx

Někdy potřebujeme číst klávesy po jedné nebo je při čtení nezobrazovat na standardní výstup. Změnit chování standardního vstupu můžeme pomocí syscall ioctl.

Voláme dále – volání IOCTL

Ovladače zařízení si nepřidávají nová systémová volání. Vytvářejí pro obsluhu svého zařízení soubor funkcí dostupných přes systémové volání IOCTL. Prostřednictvím IOCTL můžeme komunikovat s ovladačem příslušného zařízení a ovlivňovat jeho funkci. Jedná se o zkratku I/O Control (input output control). Zde se zmíníme o ioctl terminálu.

Toto volání má pouze jeden povinný parametr. Je to identifikační číslo souboru, nad kterým budeme volání provádět. Ostatní parametry jsou specifické pro jednotlivé funkce IOCTL.

V Linuxu měníme chování terminálu pomocí dvou nejčastěji používaných funkcí TCGETS a TCSETS. Voláním TCGETS dostaneme nastavení terminálu, změny se provádí voláním druhé funkce.

Díky Asmutils máme potřebné struktury pro zacházení s terminálem. Kdybychom chtěli číst klávesy po jedné a nezobrazovat je při stisku na obrazovku, měníme atributy terminálu ICANON a ECHO na 0. Přečteme je pomocí TCGETS, změníme bitovou masku a uvedeme v platnost pomocí IOCTL TCSETS. V definici struktury B_STRUC se objevuje speciální makro, které rozšiřuje standardní makro STRUC (definice je v souboru system.inc).

mov edx, termattrs
sys_ioctl STDIN, TCGETS
mov eax, [termattrs.c_lflag]
push eax
and eax, ~(ICANON | ECHO)
mov [termattrs.c_lflag] ,eax
sys_ioctl STDIN, TCSETS
pop dword [termattrs.c_lflag]

Závěrem

V dnešním dílu jsme si popsali další důležité systémové vlastnosti. Na závěr nás již čeká v posledním dílu jen alokace paměti, která se do tohoto dílu nevešla, a odlaďování a testování hotových aplikací.

Našli jste v článku chybu?

19. 2. 2008 15:21

Peťula (neregistrovaný)
On je dnes assemebler spíše známější pro mikrokontroléry - viz diskuze o mikroprocesorech a mikrořadičích, kde se o tomto "novém" způsobu dozvíte asi nejlépe na československém webu.

27. 1. 2006 20:05

Jan (neregistrovaný)
Tak už mi to pěkně běhá. Nakonec se ukázalo, že je to prkotina.
Ale prosím vás - tohle je poprvé, co jsem na rootu narazil na článek se zápornou informační hodnotou! Nebýt tohodle článku a faktu, že jsem si jej přečetl, šel bych hned od začátku po správné cestě a nezabralo by mi to tolik času.
Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

Vitalia.cz: To nejhorší při horečce u dětí: Febrilní křeče

To nejhorší při horečce u dětí: Febrilní křeče

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

DigiZone.cz: Sat novinky: slovenská TV8 HD i ruský NTV Mir

Sat novinky: slovenská TV8 HD i ruský NTV Mir

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Měšec.cz: Exekuční poradna: ptejte se online

Exekuční poradna: ptejte se online

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka