Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Döner Schniefer am 01. October 2004, 23:38
-
Hi :]
ich wollt eigentlich nur fragen ob einer von euch weiß was der Assembler macht, wenn er mal zufällig auf den Mnemonic "SEGMENT" trifft? ^^
Ich mein das is ja keine x86 Instruktion? :/
Wie registriert man also ein Segment bei der CPU?
Und wie schreibt man überhaupt ein Byte, mit mov? Weil "db" is ja schon wieder keine Instruktion.
hoff hier kann mir wenigstens einer helfen ^^
cu,
andré
-
Von dem Mnemonic "SEGMENT" hab ich noch nichts gehört, von "mov" und "db" da schon viel mehr! :)
Also, ein Byte mit mov zu schreiben ist ganz einfach:
mov ah,11111111b
Hier kopieren wir 1 Byte (in diesem Fall die Zahl 255 (FF Hexadezimal) ) in das Prozessorregister ah.
Also gibt der erste Operand an wohin kopiert werden soll und der zweite spezifiziert die Quelle.
Man könnte also auch schreiben:
mov ah,bh
Hier würden wir dann den Inhalt aus bh ( 8 Bits, foglich ein Byte ) nach ah kopieren.
Jetzt zu "db":
"db" ist die Abkürzung für "define byte". Wenn wir nun einen String erstellen wollen, schreiben wir: name db "Ein String!"
Der Assembler erstellt so eine Variable (man kann den String auch im Programmverlauf noch ändern) mit 11 Bytes. Warum?
Ganz einfach: Ein ASCII Zeichen benötigt genau 1 Byte. Wir haben hier 11 Zeichen (das Leerzeichen ist auch ein Zeichen) und so kommen 11 Bytes zustande.
-
ok danke, aber eigentlich wusste ich dass ^^
hab mich vielleicht falsch ausgedrückt, ich probiers einfach nochmal :P:
also, zu db, wie erstellt denn der Assembler die Variable? Tut der einfach an eine freie Stelle im aktuellen Segment den String schreiben? Achso ich rede vom Real-Mode :)
Und SEGMENT damit wird der folgende Code und die Daten einfach in ein neues 64KB Segment geschrieben, aber woher weiß der Assembler welches Segment noch unbenutzt ist?
Hoffe jetzt ists verständlicher :)
André
-
Genau das ist es der Assembler weiss es nämlich nich. Segment is dafür gedacht das, das OS diese Segmente zuweisen kann.
-
Ich verwende SEGMENT garnich^^ wozu auch....
wenn du schreibst "db 0x90" dann setzt der Assembler einfach an dieser Stelle wos steht ein Byte mit dem Wert 0x90, wenn du das in den Codebereich schreibst würde der Prozi das als Code auffassen 0x90 heisst nop in dem Falle also egal, aber kann gefährlich werden. Ein Assembler ist kein C Compiler der die Variablen vor den Code sortiert, das muss der Herr Programmierer da schon selbst tun
-
ui ok thx :)
das mit dem db hab ich mir auch so überlegt, aber kam mir dann komisch vor dass der proz dass dann als code aufnimmt...
naja,
nochmal thx
cu
-
Woher soll der Prozessor wissen was Daten und was Code ist?;)
-
hmmm..
hab gedacht n computer kann soviel, dann wird der das acuh irgendwie schaffen :D
-
n Computer kann erstmal garnix:D bis er programmiert wird
-
muahahah wir sind allmächtig ^^
-
Memo an mich selbst: Größenwahnsinnig angehauchte Aussagen meinerseits führen zum Durchdrehen der Mitglieder->Unterlassen:D
-
Segment ist als Anweisung nötig wenn man Programme programmiert, wäre ja fatal wenn das Programm nur feste Adressen hätte. Beim OS-Coding brauchst du das halt nich.
-
@roshl: >XD
@lobmann: achso mkay :], aber was ist wenn man daten haben will, wir ham ja vorher festgestellt dass der CPU streikt wenn das keine instuktion is, muss man den teil mit den daten einfach über-jmp-en?
-
Jo. Es ist deine Aufgabe dafür zu sorgen das der Prozessor nicht in Versuchung kommt DATEM als Code auszuführen. Das endet immer mit falschen Ergebnissen oder einem Reboot.
-
Es sei denn man macht absichtlich Hex-Codes als Variablen wie der reboot im Lowlevel #1 ^^
-
Der reboot war auch nur ein codierter Far-Jump^^ den Reboot selbst machte da das Bios:p
-
man könnte so auch etwas proggen, wo der Benutzer die Befehle selber eingeben kann. man assembliert dann das eingegebene und schreibt es in eine variable. danach macht man dann den Maschienencode für einen Jump in den teil, wo wieder ein befehl angenommen wird. wenn dann alles fertig ist, wird an den anfang der var gesprungen, der PC führt es aus, und nimmt sich dann den nächsten befehl. allerdings muss man halt noch einige sachen mit Stack usw. machen, damit die werte, die durch die eingeben verändert werden, immer so sind, wie bei dem befehl davor, und damit nicht auf parameter im proggy eingegrigffen wird. also theoretisch könnte man so den "programmausfürteil" eines OSs machen. man ließt halt einfach die befehle aus einem sektor oder so, statt von der tastatur.
-
Ok und jetzt so das ichs verstehe bitte:)
-
Er meint vermutlich dass du Hexcodes von der Tastatur einliest sprich dass sie der Benutzer eingibt, die dann in eine Variable geschrieben werden und dann zu der Variable gesprungen wird.
-
Hey ihr Thread Missbraucher ^^
das von joachim_neu dass wär ja praktisch das guute alte input+eval() aus den hochsprachen, oder? :)