Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bscreator am 02. March 2005, 22:29
-
Hi Leute,
ich hab ein paar Fragen zum CS und DS. Was ich weiß ist, dass CS den Quellcode und DS die Variablen des Codes enthält (Korrigiert mich bitte, falls ich falsch liege...)
1. Bei welchen Befehlen in NASM unterliegen CS und/oder DS Veränderungen ?
2. Welche Auswirkungen hat es, CS und DS zur Laufzeit NICHT zu sichern ?
3. Warum muss man CS und/oder DS eigentlich speichern (z.B. push CS), wenn sich der Code zur Laufzeit doch sowieso nicht ändert ?
Thanks,
bscreator
-
Du solltest ds immer dann sichern, wenn du einen anderen Wert reinschreibst, weil du beispielsweise auf Daten in einem anderen Segment zugreifen willst. Wenn du ds nicht wiederherstellst, wirst du keinen Zugriff mehr auf die Daten haben, die in dem anderen Segment lagen. Befehle, die ds einfach verändern sind mir nicht bekannt. Mit ds passiert nichts, solange du es nicht veränderst ...
Für cs gilt dies analog...
-
Also immer wenn ich auf die Daten eines anderen Segments, z.B. SS oder ES zugreife, geschieht dies mit dem Umweg über das DS und/oder CS-Segment, oder ?
-
ohoh! also mit DS gibt man im RM ein Segment an, im PM ein deskriptor. im RM is das ändern von DS net strafbar, im PM kann man dafür als task mit priv 3 die todesstrafe bekommen ;-) genauso isses mit CS. allerdings kann man CS genauso wie (E)IP nur durch jumps, calls oder sonstiges ändern. normalerweise hat man DS und CS auf dem gleichen, weil die daten mithilfe von "db" und "dw"s in den code kommen, und sonst die adressierung des assemblers net ginge. der unterschied is nur, dass man DS halt nimmt, wenn man auf etwas zugreift, was im speicher is und mit CS halt calls und so ausführt.
-
Ich arbeite im Real-Mode. Also ändern sich CS und DS durch jmp´s und call´s, oder ?
-
ne, DS ändert sich nicht, CS ändert sich bei calls und jumps und ints und so.
-
Und wann ändert sich DS (Wenn ich nicht manuell den Wert ändere) ?
-
erweiterte frage ;):
ändert sich ds auch net wenn man z.b ein stosb über ein segment hinaus macht?
-
erweiterte frage ;):
ändert sich ds auch net wenn man z.b ein stosb über ein segment hinaus macht?
Ich denke, dass die CPU so dumm ist und DI nach 0FFFFh auf 0 setzt. Ausserdem benutzt STOSB das ES- und nicht das DS-Register.
-
ich denke, die CPU setzt dann SI/DI auf 0, wenn es bei 0xFFFF angekommen ist und ändert DS/ES nicht... bin mir aber nicht sicher!
-
DS und ES werden nicht verändert. Sonst würde die CPU unberechbar werden. Dumm ist das nicht, sondern eher das Gegenteil: Wenn Zugriffen auf SI sich DS ändern würden, würden alle nachfolgenden Speicheroperationen sonst wohin gehen. Das wäre eine ganz schöne Sauerei. (Bzw. Segment-Register-hin-und-her-gesichere ...)
-
Könnten wir bitte auf meine Frage zurückkommen ?
Und wann ändert sich DS (Wenn ich nicht manuell den Wert ändere) ?
-
Und wann ändert sich DS (Wenn ich nicht manuell den Wert ändere) ?
gar nicht. außer du hast irgendwelchen code, von dem du nichts weisst (BIOS, anderer Fremdcode), der DS ändert.
Achja, bei Hardware-Taskswitchen ändert sich DS, aber das passiert ja nicht mal eben so ohne dein Wissen (und ist außerdem Protected Mode Stuff)