nejde zkompilovat:
b.asm:7: error: symbol `start32' not defined
Jak to mohu spravit ?
nejde zkompilovat:
b.asm:7: error: symbol `start32' not defined
Jak to mohu spravit ?
nejde to zkompilovat protože je to neuplnej kod ... něco ti tam chybí ... bylo by dobrý začít se učit tak nějak od začátku ... i když nechápu k čemu ti v roce 2022 bude 64bitovej assembler ... ty se cheš stát programátorem operačního systému ???? necháš se zaměstnat ve firmě Intel ??? protože .. dokonce i ovladače se už dneska dělaj v céčku ..
#2 Jerry
Vim ze je to neuplnej kod, je to z knihy
https://www.amazon.co.uk/Low-Level-Programming-Assembly-Execution-Architecture-ebook/dp/B073GN6V7P/ref=sr_1_2?crid=2FXQ34VYKSRFS&keywords=igor+zhirkov&qid=1647773961&sprefix=igor+zhirkov%2Caps%2C154&sr=8-2
ktera je full zde:
http://libgen.rs/search.php?req=zhirkov&lg_topic=libgen&open=0&view=simple&res=25&phrase=1&column=def
Zajima me to proto, ze jsme hracicka a zkousim neobvykle pristupy k vecem.
Je nejaky zpusob jak kod zuplnit ci alespon zkompilovat do souboru .o ktery pak nekam prilinkuji ?
Začínám mít pocit, že Montezo se opět vynořil. Nebo patřím na psychiatrii že ho vidím všude.
hu
Při učení od začátku se naučíš, že instrukce jmp skočí na zadanou adresu a assembler, také zvaný jazyk symbolických adres, mimo jiné umožňuje místo adres psát symboly, které je ovšem potřeba nejdříve definovat.
...
jmp mujlabel
...
mujlabel:
; sem to skoci
Tady je far jump s uvedením selektoru, který je definovaný v GDT (s komentářem x32 code descriptor), ale výsledek je stejný.
Kompletní kód po kompilaci nepřilinkuješ "někam", ale zapíšeš ho do boot sektoru disku, ze kterého nabootuješ. Proces zavádění systému je opět potřeba nejdříve nastudovat. Nicméně v téhle fázi to nic nedělá.
Nejde vzít náhodných 10 řádků z třetí kapitoly nějaké knihy a jaksi magicky to rozchodit.
#6 gna
Diky za vysvetleni.
To je kod na kterem jsem se poprve zaseknlu pri cteni te pekne knihy.
Poradis aspon, co je toto pred tou adresou:
(0x1 << 3)
?
Uz sem se smiril s tim, ze ten kod nerozchodim, chybi tam skoro vsechno:
.start, .data atd. mam pravdu ?
A nebudte vsichni paranoidni ohledne nejakeho Monteza,
jsem vazne novy :-)
To je ten selektor.
Kompletní adresa má formát segment:offset a výsledek je segment+offset. V 32-bit režimu jsou místo segmentů selektory, takže je to selektor:offset a výsledek je bázová_adresa_selektoru+offset. Ta bázovka je definovaná v těch deskriptorech v GDT/LDT.
A většinou se pracuje jen s offsety, tj. selektor se nemění a je dán prováděnou instrukcí (kód je na cs:xxx, data jsou na ds:xxx, zásobník je na ss:xxx, ...). Když se někde píše, že adresa aktuálně prováděné instrukce je v registru eip (nebo ip/rip, teď jsme ve 32-bit, tak eip), tak ve skutečnosti je to cs:eip, ale cs nás nezajímá.
Takže pro jmp většinou definuješ jen offset:
jmp offset
; eip = offset
Ale můžeš uvést i kompletní adresu:
jmp selektor:offset
; cs = selektor
; eip = offset
Ten selektor má nějaký význam/formát a ve tvém případě je to teda 1<<3 (čili 8, nebo binárně 1000), což znamená toto:
DDDDDDDDDDDDDPPT
0000000000001000
D = deskriptor 1
P = privilege level 0 (to je na další povídání)
T = table 0 (GDT)
Takže v pseudokódu to jakoby dělá toto:
jmp GDT[1]:start32
#10 hlucheucho
To ja jsem take fenomen na math.stackexchange.com ale ne tu :-)
Poradite mi nekdo jeste co dela
or al,1
a
align ?
Ctu tu knihu od Zhirkova ale je to tezke cteni, je toho moc a je to komplikovane.
Co jsou ty GDT a LDT, nejaka fyzicka mista na procesoru ?
Diky moc
#11 Jan
Nejdříve by ses měl naučit základy Assembleru + a organizaci paměti a až poté se pokoušet si hrát s nějakým low-level programováním.
1) or al,1 - logický součet nastaví nejnižší bit,
ta skupina instrukcí znamená načtení 32bitového controlního registru CR0, následné nastavení bitu pro privilegovaný přístup a vrácení zpět do CR0
2) Align je zarovnání adresy umístění kodu/dat v paměti na daný počet Bajtů
tzn aling 16 značí, následující kód nebo data budou uložena na adrese končící .....0000
Jo, ty registry se "překrývají" a jen ah je "posunutý".
6 5 4 3 2 1
4321098765432109876543210987654321098765432109876543210987654321
^------------------------------rax-----------------------------^
^--------------eax-------------^
^------ax------^
^--ah--^^--al--^
Ale, když na 64b systému zapíšeš do 32b registru, tak se horních 32b vynuluje.
mov rax,0xfffffffffffffff0 ; rax = 0xfffffffffffffff0
or al,1 ; rax = 0xfffffffffffffff1
or ax,2 ; rax = 0xfffffffffffffff3
or eax,4 ; rax = 0xfffffff7 !
or rax,8 ; rax = 0xffffffff
Místo dotazů na každou instrukci zvlášť se podívej na strukturu registrů procesoru a na jeho instrukční sadu. Určitě se to dá vygůglit.
hu
#13 Jan
Zde jsou nějaké základy
Zde je to téměř kompletní včetně detailního popisu instrukcí, instrukcí z rozširovacích sad a speciální instrukce které jsou jen u nekterých procesorů
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku