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.
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!
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