web-dev-qa-db-fra.com

Obtenir une entrée de chaîne et afficher une entrée avec DOS interrompt MASM

Dans MASM, j'ai créé une variable de tampon pour conserver la saisie de la chaîne utilisateur à partir du clavier. Je suis coincé sur la façon de maintenir l'entrée de chaîne dans cette variable de tampon. Je n'ai pas de bibliothèques liées comme celles d'irvine et je souhaite le faire avec des interruptions DOS. Jusqu'à présent, j'ai quelque chose dans le sens de

            .model small

            .stack 100h

            .data
buff        db  25 dup(0), 10, 13
lbuff       EQU ($ - buff)              ; bytes in a string

            .code
main:
            mov ax, @data
            mov ds, ax              

            mov ah, 0Ah         ; doesn't work
            mov buff, ah        ; doesn't seem right
            int 21h                 


            mov     ax, 4000h       ; display to screen
            mov     bx, 1           
            mov     cx, lbuff           
            mov     dx, OFFSET buff     
            int     21h 

            mov ah, 4ch
            int 21h

            end main

Je suppose que l’utilisation de 0Ah est correcte car elle permet de lire un tableau d’entrée de caractères mis en mémoire tampon.

4
Jumpman

J'ai apporté des modifications à votre code. Premièrement, la variable "buff" a besoin du format à trois niveaux (nombre maximal de caractères autorisé, un autre octet pour le nombre de caractères entrés et le tampon lui-même) car c'est ce que le service 0AH requiert. Pour utiliser le service 0AH, j'ai ajouté "offset buff" (comme l'a dit Wolfgang). C'est ici:

            .model small

            .stack 100h

            .data

buff        db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
            db  ?         ;NUMBER OF CHARACTERS ENTERED BY USER.
            db  26 dup(0) ;CHARACTERS ENTERED BY USER.

            .code
main:
            mov ax, @data
            mov ds, ax              

;CAPTURE STRING FROM KEYBOARD.                                    
            mov ah, 0Ah ;SERVICE TO CAPTURE STRING FROM KEYBOARD.
            mov dx, offset buff
            int 21h                 

;CHANGE CHR(13) BY '$'.
            mov si, offset buff + 1 ;NUMBER OF CHARACTERS ENTERED.
            mov cl, [ si ] ;MOVE LENGTH TO CL.
            mov ch, 0      ;CLEAR CH TO USE CX. 
            inc cx ;TO REACH CHR(13).
            add si, cx ;NOW SI POINTS TO CHR(13).
            mov al, '$'
            mov [ si ], al ;REPLACE CHR(13) BY '$'.            

;DISPLAY STRING.                   
            mov ah, 9 ;SERVICE TO DISPLAY STRING.
            mov dx, offset buff + 2 ;MUST END WITH '$'.
            int 21h

            mov ah, 4ch
            int 21h

            end main

Lorsque 0AH capture la chaîne à partir du clavier, elle se termine par ENTER (caractère 13). C'est pourquoi, si vous souhaitez capturer 25 caractères, vous devez spécifier 26.

Pour connaître le nombre de caractères entrés par l'utilisateur (longueur), accédez au deuxième octet (offset buff + 1). L'entrée ENTER n'est pas incluse. Ainsi, si l'utilisateur tape 8 caractères et ENTER, ce deuxième octet contiendra le nombre 8, pas 9.

Les caractères entrés commencent à offset buff + 2 et se terminent à l'affichage du caractère 13. Nous utilisons cela pour ajouter la longueur au buff + 2 + 1 afin de remplacer chr (13) par '$'. Maintenant, nous pouvons afficher la chaîne.

Ceci est mon code, peut-être peut vous aider.

;Input String Copy output

dataarea segment
    BUFFER db 81
           db ?
    STRING DB 81 DUP(?)
    STR1 DB 10,13,'$'   
dataarea ends

extra segment
    MESS1 DB 'After Copy',10,13,'$'
    MESS2 DB 81 DUP(?)
extra ends

code segment
main proc far
    assume cs:code,ds:dataarea,es:extra
start:
    Push ds
    sub ax,ax
    Push ax

    mov ax,dataarea   
    mov ds,ax

    mov ax,extra      
    mov es,ax

    lea dx,BUFFER     
    mov ah,0ah
    int 21h

    lea si,STRING
    lea di,MESS2
    mov ch,0
    mov cl,BUFFER+1
    cld
    rep movsb
    mov al,'$'
    mov es:[di],al

    lea dx,STR1            ;to next line
    mov ah,09h
    int 21h

    Push es
    pop ds

    lea dx,MESS1           ;output:after copy
    mov ah,09h
    int 21h

    lea dx,MESS2
    mov ah,09h
    int 21h

    ret
main endp
code ends
    end start

Et le résultat est:

c:\demo.exe
Hello World!
After Copy
Hello World!
1
黄壮壮

Vous pouvez suivre ce code:

; Problem : input array from user

.MODEL SMALL
.STACK
.DATA
   ARR DB 10 DUB (?)     

.CODE
 MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    XOR BX, BX
    MOV CX, 5

    FOR: 
      MOV AH, 1
      INT 21H
      MOV ARR[BX], AL
      INC BX
    LOOP FOR

    XOR BX, BX
    MOV CX, 5

    PRINT:  
     MOV AX, ARR[BX] ;point to the  current index 

     MOV AH, 2       ;output
     MOV DL, AX  
     INT 21H     

     INC BX           ;move pointer to the next element 
    LOOP PRINT       ;loop until done

 MAIN ENDP
0
rashedcs