Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: jeb am 01. April 2005, 16:57
-
also folgenden code kapier ich auch nicht:
;Springe zu diesem Kernel
mov ax, 0x1000 ; Die Adresse des Programms
mov es, ax ; Segmentregister updaten
mov ds, ax
push ax
mov ax, 0
push ax
retf
wie wird hier zum kernel gesprungen :?:
mfg
jeb
-
Die Adresse wird halt von hand auf den Stack gepusht und dann nen retf (rückkehr nach far call) ausgeführt. nen far jump häts genauso getan ;)
-
Also folgendes wenn du mit call in eine routine springst wird dir rücksprungadresse auf dem stack abgelegt, damit wir wissen wo wir hergekommen sind. mit ret erfolgt der rücksprung indem es die adresse vom stack holt.
retf ist der far pendant dazu, es nimmt zusätzlich noch ein segement entgegen. durch das pushen wird praktisch das call simuliert ohne ein wirkliches call durchzuführen und das retf nimmt segement und offset und springt dort hin "zurück"
Auf Intel-Architekturen gibt es viele solcher Tricks^^
-
Also sind Intel-Menschen doch kreativer als die Appler >)
-
definitiv^^
-
ich frage mich bloß, warum man sowas tut. ist es zu schwer sowas zu schreiben?
jmp 0x1000:0000
kommt aufs gleicher heraus, ist kürzer, übersichtlicher, verständlicher (sieht man ja wie einsteigerfreundlich das ist) und einfacher zu debuggen.
-
also mit nem farjump kommt das gleiche rasu. ok, aber warum denn das ganze mir retf? (nus so aus neugirde, mein problem hat sich erledigt).
mfg
jeb
-
Wahrscheinlich von einem uralten Tutorial abgeguckt und nur eine Angewohnheit. Meine Vermutung ist, dass es früher mal Assembler gab, die Zahlenwerte in jmp-Statements nicht angenommen haben, und der Workaround mit dem retf hat sich bei einigen "alten Hasen" vielleicht eingeschliffen.
-
manchmal macht man aus spass sowas^^ oder gerade um andere zu verwirren. Ausserdem fällt mir noch ein grund ein, aber der is mir zu kompliziert zu erklären^^
-
erklär ruhig ;)
-
ich denke mal an solchem code erkennt man den grad der 1337ness des coders ;)
-
wenn man den sprung nicht statisch machen will sondern dynamisch mit veränderlichen zielen, dann müsste man ja 2 register angeben , ich glaube aber das geht nicht. deswegen das pushen.
Jedenfalls mach ichs so in meinem neuen bootloader deswegen, ich hoffe du verstehst mich^^ habs kurz gefasst