功能调用:
DOS功能调用:
[01H]输入一个字符,同时显示到屏幕上
AL=按键的ASCII码。
MOV AH,1
INT 21H
输入8后,AL=08H
[02H]显示一个字符
DL=待显示的字符的ASCII码
MOV DL,'A'
MOV AH,2
INT 21H
屏幕显示'A'
2号功能破坏AL内容。
[09H]显示字符串
DX=字符串首地址,字符串必须以'$'(ASCII码为24H)结尾。
9号功能破坏AL内容
[0AH]输入字符串,保存在数据缓冲区,同时在屏幕上显示字符串
DX=输入缓冲区首地址。
回车符(0DH)也要保存在缓冲区中。
缓冲区首单元存放可容纳的字符个数,包括回车符。
实际接受字符个数(不包括回车符)放入BUF+1
所以缓冲区容量大于等于输入串长度+2。
如果输入的字节数少于定义的字节数,缓冲区其余字节补零。
如果输入的字节数大于定义的字节数,后来输入的字符丢弃。
数据段
BUF DB 15
DB ?
DB 15 DUP(?)
代码段:
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H
BIOS功能调用:
输入中断号:16 H
[00H]读取一个字符,无回显
AL=输入字符的ASCII码
[01H]查询键盘缓冲区?
输出功能调用:中断号10H
[0EH]显示一个字符
AL=待显示字符的ASCII码
显示字符‘F’
MOV AH,0EH
MOV AL,'F'
INT 10H
在屏幕上显示‘I AM A STUDENT’
.486
DATA SEGMENT USE16
MESG DB 'I AM A STUDENT!$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
LAST:MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
例:询问用户姓名并等待用户输入,用户输入姓名后按Enter键,程序再把输入的姓名复制显示到屏幕上
.586
DATA SEGMENT USE16
MESG DB 'What is your name?$'
BUF DB 30
DB ?
DB 30DUP(?)
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DADA
MOV DS,AX
;输出提示信息
AGAIN: MOV AH,9
MOV DX,OFFSET MESG
INT 21H
;输入字符串
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H
;字符串实际个数->BX(必须分两步写)
MOV BL,BUF+1
MOV BH,0
;在输入的字符串末尾加上$符
MOV SI,OFFSET BUF+2
MOV BYTE PTR[BX+SI],'$'
;打印换行符
MOV AH,2
MOV DL,0AH
INT 21H
;打印输入的名字
MOV AH,9
MOV DX,OFFSET BUF+2
INT 21H
;返回DOS
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
键盘按下一个字符,如果是‘Y’,屏幕输出‘YES’。否则输出'NO'
.586
DATA SEGMENT USE16
S1 DB 'YES$'
S2 DB 'NO$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AH,1
INT 21H
MOV DX,OFFSET S1
CMP AL,'Y'
JZ NN
MOV DX,OFFSET S2
NN:
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END EBG
如果AL是y,则显示s1;否则显示s2
MOV DX,OFFSET S1
CMP AL,'y'
JZ NEXT
MOV DX,OFFSET S2
NEXT:
MOV AH,9
INT 21H
分支:
比较变量A1和A2两个有符号数大小,将较大的数存放在AL寄存器中。
.586
DATA SEGMETN USE16
A1 DB -12
A2 DB -90
DATA ENDS
CODE SEGMENT USE16
ASSUME DS:DATA,CS:CODE
BEG: MOV AX,DATA
MOV DS,AX
MOV BH,A1
MOV BL,A2
MOV AL,BH
CMP BH,BL
JGE NEXT
MOV AL,BL
NEXT:MOV AH,4CH
INT 21H
CODE ENDS
END BEG
将BX寄存器的内容以二进制数格式显示在屏幕上
.486
CODE SEGMENT USE16
BEG:MOV BX,5678H
MOV CX,16
LAST:MOV AL,'0'
ROL BX,1
JNC NEXT
MOVE AL,'1'
NEXT:MOV AH,0EH
INT 10H
LOOP LAST
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
某科室9人,统计月收入在2000~4000的人数,并用十进制数显示
.586
DATA SEGMENT USE16
NUM DW 1000,23232,2300,4895,2999,1299,8769,4545,9990
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET NUM
MOV CX,9
MOV DL,0 ;DL存放统计人数
LAST:CMP WORD PTR [BX],2000
JC NEXT
CMP WORD PTR [BX],4000
JA NEXT
INC DL
NEXT:INC BX
INC BX
LOOP LAST
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
求1~100的累加和
.586
DATA SEGMENT USE16
SUM DW ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:MOV AX,DATA
MOV DS,AX
MOV CX,100
MOV AX,0 ;AX用来存放累加和
AGA:ADD AX,CX
LOOP AGA
MOV SUM,AX
MOV AH,4CH
INT 21H
CODE ENDS
END EBG
假设从BUF单元开始为一个ASCSII码字符串,找出其中的最大数送屏幕显示。
.486
BUF DB 'DWERTYUIOP123'
COUNT EQU $-BUF
MAX DB 'MAX=',?,0DH,0AH,'$'
DATA EDNS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV AL,0
LEA BX,BUF
MOV CX,COUNT
LAST:CMP [BX],AL
JC NEXT
MOV AL,[BX]
NEXT:INT BX
LOOP LAST
MOV MAX+4,AL
MOV AH,9
MOV DX,OFFSET MAX
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG