Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Programujeme v jazyce Assembler v Linuxu: Trochu praxe

michal_sjx
michal_sjx (neregistrovaný)
8. 7. 2004 9:01 Nový

mozna preklep

celé vlákno

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

Stepan Kasal
Stepan Kasal (neregistrovaný)
8. 7. 2004 9:27 Nový

Re: mozna preklep

celé vlákno

Ta delka 014 asi byla spravne, kdyz tam byl text "Hello world". Redakcni zasahy se holt musi delat citlive.

michal_sjx
michal_sjx (neregistrovaný)
8. 7. 2004 9:33 Nový

Re: mozna preklep

celé vlákno

V 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 :)

klaun2
klaun2 (neregistrovaný)
10. 5. 2006 15:22 Nový

Re: mozna preklep

celé vlákno
Tak,tak... :-) Pritom v kodu, odkud autor bezesporu cerpal, ta promenna uzita je! (http://asm.sourceforge.net/intro/hello.html).
Autor 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
klaun2
klaun2 (neregistrovaný)
10. 5. 2006 15:26 Nový

Re: mozna preklep

celé vlákno
jeste dvojtecky... :-)
kvr
kvr (neregistrovaný)
8. 7. 2004 10:00 Nový

hello

celé vlákno

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

pht
pht (neregistrovaný)
8. 7. 2004 13:34 Nový

Re: hello

celé vlákno

xorl %eax, %eax
incl %eax

casy 386 uz sou pryc
"movl $1, %eax" je podle me rychlejsi

kvr
kvr (neregistrovaný)
8. 7. 2004 15:51 Nový

Re: hello

celé vlákno

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/...

Michal Ludvig
Michal Ludvig (neregistrovaný)
8. 7. 2004 19:02 Nový

Re: hello

celé vlákno

> Tady slo o pamet, ne o rychlost ;)

Tyyy brďo, dva usporene bajty ;-)

PaJaSoft
PaJaSoft (neregistrovaný)
12. 7. 2004 14:22 Nový

Re: hello

celé vlákno

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...

Jakub
Jakub (neregistrovaný)
8. 7. 2004 10:00 Nový

par poznamek

celé vlákno

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.

petr_p
petr_p (neregistrovaný)
8. 7. 2004 12:48 Nový

Re: par poznamek

celé vlákno

Ja bych nerad videl tema rozmelnene vsuvkami o assembleru jako takovem, o x86 architekture apod. Tyto znalosti chapu jako prerekvizitu k tomuto clanku.

Michal Ludvig
Michal Ludvig (neregistrovaný)
8. 7. 2004 14:27 Nový

Konstanty

celé vlákno

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 ;-)

hkmaly
hkmaly (neregistrovaný)
12. 7. 2004 20:38 Nový

Re: Konstanty

celé vlákno

Pro linejsi: par uzitecnych konstant jsem si uz z include souboru vysekal:

http://adela.karlin.mff.cuni.cz/~hkmaly/nasm/

Jogin
Jogin (neregistrovaný)
17. 2. 2008 22:12 Nový

Re: Konstanty

celé vlákno
A pro ještě línější - stačí se kouknout na fórum o mikrořadičích a mikroprocesorech a je jasno.
aLop
aLop (neregistrovaný)
8. 7. 2004 14:31 Nový

syntax

celé vlákno

Ten 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.

michal_sjx
michal_sjx (neregistrovaný)
8. 7. 2004 15:51 Nový

Re: syntax

celé vlákno

movl = mov long = move 32bits

alespon v tomto presvedceni ziji

Michal Ludvig
Michal Ludvig (neregistrovaný)
8. 7. 2004 18:58 Nový

Re: syntax

celé vlákno

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 :-)

raxas
raxas (neregistrovaný)
8. 7. 2004 18:07 Nový

Nostalgie

celé vlákno

Dobrý! 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.

Martin Podhola
Martin Podhola (neregistrovaný)
8. 7. 2004 21:31 Nový

Re: VSEM

celé vlákno

Moc dekuji za prispevky!

S pozdravem Martin Podhola


//btw ta promenna je trochu nadbytecna :)

PavelP
PavelP (neregistrovaný)
9. 7. 2004 7:14 Nový

Re: Nostalgie

celé vlákno

Souhlasim ale jeste dnes si nedovedu predstavit programovat jednocipy jinak nez v assembleru.

Josef Pavlik
Josef Pavlik (neregistrovaný)
9. 7. 2004 22:42 Nový

Re: Nostalgie

celé vlákno

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 :-).

Zasílat nově přidané příspěvky e-mailem