附 录
入口:AH=01h
出口:AL=输入字符的ASCII码
(2) 功能02h。向标准输出设备输出一个字符。 入口:AH=02h DL=待输出字符的ASCII码 出口:无
(3) 功能08h。从标准输入设备输入一个字符,无回显。 入口:AH=08h
出口:AL=输入字符的ASCII码
(4) 功能09h。输出一个字符串到标准输出设备上。 入口:AH=09h DS:DX=待输出字符串的地址(字符串须以'$'作为其结束标志) 出口:无
(5) 功能0Ah。从标准输入设备上读入字符串(以回车结束,有回显)。 入口:AH=0Ah DS:DX=输入缓冲区地址(字节0须填入允许输入字符数)。
出口:输入缓冲区字节1存放输入的字符数,字节2起存放输入的字符串 (6) 功能0Bh。检查标准输入设备上是否有字符可读。 入口:AH=0Bh
出口:AL=00h——无字符可读;FFh——有字符可读 (7) 功能4Ch。终止程序的执行,并可返回一个代码。 入口:AH=4Ch AL=返回的代码 出口:无
2) 示例程序Demo16.ASM
编写程序Demo16.ASM,输入一个字符和一个字符串,并显示。
_STACK TOS _STACK _DATA Msg C1 S2 Buffer _DATA _TEXT Start:
SEGMENT STACK 'STACK' USE16 ; 定义堆栈段
DB 2046 DUP(0) ; 堆栈区长度:2KB DW 0 ; 初始堆栈栈顶 ENDS ; 堆栈段定义结束 SEGMENT 'DATA' USE16 ; 定义数据段 DB 13, 10, 'Hello, World!', 13,10,'$' DB 13, 10, 'Character is: *', 13, 10, '$' DB 13, 10, 'Buffer content is: ' DB 9, 0, 10 DUP('*'), 13, 10, '$' ENDS ; 数据段定义结束 SEGMENT 'CODE' USE16 ; 定义代码段 ASSUME CS: _TEXT, DS:_DATA, SS:_STACK MOV AX, _DATA ; 取数据内存区段地址 MOV DS, AX ; 设置数据段寄存器 CLI ; 设置堆栈期间禁止响应中断 MOV AX, _STACK ; 取堆栈内存区段地址 MOV SS, AX ; 设置堆栈段寄存器
·261·
汇编语言程序设计 _TEXT
MOV
STI MOV MOV INT MOV INT MOV MOV MOV INT MOV MOV INT MOV MOV MOV ADD ADD MOV MOV INT MOV INT ENDS END
SP, Offset TOS DX, Offset Msg AH, 9 21h AH, 1 21h
S2-4, AL
DX, Offset C1 AH, 9 21H
DX, Offset Buffer AH, 0Ah 21h
BL, Buffer[1] BH, 0
Buffer[BX+2], '#' Buffer[0], '0' Buffer[1], '0' DX, Offset S2 AH, 9 21H
AX, 4C00h 21h Start
; 设置初始状态时的堆栈指针 ; 堆栈设置完毕允许中断
; 中断21h的9号功能,显示字符串
3) 汇编连接
须汇编成OMF格式的目标代码(.OBJ),使用LINK16.EXE连接程序。如果ML默认使用的是LINK32.EXE,那么可执行SET2ML16,(用LINK16.EXE和LIB16.EXE覆盖原来的LINK.EXE和LIB.EXE)将LINK16.EXE设置成为ML默认调用的连接程序。
ML的 /omf 选项是生成OMF格式的目标码,未指定则默认使用 /omf。 汇编:ML /c Demo16.ASM; 连接:LINK Demo16.OBJ;
或汇编、连接:ML Demo16.ASM。
; 运行结束,返回DOS ; 代码段定义结束 ; 源程序到此为止
·262·