用INT 21H 的A号功能,输入一个字符串“Hello, world!”,存放在内存,然
后倒序输出。
在DOS中断中,INT 21H是一个常用的系统功能调用中断,它提供了多种功能,其中A号功能用于字符串的输入。
在使用这个功能时,通常需要设置一个缓冲区来存储输入的字符串。
缓冲区的格式是特定的:
第一个字节通常表示缓冲区的大小,即可以存储的最大字符数(包括最后的回车符);
第二个字节在接收到字符串后将放置实际输入字符串的大小(不包括回车符);
字符串的内容从第三个字节开始存储。
当程序调用INT 21H的A号功能时,它会等待用户从键盘输入字符串;
用户输入的字符串将被存储在之前设置的缓冲区中(从第三个字节开始);
同时,缓冲区的第二个字节会被更新为实际输入的字符数(不包括回车符)。
ds:dx=缓冲区首地址
定义数据段:
data segment
buffer db 200,?,200 dup (?)
data ends
输入123回车后的数据段:
其他程序细节看代码注释:
data segment
buffer db 200,?,200 dup (?)
data ends
stack segment stack
top label word
dw 30h dup (?)
stack ends
code segment
assume ds:data,ss:stack,cs:code
main proc far
;初始化数据段
mov ax,data
mov ds,ax
;初始化堆栈段
mov ax,stack
mov ss,ax
lea sp,top
;把缓冲区首地址传给dx
lea dx,buffer
;调用a号功能输入字符串
mov ah,0ah
int 21h
;实际输入字符串字数(不含回车)会放在缓冲区首地址+1(第二个字节)的位置
mov bx,dx
;cx作为循环计数器,先清零
mov cx,0
;再用cx的低8位cl取出[bx+1]的内容,即字符数
mov cl,[bx+1]
;si作为逆序输出的偏移量,需要加首地址的基础上+1 -> 因为存放字符串是从缓冲区第三个字节开始
mov si,cx
add si,bx
inc si
;逆序输出字符串
next:
mov dl,[bx+si]
mov ah,2
int 21h
dec si
loop next
mov ah,4ch
int 21h
main endp
code ends
end main