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.


Anmelden zum Antworten