MASMでは、キーボードからのユーザー文字列入力を保持するためのバッファー変数を作成しました。文字列入力をそのバッファ変数に保持する方法に固執しています。 irvineのようにリンクされたライブラリがないので、DOS割り込みでこれを実行したいと思います。これまでのところ、私はの線に沿って何かを持っています
.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
バッファリングされた文字の入力の配列を読み取るために0Ahを使用するのは正しいと思います。
コードにいくつか変更を加えました。まず、「buff」変数には3レベルの形式(許可される最大文字数、入力された文字数の別のバイト、およびバッファー自体)が必要です。これは、サービス0AHが必要とするものだからです。サービス0AHを使用するために、「オフセットバフ」を追加しました(Wolfgangが言ったように)。ここにあります:
.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
0AHがキーボードから文字列をキャプチャする場合、ENTER(文字13)で終わります。そのため、25文字をキャプチャする場合は、26を指定する必要があります。
ユーザーが入力した文字数(長さ)を知るには、2番目のバイト(オフセットバフ+1)にアクセスします。 ENTERは含まれていないため、ユーザーが8文字を入力してENTERを押すと、この2番目のバイトには9ではなく8という数字が含まれます。
入力された文字はオフセットバフ+2で始まり、文字13が表示されたときに終了します。これを使用して長さをbuff + 2 + 1に追加し、chr(13)を「$」に置き換えます。これで文字列を表示できます。
これは私のコードです、多分あなたを助けることができます。
;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
そして結果は次のとおりです。
c:\demo.exe
Hello World!
After Copy
Hello World!
あなたはこのコードに従うことができます:
; 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
;これを試してみてください。ユーザーからの10文字の文字列入力を受け取り、「こんにちは* 10文字の文字列入力」の後に表示します。
.MODEL TINY
.CODE
.286
ORG 100h
START:
MOV DX, OFFSET BUFFER
MOV AH, 0ah
INT 21h
JMP PRINT
BUFFER DB 10,?, 10 dup(' ')
PRINT:
MOV AH, 02
MOV DL, 0ah
INT 21h
MOV AH, 9
MOV DX, OFFSET M1
INT 21h
XOR BX, BX
MOV BL, BUFFER[1]
MOV BUFFER [BX+2], '$'
MOV DX, OFFSET BUFFER +2
MOV AH, 9
INT 21h
M1: db 'Hello $'
END START
END