【7】汇编 DOS部分

来源:互联网 发布:matlab 图像融合算法 编辑:程序博客网 时间:2024/05/21 06:33

一、返回DOS操作系统

  1. 返回DOS的三种方法
      程序框架设定的方法返回。将主程序定义为一个远过程,再执行三条指令,将DS和00H入堆栈,然后执行RET指令,转去执行INT20H,退出应用指令,释放所占内存,正确返回DOS。
  2. 执行4CH号DOS功能调用。
MOV AX,4C00HINT 21H

  利用这两条语句,在退出应用程序前,自动关闭已打开的文件,防止数据丢失。
3. 对于可执行的命令文件(.COM文件),用INT 20H可以直接返回DOS

二、DOS系统功能调用

  DOS(Disk Operating System)是微软开发的磁盘操作系统,DOS从磁盘装入内存并运行。Windows问世后,DOS核心依然存在,只是加上了Windows作为系统的图形界面,使用户能更加方便地使用计算机。
其中,DOS的主要模块及其功能见P129(周荷琴 微机原理及接口技术)
  8086CPU可以处理256类中断,利用INT n指令,原则上可调用这所有的中断。n 为中断类型号
  n=00~FFH
00~04H—— 专用中断,处理 除法错、单步、不可屏蔽中断NMI、断电中断、溢出中断。
10H~1AH、2FH、31H、33H——BIOS(Basic Input and Output System)中断,基本输入输出系统。保存在系统ROM BIOS中的BIOS功能调用。
20H~2EH——DOS中断,对各种设备提供输入输出服务。INT 20H 程序结束中断,可返回DOS操作系统。n = 21H 是最强大的DOS中断,包含了很多子功能,每个有一个功能号,调用前要送到AH寄存器中。

INT 21H下的功能号部分举例:
1. 01H——从键盘输入一个字符,并在屏幕上显示,检查Ctrl-Break(若用户键入此键,则执行INT 23H,执行退出命令。) AL = 输入字符
2. 0AH——输入字符串到内存缓冲区;DS:DX = 缓冲区首地址

DATA SEGMENTBUFF DB 50      ;定义缓存区,50个字节大小(32H)     DB ?       ;存入实际键入字节数     DB 50 DUP(?)  ;定义50个字节空间,存放键入字符的ASCII码DATA ENDSCODE SEGMENT    MOV AX,DATA    MOV DS,AX       ;缓冲区首地址和偏移地址    MOV DX,OFFSET BUFF    MOV AH,0AH    INT 21HCODE ENDS

3 . 显示功能调用
  02H——显示单个字符,DL = 显示字符的ASCII码
  09H——显示以$结尾的字符串,DS:DX = 字符串的首地址

DATA SEGMENTMESS DB 'Try again.', 0DH,0AH,'$'   ;0DH是回车,OAH是换行DATA ENDSCODE SEGMENT    MOV AX,SEG MESS    MOV DS,AX    MOV DX, OFFSET MESS    MOV AH,9    INT 21HCODE ENDS    END 

一些程序实例:
1. 键盘输入0~9,查表输出键入数字的平方值,存入AL寄存器中。

DATA SEGMENTTABLE DB 0149162536496481BUF DB 'Please input a number(0~9):',0DH,0AH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX,DATA    MOV DS,AX    MOV DX,OFFSET BUF    MOV AH,9H    ;DOS 9号功能调用,显示提示信息    INT 21H    MOV AH,01    INT 21H    AND AL,0FH      ;截下数字值,表内元素序号    MOV BX,OFFSET TABLE    MOV AH,0    ADD BX,AX      ;表头地址+键入数字,结果存入BX    MOV AL,[BX]    ;查表求得平方值    MOV AX,4C00H    INT 21HCODE ENDS    END START
  1. 在存储单元A1和A2中,各存有一个2字节无符号数,低字节在前,高字节灾后,编程将两数相加,结果存入SUM单元,也要求低字节在前,高字节灾后,进位存入最后一个字节单元。
DATA SEGMENTA1 DB 56H,78HA2 DB 4FH,9AHSUM DB 3 DUP(0)DATA ENDSCODE SEGMENT    ASSUME CS:CODE,DS:DATABEGIN:MOV AX,DATA    MOV DS,AX   ;设置数据地址段基址    MOV BX,0    ;BX为地址指针,清0    CLC       ;进位清0    MOV AL,A1 [BX];取A1低字节    ADC AL,A2 [BX]    MOV SUM[BX],AL;低字节存入SUM中    INC BX        ;调整指针    MOV AL,A1[BX]    ADC AL,A2[BX]    MOV SUM[BX],AL    JNC STOP    ;无进位,转STOP    INC BX    MOV AL,0    INC AL    MOV SUM[BX],AL ;把进位存入SUM+2单元中STOP:MOV AX,4C00H    INT 21HCODE ENDS    END BEGIN
  1. 在存首地址储器中以BUF开始存有一串字符,字符串个数用COUNT表示。要求统计数字0~9、字母A~Z和其他字符的个数,并分别将它们的个数存储到NUM开始的3个内存单元中去。
DATA SEGMENTBUF DB 'PRINT''abc',35H,52H,30H,08HCOUNT EQU $-BUFNUM DB 3 DUP(?)DATA ENDSCODE SGEMENT    ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA    MOV DS,AX    MOV CH,COUNT    MOV BX,0    MOV DX,0LOOP1:MOV AH,BUF[BX]    CMP AH,30H    JL NEXT    CMP AH,39H    JG ABC    INC DH    JMP NEXTABC:CMP AH,41H    JL NEXT    CMP AH,5AH    JG NEXT    INC DLNEXT:INC BX    DEC CH    JNZ LOOP1    MOV NUM,DH    MOV NUM+1,DL    MOV AH,COUNT    SUB AH,DH    SUB AH,DL    MOV NUM+2,AH    MOV AX,4C00H    INT 21HCODE ENDS    END START

4 . 循环结构程序示例:
  在一串给定个数的数据中寻找最大值,存放到MAX存储单元中。

DATA SEGMENTBUF DW 1234H,3200H,4832H,5600HCOUNT EQU ($-BUF)/2MAD DW ?DATA ENDSSTACK SEGMENT 'STACK'STAPN DB 100 DUP(?)TOP EQU LENGTH STAPNSTACK ENDSCODE SEGMENTMAIN PROC FAR    ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,STACK    MOV SS,AX    MOV SP,TOP    PUSH DS    SUB AX,AX    PUSH AX    MOV AX,DATA    MOV DS,AX    MOV CX,COUNT    LEA BX,BUF    MOV AX,[BX]    DEC CXAGAIN:INC BX    INC BX    CMP AX,[BX]    JGE NEXT    MOV AX,[BX]NEXT:LOOP AGAIN    MOV MAX,AX    RETMAIN ENDPCODE ENDS    END MAIN

5 . 循环程序2:
  求A和B两个4节BCD数之和,它们在内存中以压缩BCD码的形式存放,低字节在前,高字节在后。要求结果以同样形式存放在以SUM开始的单元中。

BCD码:用四个二进制位表示一个十进制数字;最常用的是8421 BCD码;

   压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字。如:56的压缩型8421 BCD码是0101 0110;

  非压缩型BCD码:一个字节可存放一个一位十进制数,其中高字节为0,低字节的低四位存放个位。如:5的非压缩型BCD码是0000 0101,必须存放在一个字节中,56的非压缩型BCD码是00000101 00000110,必须存放在一个字中。

DATA SEGMENTA DB 44H,33H,22H,11HB DB 88H,77H,66H,55HSUM DB 5DUP(0)DATA ENDSSTACK SEGMENT 'STACK'STAPN DB 100DUP(?)TOP EQU 100STACK ENDSCODE SEGMENTMAIN PROC FAR    ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,STACK    MOV SS,AX    MOV SP,TOP    PUSH DS    SUB AX,AX    PUSH AX    MOV AX,DATA    MOV DS,AX    MOV ES,AX    MOV SI,OFFSET A    MOV BX,OFFSET B    MOV DI,OFFSET SUM    MOV CX,LENGTH SUM    DEC CX    CLD    CLC    MOV AH,0GET_SUM:LODS A    ADC AL,[BX]    DAA    INC BX    STOS SUM    LOOP GET_SUM    ADC AH,0    MOV AL,AH    STOSB    RETMAIN ENDPCODE ENDS    END MAIN
  1. 例4.40 冒泡法给5个数排序
DATA SEGMENTLIST DW 12,7,19,8,24COUNT EQU ($- LIST)/2DATA ENDSCODE SEGMENT    ASSUME CS:CODE,DS:DATABEGIN:    MOV AX,DATA    MOV DS,AX    MOV CX, COUNT-1LOOP1:    MOV DX,CX    MOV BX,0LOOP2:    MOV AX,LIST[BX]    CMP AX,LIST[BX+2]    JAE NO_CHANGE    XCHG AX,LIST[BX+2]    MOV LIST[BX],AXNO_CHANGE:    ADD BX,2    LOOP LOOP2    MOV CX,DX    LOOP LOOP1    MOV AX,4C00H    INT 21HCODE ENDSEND BEGIN
0 0