通过中断 21h 服务 0AH(09H 用于显示)从键盘捕获字符串。捕获的字符串以 chr(13) 结尾。要显示此字符串,必须将 chr(13) 替换为 '$',或者,要将字符串用作文件名(例如,创建文件并写入文件),请将 chr(13) 替换为 chr(0) .
使用 0AH 捕获字符串需要三个 DB 的数据段中的变量,下图说明逻辑:
前两个字符用于控制(0AH 需要它们)。有用的字符串从位置 2(第三个字节)开始。
要找出结束 chr(13) 的位置,我们要做的就是将长度(第二个字节)加到第三个字节 capisci 上?
现在是代码。下一个小程序向用户显示一条消息并等待字符串,将 chr(13) 替换为 chr(0)(创建和 ASCIIZ 字符串),使用该字符串创建一个文件,将文本写入它并关闭它。注意数据段中的变量filename,三个DB:
.model small
.stack 100h
.data
handle dw ?
filename db 26 ;MAX NUMBER OF CHARACTERS ALLOWED (25).
db ? ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
db 26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).
msj db 'ENTER FILE NAME HERE: $'
text db 'text for file' ;LENGTH = 13.
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;DISPLAY MESSAGE.
mov dx, offset msj
mov ah, 9
int 21h
;CAPTURE FILENAME FROM KEYBOARD.
mov ah, 0Ah
mov dx, offset filename ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
int 21h
;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
mov si, offset filename + 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, 0
mov [ si ], al ;REPLACE CHR(13) BY 0.
;CREATE FILE.
mov ah, 3Ch
mov cx, 0
mov dx, offset filename + 2 ;CHARACTERS START AT BYTE 2.
int 21h
mov handle, ax ;PRESERVE FILE HANDLER.
;WRITE SOME TEXT TO FILE.
mov ah, 40h
mov bx, handle ;THE FILE.
mov dx, offset text
mov cx, 13 ;LENGTH OF TEXT.
int 21h
;CLOSE FILE
mov ah, 3Eh
mov bx, handle
int 21h
;END PROGRAM.
mov ah, 4ch
int 21h
差点忘了:变量文件名表示最大长度为 26,但我们预计为 25。最后 chr(13) 需要一个额外的字节。例如,如果要捕获 10 个字符,请将 11 指定为最大长度。