[DOS] Exe Signature ausgeben
-
Hi,
Der Titel sagt alles, wieso kommen hier nur komische Zeichen? (Es sollte MZ/ZM) kommen:
Code:
.MODEL small .STACK 100h ;(256Byte) .DATA DOS EQU mov ah,4Ch OUTPUT EQU mov ah,09h .CODE Start: mov dx,00h OUTPUT int 21h DOS int 21h END Start
Herzlichen Dank, Gruss Bitschupser
-
Hi.
Die .exe-Datei wird nicht einfach so wie sie ist in den Speicher geladen. Das gibt's nur bei .com-Dateien. Der .exe-Header wird von DOS nur intern benutzt, um die Segmente der .exe-Datei zu laden/einzurichten. Dabei wird DOS den Header hoechstwahrscheinlich in irgendeinen Puffer laden - da kommst du aber nicht ran.
Wenn du DS nicht initialisierst, wird es wahrscheinlich aufs PSP zeigen.Wenn du den .exe-Header ausgeben willst, musst du zunaechst die .exe-Datei oeffnen, den Header in einen Puffer einlesen und diesen dann ausgeben.
BTW:
Funktion 09h erwartet einen "$"-terminierten String. Wenn du dieser Funktion einen Pointer ins Nirgendwo uebergibst, bekommst du schnell (naja, in der Praxis dauert's dann doch eher laenger) einen Screen voller Schrott und ein Beep-Konzert.
-
Hi,
Nobuo T:
Danke für die schnelle Antwort. Das $ *hmpf*!... Danke!.Du sagtest:
Wenn du den .exe-Header ausgeben willst, musst du zunaechst die .exe-Datei oeffnen, den Header in einen Puffer einlesen und diesen dann ausgeben.Kannst du mir bitte ein (Code) Beispiel geben, denn ich kann mir davon so nix vorstellen.
So habe ich es intepretiert:
Brauche ich dafür ein zweites Programm, welches vom ersten Programm die ersten 100h einliest, und dann 00h ausgibt?thanks, Gruss Bitschupser.
-
Noe, wenn du ein Programm startest, kannst du es doch auch seine eigene Programmdatei oeffnen lassen. KA, was du mit dem .exe-Header willst, aber wenn du nur die MZ-Signatur ausgeben willst, reicht es, wenn du die ersten 2Byte dieser Datei in irgendeinen Puffer laedst und den dann ausgibst. KA, wieso du meinst es sollten die ersten 100h byte sein, bzw. was mit 00h gemeint ist.
egal - kleiner Beispielcode:
;DS muss auf's Datensegment zeigen! mov dx, offset DeinProgPfad ;Offset eines 0-terminierten Strings, der den Pfad zu diesem Programm enthaelt zB. db "c:\test.exe", 00h mov ax, 3D00h ;Datei mit Handle oeffnen - ReadOnly int 21h ;CF gesetzt, wenn's daneben ging... ;Ansonsten File-Handle in ax mov dx, offset MeinPuffer ;Puffer, in den die Signatur eingelesen wird... ;sieht hier sinnvollerwiese vielleicht so aus: db " $" mov bx, ax ;FileHandle nach bx mov cx, 0002h ;2Byte einlesen mov ah, 3Fh int 21h ;CF gesetzt, wenn's daneben ging. ax enthaelt Anzahl gelesener Bytes mov ah, 3Eh int 21h ;Datei schliessen... ;dx zeigt noch auf den Puffer... ;2Byte wurden eingelesen (spaces ueberschrieben) 3. Zeichen ist "$" zum Terminieren mov ah, 09h int 21h ;ausgeben.
-
Nobuo T schrieb:
Noe, wenn du ein Programm startest, kannst du es doch auch seine eigene Programmdatei oeffnen lassen. KA, was du mit dem .exe-Header willst, aber wenn du nur die MZ-Signatur ausgeben willst, reicht es, wenn du die ersten 2Byte dieser Datei in irgendeinen Puffer laedst und den dann ausgibst.
Ja, ich will nur die MZ/ZM Signatur ausspucken.
Nobuo T schrieb:
KA, wieso du meinst es sollten die ersten 100h byte sein, bzw. was mit 00h gemeint ist.
In meinem "DOS" ASM Buch ist eine Tabelle:
00h - Signatur (MZ/ZM)
...
Wahrscheinlich habe ich sie falsch interpretiert.Vielen Dank Nuobu T für den Beispielcode.
PS: Da im Forum gibt es keine Beschränkung: Linux assembly, dos assembly, win assembly oder?
Gruss
Bitschupser
-
Bitschupser schrieb:
PS: Da im Forum gibt es keine Beschränkung: Linux assembly, dos assembly, win assembly oder?
Jo, keine Beschraenkung. Hauptsache es hat irgendwo noch was mit Assembler zu tun.