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
Názory k článku
Programujeme v jazyce Assembler v Linuxu: Trochu praxe
mozna preklep
celé vláknoRe: mozna preklep
celé vláknoTa delka 014 asi byla spravne, kdyz tam byl text "Hello world". Redakcni zasahy se holt musi delat citlive.
Re: mozna preklep
celé vláknoV tom jsem problem nevidel, retezec Hello, ROOT.cz ma 14 znaku, ale myslel jsem, ze kdyz se nekde inicializuje promena len, tak by se taky mohla vyuzit :)
Re: mozna preklep
celé vláknoAutor clanku mohl jeste zacatecnikum vysvetlit, co znamena ten "tajemny" dolar "$" a uvest jeste jiny priklad, jak se vypocita delka retezce, napr:
zprava_start
db "Hello, Sourceforge.net", 0xa
zprava_end
delka equ zprava_end - zprava_start
hello
celé vláknoA 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
Re: hello
celé vláknoxorl %eax, %eax
incl %eax
casy 386 uz sou pryc
"movl $1, %eax" je podle me rychlejsi
Re: hello
celé vláknoTady 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/...
Re: hello
celé vlákno> Tady slo o pamet, ne o rychlost ;)
Tyyy brďo, dva usporene bajty ;-)
Re: hello
celé vláknoJsou 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...
par poznamek
celé vláknoClanek 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.
Re: par poznamek
celé vláknoJa bych nerad videl tema rozmelnene vsuvkami o assembleru jako takovem, o x86 architekture apod. Tyto znalosti chapu jako prerekvizitu k tomuto clanku.
Konstanty
celé vláknoNevim 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 ;-)
Re: Konstanty
celé vláknoPro linejsi: par uzitecnych konstant jsem si uz z include souboru vysekal:
http://adela.karlin.mff.cuni.cz/~hkmaly/nasm/
Re: Konstanty
celé vláknosyntax
celé vláknoTen příspěvek kousek nademnou používá takový zvláštní zápis "movl %xxx, kam" místo "mov kam, xxx". Co tam dělá to "l". Vím, že takový kod generuje třeba gcc ale nějak mi to vrtá hlavou.
Re: syntax
celé vláknomovl = mov long = move 32bits
alespon v tomto presvedceni ziji
Re: syntax
celé vláknoKod 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 :-)
Nostalgie
celé vláknoDobrý! Jako za starých osmibitových a mainframových časů. Chválím ten článek i všechny budoucí v této sérii.
Re: VSEM
celé vláknoMoc dekuji za prispevky!
S pozdravem Martin Podhola
//btw ta promenna je trochu nadbytecna :)
Re: Nostalgie
celé vláknoSouhlasim ale jeste dnes si nedovedu predstavit programovat jednocipy jinak nez v assembleru.
Re: Nostalgie
celé vláknoS 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 :-).

