flat assembler
Message board for the users of flat assembler.

Index > DOS > Parameterübergabe *.com Datei

Author
Thread Post new topic Reply to topic
bmmueller



Joined: 06 Mar 2025
Posts: 12
bmmueller 22 Apr 2025, 08:38
Hallo
Ich versuche in assembler eine com Datei zu erstellen mit "NASM" die eine Pause kreiert und über die übergebenen Parameter variabel ist.
Also "Delay.com 2" aufrufen, wobei die 2 die Sekunden der Pause darstellt. Die Pausen funktion funktioniert wunderbar, aber die Übergabe der "2" bzw wie sie aus dem Sack auszulesen geht haut einfach nicht hin.
Die Parameter sind wohl bei BP +4 und BP +6, aber alles was ci da auslesen ist nicht was der "2" entspricht

MOV AX, [BP+4] ; Anzahl Parameter
....
MOV SI, [BP+6]
MOV BX, [SI]
MOV AX, [BX+1..+2..+3] ; String Parameter
...
Call Print ; AX auf Bildschirm ausgeben

mfG BM

[/code]
Post 22 Apr 2025, 08:38
View user's profile Send private message Reply with quote
bitRAKE



Joined: 21 Jul 2003
Posts: 4227
Location: vpcmpistri
bitRAKE 22 Apr 2025, 09:27
Hallo BM,

bmmueller wrote:

Die Parameter sind wohl bei BP +4 und BP +6, aber alles was ci da auslesen ist nicht was der "2" entspricht

MOV AX, [BP+4] ; Anzahl Parameter
....
MOV SI, [BP+6]
MOV BX, [SI]
MOV AX, [BX+1..+2..+3] ; String Parameter


Dein Ansatz mit [BP+x] ist für .COM-Dateien falsch. Die Kommandozeilenparameter werden nicht über den Stack übergeben, sondern stehen im Program Segment Prefix (PSP).

- Die Länge der Kommandozeile (ohne Programmnamen) steht als Byte bei Offset 0x80.
- Der Text der Kommandozeile beginnt bei Offset 0x81 und ist mit einem Carriage Return (ASCII 13) abgeschlossen.

Hier ein kurzes Beispiel in NASM, wie du an die "2" aus "Delay.com 2" kommen könntest (liest nur die erste Ziffer nach eventuellen Leerzeichen):

Code:
section .text
    org 0x100

start:
    mov si, 0x80
    lodsb                    ; Länge der Kommandozeile holen
    cbw
    xchg cx, ax
    jcxz .no_args           ; Keine Argumente? Dann Ende.
.skip_spaces:
    lodsb                   ; Ja -> Nächstes Zeichen
    cmp al, ' '             ; Ist es ein Leerzeichen?
    loopz .skip_spaces      ; Schleife, bis CX=0 oder kein Leerzeichen mehr
    jz .no_args             ; Nur Leerzeichen gefunden oder Länge 0

.found_arg:
    ; --- WICHTIG: ASCII-Ziffer in Zahl umwandeln ---
    sub al, '0'             ; ASCII '2' (0x32) - ASCII '0' (0x30) = 2

    ; Jetzt ist der Zahlenwert (2) in AL
    ; Hier kannst du AL für deine Pause-Funktion verwenden
    ; z.B. mov [delay_value], al

    ; ... dein restlicher Code ...

.no_args:
    ; Code für den Fall, dass keine (gültigen) Argumente übergeben wurden
    ; ...

exit:
    mov ax, 0x4C00          ; DOS-Exit-Funktion
    int 0x21

section .bss
    delay_value resb 1    


Dieser Code liest die Länge bei 0x80, setzt SI auf 0x81, überspringt Leerzeichen und liest dann das erste Zeichen. Die Zeile `sub al, '0'` wandelt den ASCII-Wert der Ziffer in den tatsächlichen Zahlenwert um.

Viel Erfolg!


FYI: x86 is mine, but the German is AI. Very Happy
(Only had one semester of German in school.)
Post 22 Apr 2025, 09:27
View user's profile Send private message Visit poster's website Reply with quote
bmmueller



Joined: 06 Mar 2025
Posts: 12
bmmueller 22 Apr 2025, 12:45
Hallo

Danke schön
Es funktioniert prima

Cool
Post 22 Apr 2025, 12:45
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.