ahoj v serialu jiste pokracuj :) alespon se clovek dozvi neco o unixu jinym zpusobem :)
ale mam pocit, ze v kodu:
----
_beginning: ;už to vše začíná
mov eax, 4 ;číslo systémového voání /write/
mov ebx, 1 ;STDOUT se značí
mov ecx, pozdrav ;doplnění adresy řetězce
mov edx, 014 ;počet znaků našeho pozdravu
int 0x80 ;kernel může přijít ;)
mov eax, 1 ;zde se nám prográmek ukončí
mov ebx, 0
int 0x80
SECTION .data ;sekce s uloženými daty
pozdrav db "Hello, ROOT.cz", 0xa ;řetězec + konec řádku (LF)
len equ $ - pozdrav ;přiřazení délky řetězce symbolu
----
je nedostatek (nezkousel jsem to)
nedostatek:
mov edx, 014 ;počet znaků našeho pozdravu
bych nahradil
mov edx, len ;počet znaků našeho pozdravu
pokud se pletu, tak mi pls vysvetli proc :) thx
caf
A co testy, exit code atd. ? A taky pametova efektivita ;o) No nic, omlouvam se za lehce off-topic...
.section .text
msg:
.ascii "Hello world!\n"
msglen = .-msg
.globl _start
_start:
xorl %ebx, %ebx
incl %ebx
movl $msg, %ecx
movl $4, %eax
movl $msglen, %edx
int $0x80
xorl %ebx, %ebx
cmpl $msglen, %eax
sets %bl
xorl %eax, %eax
incl %eax
int $0x80
Tady slo o pamet, ne o rychlost ;)
... jinak jeste jedna pripominka k clanku - to, ze je cislo kladne, neznamena, ze syscall byl uspesny. Lepsi je testovat, zda ret >= (unsigned)-1024. Kernel vraci mj. i pointery, ktere zabiraji cely rozsah size_t a v takovem pripade k chybe doslo kdyz viz vyse. Mmch, presneji vraci defakto -errno, ktere se pak v libc uklada a konverti na -1/NULL/...
Jsou situace, kdy i ten pitomej bajt muze rozhodovat o Vasem byti i nebyti (coz je mimochodem otazka jednoho bitu:->)
Co se tyce techto uspor, mozna Vas to prekvapi, ale treba toto byl problem posledniho funkcne pristaleho vozitka na Marsu...
A rozdelovani zateze mezi pametovy radic (bomba! uz mame 2 kanaly po desetiletich:-()a ALU neni rozhodne k zahozeni...
Clanek je dobry napad. Prospelo by mu jenom trochu ucesat.
-> Mozna se trochu mene opajet schopnosti psat a delat legracky. Prvni odstavec o navratovem kodu je katastrofalne necitelny. Chybi tam poznamka o doplnkovem kodu (zacatecnik v asembleru muze mit trochu problemy s tim, jak zapsat treba -1).
-> Kdyz se odkazuju na manualove stranky, napisu na jake (uvedu prikaz "man xxx"). Zacatecnik houby vi, kde to ma hledat.
Snad to priste bude lepsi.
Nevim jestli autor nasel cisla syscallu a chybovych kodu v manualovych strankach, ale pocitam, ze se mu to nepodarilo.
Pro presnost:
V /usr/include/asm/unistd.h se clovek dozvi, jake ze cislo ma rekneme syscall exit():
#define __NR_exit 1
Ono je vybec lepsi tenhle header includnout a pouzivat misto "magickych konstant" tyto symbolicke konstanty.
V /usr/include/asm/errno.h se zase clovek dozvi, ze treba navratovy kod -1 je ve skutecnosti -EPERM, tedy "Operation not permitted".
Ale budiz, alespon tu nebylo tolik chyb jako v prvnim dilu ;-)
Kod toho prispevku byl napsan v AT&T syntaxi, ktera je na Unixech standard (na rozdil od syntaxe Intel pouzivane v NASM, ktera je importovana ze sveta DOSu).
Rozdilu je celkem hodne - nejvyraznejsi je zmena poradi operandu, pouzivani postfixu pro urceni velikosti operandu, pouzivani ruznych prefixu pred ruznymi typy operandu, adresovani pomoci offsetu, atd.
Napr. ulozeni hodnoty "1" do registru "EAX" je v
Inteli syntaxi:
mov eax, 1
V AT&T syntaxi:
movl $1, %eax
Postfixy jsou ruzne, napr:
8 bitu: movb $1,%al
16 bitu: movw $2,%ax
32 bitu: movl $3,%eax
64 bitu: movq $4,%rax
pokud je z operandu zrejme, jaka ma byt velikost (napr. je to registr), je mozne postfix vynechat.
Uz jste si asi vsimnul, ze konstanty maji prefix '$' zatimco registry '%'.
Rozdilu je samozrejme vic, ale tyhle jsou nejvic videt :-)
S jednochipama je to tezke - nejlepsi je, programovat je v assembleru. Ale jak clovek starne, stava se linejsi a linejsi, tak uz se mu nechce programovat v rodnem assembleru (jeste dnes znam spoustu Z80 instrukcnich kodu zpameti :-)). Ale musim rict, ze od te doby, co pouzivam SDCC (pozor, skryta reklama :-))), tak moje produktivita vzrostla neuveritelne. Program pro (omezenou) emulaci VT100 jsem mel vicemene hotovy za odpoledne. Samozrejme s pouzitim knihoven pro display, keyboard a serialku, ktere jsem uz mel pro tento hardware pripravene. Ovsem vetsina techto knihovnich funkci je v assembleru :-).