Assembler verstehen section .data?
The data section is used for declaring initialized data or constants. This data does not change at runtime. You can declare various constant values, file names, or buffer size, etc., in this section.
Soweit ok!
In der section .data
mymsg db 'Hello World', oxa
Fragen dazu: Dieses mymsg ist jetzt in dem Fall eine Adresse und keine Variable.
=> Richtig? Da Variablen in section bss liegen?
=> db heißt ja define byte. Bedeutet das jetzt, dass ich für mymsg, die Adresse, ein Byte festlege bzw. freien Speicher zuordne?
3 Antworten
Es gilt zu unterscheiden was der Compiler und der Linker macht.
Dein CodeSnip ist das Compiler Eregebnis.
"Wo" die Dinge dann im Speicher lieger sagt das Linker Ergebnis.
Wenn du über Linker Direktiven BEWUßT festlegst "wo" die Dinge im Speicher liegen sollen, dann wird dies durch den Linker berücksichtigt.
..dies gilt für die Hardware nahe Programmierung..(mit Ausnnahmen)
==
Wird ein Programm für den PC geschrieben, wird es von der Festplatte ins RAM geladen und dort ausfgeführt. Dann kommen virtuelle Adressen ins Spiel.
Aber auch hier kann man Einfluß nehmen. Ist dann aber eher die Ausnahme.
==
"DB" würde ich in diesem Fall nur als Datenformat Information interpretieren. "Jedes einzelne Element" des Strings ist ein Byte, welches mit Character 10dez (Linefeed) abgeschlossen ist.
"mymsg" sehe ich als Deklarationsnamen für "Hello World!" an.
An welcher Adresse es sich befindet wird aus dem Snip nicht sichtbar.
Da musst du nach dem kompletten kompilier- und linker Vorgang ins "MAP" File oder interpretiertes "ELF" File schauen.
Je nach Plattform sind aber auch noch andere File Types für die analoge Information möglich.
Variablen sind ein logisches Konstrukt - der symbolische Name im Sourcecode ist im Endeffekt meist die Adresse eines Speicherortes.
https://en.wikipedia.org/wiki/.bss
.bss wird im wesentlichen für Variablen ohne Initialwertz genutzt. Der Dynloader erzeugt .bss während der Prozesserzeugung.
Es gibt dann auch noch Sektionen wie .rodata, mit abweichendem Speicherschutz und dergleichen mehr (ein Teil dient dem dynloader/-linker dazu seine Arbeit zu verrichten).
Define byte heißt nur, daß Du eine Sequenz von Bytewerten in der .data Sektion haben willst, die Labels dienen der einfacheren Adressbestimmung.
Die .data section wird beim Laden des Executeables 1:1 in einen Speicherblock gelegt.
P.S.: Übrigens ist der einleitende Text falsch, Konstanten sollten in .rodata platziert werden.
Das beantwortet zwar nicht direkt deine Frage (lerne selbst noch Assembly), sorry, aber ChatGPT kann dir da sicher besser weiterhelfen als die GuteFrage Community.