segmente in NASM
-
ich wollte mal ein bischen in assembler reinschnuppern und hab mich deshalb hier mal durch die faq gesucht. Hab auch schon ein paar tutorials durchgelesen, und wollte mich dann im speziellen NASM zuwenden, da mir MASM von der syntax nicht behagte, und der TASM ja auch kostet. Die entsprechende software hab ich schon, und die NASM referenz befindet sich in meinen bookmarks.
das problem ist nun, dass es ja keinerlei einsteiger tutorials für nasm gibt.Die syntax im codesegment ist ja zum glück zwischen den verschiedenen sprachdialekten sehr ähnlich,sodass man ruhig ein TASM tutorial für diesen teil nehmen kann, aber wie man die segmente(mit/ohne speichermodell) bei NASM angibt, ist mir absolut unklar, und ich konnte selbst bei einer intensiven suche nichts dazu finden(oder war zu dumm, das zu verstehen).
könnte sich vielleicht jemand für mich erbarmen, und mir die zu verwendende syntax erklären? ein link zu einem gut dokumentierten stück code würde aber auch reichen.
//edit
viele tutorial links in der faq, vorallem in der AT&T sektion sind tot
-
has du dir schon die dokumentation angesehen?
http://sourceforge.net/projects/nasmsoweit ich das erkenne, kann die deklaration ganz ähnlich wie bei mams/tasm ablaufen:
section .text ; schon vordefiniert, so dass man sich um attribute nicht unbedingt kümmern muss ; irgendwelcher code ; ... ..start: ; start bei 16bit .exe ; ... section .data ; dito ; irgendwelche (initialisierte) daten section. .bss ; irgendwelche nichtinitialisierte daten ; bei 16 bit .exe noch: section stack stack ; hier genug platz reservieren
man kann auch segement gruppieren und weitere segmente deklarieren, darauf will ich hier nicht eingehen; wenn du das mal brauchst, wird die dokumentation sicher weiterhelfen. die segmentnamen sind ganz normale symbole, die den selektor enthalten, so dass z.b
mov ax, data mov ds, ax mov ax, stack mov ss, ax
die segmentregister in 16bit .exe richtig initialisiert.
es kommt drauf an, für welches system du programme schreibst. wenn du nur irgendwelche funktionen für c/c++ auf windows oder linux systemen schreiben willst, dann wird in den meisten fällen .text und .data völlig reichen.
P.S.: habe kein nasm; irgendwelche fehler dir ihr findet, könnt ihr also behalten
-
erstmal danke für die info
has du dir schon die dokumentation angesehen?
ja, das war das, was ich "referenz" getauft hatte
section .text
ist das der code teil?//edit ja->docu^^
section .data ; dito section. .bss
worin genau besteht der unterschied zwischen den beiden sektionen?
//edit ok, klar initialisiert und uninitialisiert...wofür braucht man letzteres?; bei 16 bit .exe noch: section stack stack
wieso nur bei 16bit exe? Ich dachte, jedes programm hätte ne stack sektion?
-
//edit ok, klar initialisiert und uninitialisiert...wofür braucht man letzteres?
was nicht initialisiert ist, brauchst du auch in der .exe nicht mit dir rumschleppen, macht also das file kleiner.
wieso nur bei 16bit exe? Ich dachte, jedes programm hätte ne stack sektion?
weil beim programmstart sowieso schon alle segmente (cs...ss; fs und gs sind tabu - wenigstens in windows) initialisiert sind, einschliesslich des stacks (tatsächlich steht in ds..ss dasselbe drin, und in cs zwar ein anderer selektor, der aber auf denselben speicherbereich zeigt). ein 32bit (user-level)programm beendet sich einfach durch ein normales ret n. im 32bit flat model haben die sektionen bzw. segmente rein deklarativen charakter. es werden zwar alle deklarationen in den einzelnen segmenten zusammengefasst (wenn du also ständig zwischen .data und .text wechselst, ist das in der .exe nicht zu erkennen), du kannst aber prinzipiell über alle segmentregister auf alles zugreifen (nur eingeschränkt über cs, und schreibzugriffe auf codebreich bzw. jmps in datenbereiche können u.u. zu exceptions führen). jeder prozess hat ja wenigstens einen thread, und jeder thread bekommt vom system einen eigenen stack zugewiesen.