功能调用:

DOS功能调用:

[01H]输入一个字符,同时显示到屏幕上

AL=按键的ASCII码。

MOV AH,1 
INT 21H
  • 1.
  • 2.

输入8后,AL=08H 

【微机接口】功能调用、分支、循环_字节数

[02H]显示一个字符

DL=待显示的字符的ASCII码

MOV DL,'A'
MOV AH,2
INT 21H
  • 1.
  • 2.
  • 3.

屏幕显示'A'

2号功能破坏AL内容。 

[09H]显示字符串

DX=字符串首地址,字符串必须以'$'(ASCII码为24H)结尾。

9号功能破坏AL内容

【微机接口】功能调用、分支、循环_java_02

[0AH]输入字符串,保存在数据缓冲区,同时在屏幕上显示字符串

DX=输入缓冲区首地址。

回车符(0DH)也要保存在缓冲区中。

缓冲区首单元存放可容纳的字符个数,包括回车符。

实际接受字符个数(不包括回车符)放入BUF+1

所以缓冲区容量大于等于输入串长度+2。

【微机接口】功能调用、分支、循环_java_03

 如果输入的字节数少于定义的字节数,缓冲区其余字节补零。

如果输入的字节数大于定义的字节数,后来输入的字符丢弃。

【微机接口】功能调用、分支、循环_java_04

数据段

BUF DB 15
    DB  ?
    DB  15 DUP(?)
  • 1.
  • 2.
  • 3.

代码段:

MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H
  • 1.
  • 2.
  • 3.

BIOS功能调用:

输入中断号:16 H

[00H]读取一个字符,无回显

AL=输入字符的ASCII码

【微机接口】功能调用、分支、循环_回车符_05

[01H]查询键盘缓冲区?

输出功能调用:中断号10H

[0EH]显示一个字符

AL=待显示字符的ASCII码

显示字符‘F’

MOV AH,0EH
MOV AL,'F'
INT 10H
  • 1.
  • 2.
  • 3.

在屏幕上显示‘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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

例:询问用户姓名并等待用户输入,用户输入姓名后按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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

键盘按下一个字符,如果是‘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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

如果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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

将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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

某科室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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

求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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

假设从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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.