Warum gibt mein Programm den buffer nicht aus?
-
IDEAL MODEL SMALL STACK 100 DATASEG buffer db ? CODESEG start: STARTUPCODE mov ah, 10 mov [buffer], ah mov dx, OFFSET buffer int 21h EXITCODE end start
Ich möchte, dass man einen einfachen Text schreibt, welcher hinterher wieder ausgegeben wird. Warum funktioniert mein Code nicht? Ich verwende Turbo Assembler.
-
1. Flasche Funktion -> ah = 9
2. du übergibst keine String, sondern nur ein Zeichnen, das nicht mal sichtbar ist(10=Zeilenvorschub) -> buffer db "10$"
-
hier ist eine kleine debug session, mit der du anschauen kannst, was du genau gemacht hast:
C:\Users\nachtfeuer>debug
-a 1B29:0100 mov ah,a 1B29:0102 mov [120],ah 1B29:0106 mov dx,120 1B29:0109 int 21 1B29:010B nop 1B29:010C nop 1B29:010D nop 1B29:010E -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0100 NV UP EI PL ZR NA PE NC 1B29:0100 B40A MOV AH,0A -t DPMI entry hooked, new entry=1449:2C2F AX=0A00 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0102 NV UP EI PL ZR NA PE NC 1B29:0102 88262001 MOV [0120],AH DS:0120=00 -t AX=0A00 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0106 NV UP EI PL ZR NA PE NC 1B29:0106 BA2001 MOV DX,0120 -t AX=0A00 BX=0000 CX=0000 DX=0120 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0109 NV UP EI PL ZR NA PE NC 1B29:0109 CD21 INT 21 -p AX=0A0D BX=0000 CX=0000 DX=0120 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=010B NV UP EI PL ZR NA PE NC 1B29:010B 90 NOP -d 1B29:0100 B4 0A 88 26 20 01 BA 20-01 CD 21 90 90 90 00 00 ...& .. ..!..... 1B29:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1B29:0120 0A 09 68 61 6C 6C 6F 2C-20 77 61 0D 00 00 00 00 ..hallo, wa..... 1B29:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1B29:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1B29:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1B29:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1B29:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -
Man muss zuerst Daten in den Speicher mit dem Interrupt einlesen, dann mit einer anderen Funktion auf den Bildschirm schreiben, z.B.
mov ah,09 mov bl,24 ;Endemarkierung für Stringausgabe Funktion 09 (mov bl,24h) mov [12c], bl mov dx,122
für die Funktion 0A ist aber eine andere Ausgabe Funktion sinnvoll, weil die Einlesefunktion die Anzahl der Bytes bzw. die Länge des Strings am Anfang speichert, und mit Enter abschließt, z.B.:
mov ah,40 ;IO Funktion mov bx,1 ;Ausgabe schalter mov cl,[121] ;Anzahl der Zeichen/Länge der Eingabe mov ch,0 ;falls da was drin stehen sollte mov dx,122 int 21
-
Vielen Dank an euch beiden.
Ich werden den Code heute Abend mal ausprobieren.