这一篇文章主要是给刚接触汇编的初学者准备的,尤其是在学校里刚刚开始学习汇编,又被作业搞得一头雾水的小伙计。这里主要是介绍如何利用调用DOS功能来实现字符(串)的
输入/输出
这里我们主要的实验平台就是:
Masm for Windows 集成实验环境 2015
字符的输出
在DOS中可以调用
2/6号功能号
都可以实现单字符的打印,这里我们以
2号功能号
做例子
假如我们要输出字符
‘A’
MOV DL,41H
MOV AH,2
INT 21H
因为‘A’字符的
ASCII码
是
41H
(十六进制),我们只需要将值赋到DX寄存器的
低8位
,然后将
2号功能号
赋到AH,然后调用
INT 21H
中断,即可触发
DOS
的2号功能,这样在屏幕上就会打印出
A
字符的输入
在DOS中我们调用
1号功能号
即可实现单字符的输入。
示例:
MOV AH,1
INT 21H
当调用
INT 21H
中断后,屏幕上就会等待你出入一个字符,当输入字符后,输入字符的
ASCII码
会存储在AL中
字符串的输出
字符串的输出可以有多种方式,第一种就是利用字符输出一个一个的输出,第二种就是在字符串最后添加
'$'
符号作为字符串的结束符,然后调用
9号功能号
来输出字符串。这里我们演示一下第二种方式。
DATAS SEGMENT
tip db 'The original sentence as follows:',0dh,0ah,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;打印字符串提示信息
MOV DX,OFFSET TIP
;调用9号中断
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
在数据段我们定义了一个字符串,后面以
0dh,0ah,'$'
结尾表示换行
字符串的输入
学习过c语言的朋友都知道字符串输入后需要一个缓冲区进行存储,所以这里我们也需要提前在数据段中预定义一个空的缓冲区用来接收字符串。
DATAS SEGMENT
BUF DB 6,?,6 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;将缓冲区地址赋到DX中
LEA DX, BUF
;键盘输入到缓存区
MOV AH, 0AH
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
调用
0A号功能号
这部分很简单就不详细说明了,我们来重点关注一下数据段中一下部分
DATAS SEGMENT
BUF DB 6,?,6 DUP(?)
DATAS ENDS
按照DOS官方的要求:
-
0A中断会向保存在DX中的地址存放来自键盘的输入
-
[DX]
是缓冲区最大容量
-
返回值
[DX+1]
是你实际输入的字符个数,
[DX+2]
是字符串首
上面这段话的意思是你定义的缓冲区的格式必须得和
BUF DB 6,?,6 DUP(?)
一致,其中两个6均表示缓冲区大小。
在键盘输入完毕后,
DOS会自动添加’$’到字符串后面
。真正的字符串是在缓冲区的第3个字符开始的,这意味着你要打印时,需要
偏移两位
,如下:
;将缓冲区地址赋到DX中
LEA DX, BUF
;键盘输入到缓存区
MOV AH, 0AH
INT 21H
;打印字符串
ADD DX,2 ;偏移2位
;调用9号中断
MOV AH,09H
INT 21H
温馨提示
:汇编是不区分大小写的,所以在写代码时不必一直开着大写锁定。不过如果是提交作业呢,最好还是找个编辑器转为全大写,比较美观。