flat assembler
Message board for the users of flat assembler.
![]() |
Author |
|
bitRAKE 22 Apr 2025, 09:27
Hallo BM,
bmmueller wrote:
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. ![]() (Only had one semester of German in school.) |
|||
![]() |
|
bmmueller 22 Apr 2025, 12:45
Hallo
Danke schön Es funktioniert prima ![]() |
|||
![]() |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.