Bei FASM auf andere PE-Section zugreifen

Moin,

ich habe heute Nacht angefangen, FASM zu lernen
und auch sofort "Hello world!" ausprobiert.
Aber ich weiß nicht, wie ich auf eine andere Section zugreife.

Bei NASM wäre es so:
Code:
segment code
 
 start:
 mov ax, data
 mov ds, ax
 
 mov dx, hello
 mov ah, 09h
 int 21h
 
 mov al, 0
 mov ah, 4Ch
 int 21h
 
 segment data
 hello: db 'Hello World!', 13, 10, '$'

Bei FASM wird aber segment nur für MZ-Dateien benutzt. Für PE Dateien wird es durch "section '.name' einige Flags" ersetzt, aber wie kann ich dann auf die andere Sektion zugreifen?

Bei NASM geht es mit :
Code:
mov ax, data
mov ds, ax

Aber wie bei FASM?

Hier mein nichtfunktionierende Code für FASM
Code:
format  PE console
entry start

section '.code' code readable executable

  start:

        mov ax, '.data'
        mov ds, ax
 
        mov dx, hello
        mov ah, 09h
        int 21h
 
        mov al, 0
        mov ah, 4Ch
        int 21h

section '.data' data readable writeable

  hello db 'Hello World!', 13, 10, '$'


Fehler ist "Error: value out of range"

Leider gibt es nur wenige Dokus über FASM gibt.
Die meisten sind über NASM, welches aber etwas anders ist.
 
PE= Portable Executable? Das wäre 32-Bit Format und da braucht man eigenltich kein DS/CS usw mehr. Mit einem Label (was letzendlich die Variablennamen unter Asm auch sind) oder Direktadressierung bekommt man problemlos Zugriff. Allerdings kommst Du da (PE) mit DOS Interrupts auch nicht wirklich weiter ;)
 
PE Sectionen sind nur logischer Natur (logische Unterteilung, begrenzt auf 96).
Die Namen sind frei wählbar und man kann rein theoretisch auch alles in eine Section quetschen. Intern gesehen gibt es kleine Unteschiede, wenn der PE-Loader des Betriebssystems die Section in den Speicher lädt (Initialisierung und weiterer Kram - wie der Unterschied zwischen physikalischer und virtueller Größe).

CS/DS brauchst Du nur für DOSe oder ähnliche Spässe (16-Bit Zeug, habe es nie ernsthaft gemacht ;) ).
Was den Fehler "Error: value out of range" angeht: Du möchtest eine 32-Bit Adresse in 16-Bit (teil) Register laden? ;)

Quellen:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
 
Original von CDW
PE Sectionen sind nur logischer Natur (logische Unterteilung, begrenzt auf 96).
Die Namen sind frei wählbar und man kann rein theoretisch auch alles in eine Section quetschen.

Und warum macht man dann das nicht?

Original von CDW
Intern gesehen gibt es kleine Unteschiede, wenn der PE-Loader des Betriebssystems die Section in den Speicher lädt (Initialisierung und weiterer Kram - wie der Unterschied zwischen physikalischer und virtueller Größe).
Also gibt es doch Unterschiede.
Sind die Unterschiede wenigstens für den Coder relevant oder nur fürn OS.

Und wie greift man auf diese Sektion zu?
Ganz normal oder muss man, wie im Wikipedia Beispiel, die Sektion ins DS verschieben?
 
Und warum macht man dann das nicht?

Um eine sinnvolle Trennung von Daten und Code beizubehalten. Die Code-Section ist im Normalfall auch nicht beschreibbar, was Sinn macht. ;)

Und wie greift man auf diese Sektion zu?

Du greifst nicht auf die Sektion zu. Du greifst direkt auf die Daten der Sektion zu. Die sind nämlich alle in den selben virtuellen Speicherraum gemappt.
Greife also direkt auf deine Variable hallo zu.

Ich sehe, du vermischt hier sehr viele Aspekte der 16-Bit- und Win32-Programmierung.
Bevor deine Verwirrung komplett ist, würde ich mir z.B. Iczelions Tutorials anschauen. ;)
 
nd warum macht man dann das nicht?
Und wer sagt das denn? unter masm linkt man mit
/MERGE:.rdata=.text
und setzt die Hauptsecitonflags auf ReadWriteExecute
/section:.text,RWE

Dadurch ergibt sich allerdings z.B keine Trennung zwischen code und daten. Das wäre z.B für Fehlervermeidung wichtig.


Sind die Unterschiede wenigstens für den Coder relevant oder nur fürn OS.
Für Coder: hängt vom Assembler ab. Per Default hat z.B eine Datensection nur ReadWrite, aber kein Execute Flag, die codesection Read/Execute aber kein Write.
d.h man muss beim Linken paar Optionen angeben. Ob DS angabe oder nicht, hängt afaik auch vom assembler ab. MASM möchte z.B keine DS Prefixe haben (weil es eben, wie erwähnt, irrelevant ist)
Für OS: solange alle Zugriffsflags richtig gesetzt ist, ist es dem OS egal, wieviele Section verwendet werden.


Und wie greift man auf diese Sektion zu
Ganz normal oder muss man, wie im Wikipedia Beispiel, die Sektion ins DS verschieben??
ganz normal, in dem man Label/variablennamenadresse lädt/verschiebt/was auch immer.
32-Bit => keine Segmente notewendig.

Edit: etwas zu langsam.Ich gebe Atho recht: gehe es etwas langsam an und bedenke dabei dass 16-Bit Programmierung wesentlich älter ist.
 
Original von +++ATH0
Bevor deine Verwirrung komplett ist, würde ich mir z.B. Iczelions Tutorials anschauen. ;)

und damit meine Verwirrung nicht noch weiter geht, könnt ihr mir Links zu FASM Tutorials geben, da manche Sachen von dort nicht bei mir gehen? :rolleyes:
 
Naja, direkt geht es natürlich nicht. Aber die Unterschiede zwischen beiden "Dialekten" ist meiner Meinung nach sehr gering.
Schau dir mal die Examples im FASM Ordner an, parallel dazu kannst du die Beispiele aus den Tutorials von MASM nach FASM übersetzen, was eine sehr gute Übung sein dürfte. Ein bisschen Abstraktionsvermögen und Verständniskapazitäten vorrausgesetzt. ;)
 
Zurück
Oben