1、4.3 汇编语言的语法汇编语言的语法4.4 汇编语言程序的上机过程汇编语言程序的上机过程4.5 汇编语言程序设计汇编语言程序设计4.6 系统功能调用系统功能调用4.7 程序设计举例程序设计举例4.1 汇编语言与汇编程序汇编语言与汇编程序4.2 伪指令伪指令一、汇编语言概述一、汇编语言概述 用指令的助记符、符号地址、标号、伪指令等符号用指令的助记符、符号地址、标号、伪指令等符号书写的语言。书写的语言。用这种汇编语言书写的程序称为用这种汇编语言书写的程序称为汇编语言源程序汇编语言源程序面向机器的机器指令面向机器的机器指令计算机硬件的功能扩展和应用计算机硬件的功能扩展和应用二、汇编程序二、汇编程序
2、把汇编语言源程序翻译成在机器上能执行的机器语把汇编语言源程序翻译成在机器上能执行的机器语言程序言程序(目标代码程序目标代码程序)的过程叫做汇编,完成汇编过的过程叫做汇编,完成汇编过程的系统程序称为汇编程序。程的系统程序称为汇编程序。在计算机上运行汇编语言程序的步骤:在计算机上运行汇编语言程序的步骤:1)用编辑程序建立)用编辑程序建立ASM源文件;源文件;2)用)用MASM程序把程序把ASM文件翻译成文件翻译成OBJ文件;文件;3)用)用LINK程序把程序把OBJ文件转换成文件转换成EXE文件;文件;4)在)在DOS命令环境下直接键入文件名执行该程序。命令环境下直接键入文件名执行该程序。一、伪指
3、令概述一、伪指令概述 伪指令也称为伪操作,伪指令用于为汇编程序提供伪指令也称为伪操作,伪指令用于为汇编程序提供某些信息,让汇编程序在汇编过程中执行某些特定某些信息,让汇编程序在汇编过程中执行某些特定的功能。也叫指示性语句。的功能。也叫指示性语句。给出目标程序存放的位置、定义存储单元中给出目标程序存放的位置、定义存储单元中存放的初始数据、分配存储区、指示程序结存放的初始数据、分配存储区、指示程序结束等功能。伪操作不产生任何目标代码束等功能。伪操作不产生任何目标代码 。给出一个完整的汇编语言源程序,该程序的功给出一个完整的汇编语言源程序,该程序的功能是完成两个字节数据相加。能是完成两个字节数据相加
4、。DATASEGMENT;段定义开始;段定义开始(DATA段段)BUF1DB34H;第第1 1个加数个加数 BUF2DB2AH;第第2 2个加数个加数 SUMDB?;准备用来存放和数的单元准备用来存放和数的单元DATAENDS;段定义结束段定义结束(DATA段段)CODESEGMENT;段定义开始;段定义开始(CODE段段)ASSUME CS:CODE,DS:DATA ;规定规定DATA、CODE分别为数据段分别为数据段 ;和代码段;和代码段START:MOV AX,DATA MOV DS,AX;给数据段寄存器给数据段寄存器DS赋值赋值 MOV AL,BUF1;取第取第1个加数个加数 ADDA
5、L,BUF2;和第和第2个加数相加个加数相加 MOV SUM,AL;存放结果存放结果 MOV AH,4CH INT21H;返回返回DOS状态状态CODE ENDS ;段定义结束;段定义结束(CODE段段)ENDSTART;整个源程序结束整个源程序结束二、常用伪指令二、常用伪指令 1.段定义伪指令段定义伪指令SEGMENT-ENDSSegname SEGMENT align_type combine_type use_type class Segname ENDS可选择的段参数有定位类型、组合类型和类别名可选择的段参数有定位类型、组合类型和类别名 2.段寄存器设定伪指令段寄存器设定伪指令ASSU
6、ME定义的段与段寄存器的对应关系定义的段与段寄存器的对应关系 3.汇编程序结束伪指令汇编程序结束伪指令END4.数据定义及存储器分配伪指令数据定义及存储器分配伪指令 END STARTCS:CODE,DS:DATABUF1 DB34H;第;第1个加数个加数BUF2 DB2AH;第;第2个加数个加数SUM DB?5.表达式赋值伪指令表达式赋值伪指令EQU/=CONSTANT EQU 256;数赋以符号名;数赋以符号名 ALPHAEQU 7 BETAEQU ALPHA-2;地址表达式赋以符号名;地址表达式赋以符号名6.地址计数器地址计数器$JNE$+6 ;转向地址是当前指令转向地址是当前指令JNE
7、的首址的首址+67.对准伪指令对准伪指令ORG/EVEN/ALIGN1)设置起始地址伪指令)设置起始地址伪指令ORG ORG 100H;使下一地址是使下一地址是100H2)EVEN伪操作使下一变量或指令开始于伪操作使下一变量或指令开始于一个偶数字节地址一个偶数字节地址 EVEN;使下一地址;使下一地址B从偶地址开始从偶地址开始B DW 2 DUP (?);对于字类型地址最好从偶地址开始;对于字类型地址最好从偶地址开始3)ALIGN伪操作为保证双字数组边界从伪操作为保证双字数组边界从4的倍数的倍数开始创造了条件开始创造了条件 ALIGN 4ARRAY DD 100 DUP(?);使双字数组边界从
8、;使双字数组边界从4的倍数开始的倍数开始8.过程定义伪指令过程定义伪指令PROC-ENDPprocedure_name PROC NEAR(FAR)procedure_name ENDP 1)NEAR属性:调用程序和子程序在同一代码段中,属性:调用程序和子程序在同一代码段中,属于段内调用。属于段内调用。2)FAR属性:调用程序和子程序不在同一代码段中,属性:调用程序和子程序不在同一代码段中,为段间调用。为段间调用。一、汇编语言的语句结构一、汇编语言的语句结构 name:operation operand;comment标号标号 操作码操作码 操作数操作数 注释注释 二、数据与表达式二、数据与表
9、达式 1.算术操作符算术操作符+、-、/和和MOD 2.逻辑运算与移位操作符逻辑运算与移位操作符逻辑操作符有逻辑操作符有AND、OR、XOR、NOT移位操作符有移位操作符有SHL和和SHR按位操作按位操作 3.关系运算符关系运算符EQ(相等相等)、NE(不等不等)、LT(小于小于)、LE(小于或等于小于或等于)、GT(有大于有大于)、GE(大于或等于大于或等于)6种种 4.数值回送操作符数值回送操作符TYPE、LENGTH、SIZE、OFFSET、SEG等。等。这些操作符把一些特征或存储器地址的一部分作为数值回送。这些操作符把一些特征或存储器地址的一部分作为数值回送。1)类型回送操作符)类型回
10、送操作符TYPE TYPEexpression 表达式是变量:表达式是变量:回送该变量的以字节表示的类型回送该变量的以字节表示的类型 DB、DW、DD、DQ、DT分别对应分别对应变量的类型属性为变量的类型属性为1、2、4、8、10。表达式是标号:表达式是标号:回送代表该标号类型的数值回送代表该标号类型的数值 NEAR为为-1,FAR为为-2 表达式为常数:表达式为常数:回送回送0 2)偏移)偏移OFFSET回送操作符回送操作符 回送变量或标号的偏移地址回送变量或标号的偏移地址 如:如:MOV BX,OFFSET OPER1 等价于等价于:LEA BX,OPER13)SEG 回送变量或标号的段地
11、址值回送变量或标号的段地址值 4)LENGTH KKK DW 20 DUP(?);汇编程序为变量;汇编程序为变量KKK ;分配;分配20个字存储单元。个字存储单元。MOV CX,LENGTH KKK;等价于;等价于 MOV CX,205)SIZE 回送分配给该变量的总字节数,回送分配给该变量的总字节数,是是LENGTH 和和TYPE值的乘积。值的乘积。1.属性操作符属性操作符(PTR、段操作符、段操作符、SHORT、THIS、HIGH、LOW)1)PTR 更改一些已经规定了类型的存储单元的类型更改一些已经规定了类型的存储单元的类型 type PTR expression2)段操作符)段操作符
12、MOV AX,ES:BX+SI3)SHORT 用来修饰用来修饰JMP指令中转向地址的属性,指出指令中转向地址的属性,指出转向地址是在下一条指令地址的转向地址是在下一条指令地址的127个字节个字节范围内。范围内。4)THIS THIS attribute THIS type像像PTR一样建立一个指定类型一样建立一个指定类型(BYTE、WORD、DWORD)的或指定距离的或指定距离(NEAR、FAR)的地址操作数。的地址操作数。5)字节分离操作符)字节分离操作符HIGH 和和LOWHIGH取其高位字节,取其高位字节,LOW取其低位字节取其低位字节 CONST EQU 0ABCDHMOV AH,HI
13、GH CONST;等价于;等价于MOV AH,0AB6.优先级优先级优先级优先级运算符运算符1 1 LENGTHLENGTH、SIZESIZE、WTDTHWTDTH、MASKMASK、()、()、2 2 PTRPTR、OFFSETOFFSET、SEGSEG、TYPETYPE、THISTHIS、段前缀运算符:、段前缀运算符:3 3 HIGHHIGH、LOWLOW4 4 *、/、MODMOD、SHLSHL、SHRSHR5 5 、-6 6 EQEQ、NENE、LTLT、LELE、GTGT、GEGE7 7 NOTNOT8 8 ANDAND9 9 OROR、XORXOR1010 SHORTSHORT注意
14、:括号内的表达式应优先计算注意:括号内的表达式应优先计算 步骤包括:步骤包括:源程序的录入编辑源程序的录入编辑汇编汇编连接形成可执行程序连接形成可执行程序运行运行调试调试 编辑程序:如编辑程序:如EDIT.EXE汇编程序:如汇编程序:如ASM.EXE或或MASM.EXE连接程序:如连接程序:如LIKE.EXE调试程序:如调试程序:如DEBUG.COM有时还需要有时还需要CREF.EXE、EXE2BIN.EXE等文件等文件 DEBUG 的命令及使用:参见附录的命令及使用:参见附录 程序有顺序、循环、分支和子程序四种结构形式程序有顺序、循环、分支和子程序四种结构形式 执行框条件判别框开始结束开始框
15、结束框1连接点指向线流程图的组成成分流程图的组成成分开始X0?结束Y0?NYYN一、顺序程序设计一、顺序程序设计 顺序程序结构是指完全按顺序逐条执行的指令序列,这顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,在程序段中是大量存在的,但作为完整的程序则很少见,一般作为程序的一部分。顺序结构程序是最简单的程序,一般作为程序的一部分。顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条一条执行。在顺序结构程序中,指令按照先后顺序一条一条执行。例:将两个字节数据相加,并存放到一个结果单元中。例:将两个字节数据相加,并存放到一个结果单元中
16、。DATA SEGMENT AD1 DB4CH;定义第;定义第1个加数个加数 AD2 DB25H;定义第;定义第2个加数个加数 SUM DB?;定义结果单元;定义结果单元DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,AD1;取出第取出第1个加数个加数 ADDAL,AD2;和第和第2个加数相加个加数相加 MOVSUM,AL;存放结果存放结果 MOVBL,AL;显示十六进制结果显示十六进制结果 MOVCL,4 SHRAL,CL ANDAL,0FH ADDAL,30H MOVDL,ALMOVAH,
17、2INT21HMOVAL,BLANDAL,0FHADDAL,30HMOVDL,ALMOVAH,2INT21HMOVAH,4CH;返回;返回DOSINT21HCODE ENDSENDSTART计算(计算(25*178+355-360)/25,要求计算结果的商,要求计算结果的商存入存入BUF单元,余数存入单元,余数存入BUF+2单元中。单元中。DATA SEGMENTDATA SEGMENT;定义数据段;定义数据段X DW 25X DW 25;定义源数据;定义源数据Y DW 178Y DW 178Z DW 355Z DW 355BUF DW 2 DUP BUF DW 2 DUP(?)(?);开辟结
18、果单元;开辟结果单元DATA ENDSDATA ENDS;数据段结束;数据段结束CODE SEGMENT ASSUME DS:DATA,CS:CODE;段约定段约定BEGIN:MOV AX,DATAMOV DS,AX;数据段地址送;数据段地址送DSMOV AX,X IMUL Y;DX,AXX*YMOV CX,AXMOV BX,DX;BX,CXDX,AXMOV AX,ZCWD;对对Z进行符号扩展进行符号扩展ADD AX,CX ADC DX,BX;DX,AXX*Y+ZSUB AX,360SBB DX,0;DX,AXX*Y+Z-360IDIV X MOV BUF,AX;存放商;存放商MOV BUF+
19、2,DX;存余数;存余数MOV AH,4CH;返回;返回DOSINT 21H;程序结束程序结束CODE ENDS;代码段结束;代码段结束END BEGIN;结束汇编;结束汇编计算结果的商计算结果的商B1H存入存入BUF单元单元,余数余数14H存入存入BUF+2单元中单元中 二、分支程序设计二、分支程序设计判定条件YN(a)判定条件(b)(a)IF_THEN_ELSE语句可以引出两个分支语句可以引出两个分支(b)CASE语句则可以引出多个分支语句则可以引出多个分支 程序的分支一般用条件转移指令来产生,利用转移程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指
20、令指令不影响条件码的特性,连续地使用条件转移指令可使程序产生多个不同的分支。可使程序产生多个不同的分支。例:例:TABLE是一字节数组的首地址,长度为是一字节数组的首地址,长度为100。统。统计此数组中正数、计此数组中正数、0及负数的个数,并分别放在及负数的个数,并分别放在COUNT1、COUNT2和和COUNT3变量中。变量中。0?0?正数个数加10个数加1负数个数加1读取一个数据循环修改CX0?结束初始化开始YNYNNY流程图如下:流程图如下:DATA SEGMENT TABLE DB100DUP(?)COUNT1 DB0 COUNT2 DB0 COUNT3 DB0DATA ENDSCOD
21、E SEGMENT ASSUMECS:CODE,DS:DATAALLO PROCFARSTART:PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOV CX,100 MOV BX,0AGAIN:CMP TABLEBX,0 JGE SS12 INC COUNT3 JMP SHORT NEXT SS12:JG SS1 INC COUNT1 JMP SHORTNEXT SS1:INC COUNT2 NEXT:INC BX LOOP AGAIN RET ALLO ENDPCODE ENDSENDSTART例例:编写计算如下分段函数值的程序:编写计算如下分段函数值
22、的程序:1 1;X;X0 0Y=Y=0 0;0=0;0=0 -1-1;X0;X0设输入数据为设输入数据为X、输出数据、输出数据Y,且皆为字节变量。且皆为字节变量。程序流程图如下:程序流程图如下:程序如下:程序如下:DATASEGMENTXDB-10YDB?DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXCMPX,0;与与0进行比较进行比较JGEA1;X0转转A1MOVY,-1;X 0时时,-1YJMPEXITA1:JGA2;X0转转A2MOVY,0;X=0时时,0YJMPEXITA2:MOVY,1;X0,1Y E
23、XIT:MOVAH,4CHINT21H;程序结束点,返回;程序结束点,返回DOSCODEENDSEND START例:设计一个程序段,要求根据键盘输入的例:设计一个程序段,要求根据键盘输入的19数字转向数字转向9个不同的处理程序段。个不同的处理程序段。分析:分析:在数据段定义一个存储区,形成一张地址表,在数据段定义一个存储区,形成一张地址表,用来存放用来存放9 9个程序段的起始地址。将键盘输入的个程序段的起始地址。将键盘输入的1 19 9数字符转换为真值,用于查表得到偏移地址。若输数字符转换为真值,用于查表得到偏移地址。若输入非法字符则提示出错。入非法字符则提示出错。DATASEGMENTIN
24、PUTDBInput a number,13,10,$;提示信息;提示信息INERRDBInput number not 09,13,10,$TABDWP01 ;定义地址表;定义地址表DWP02 DWP03DWP04DWP05DWP06DWP07DWP08DWP09DATAENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA 源程序如下:源程序如下:BEGIN:MOV AX,DATA MOV DS,AX LEA DX,INPUT MOV AH,9 INT 21H;显示提示信息;显示提示信息 MOV AH,1 INT 21H;从键盘接受一个输入字符;从键盘接受一个输入字
25、符 CMP AL,1;若输入字符不是若输入字符不是19中的某一数字中的某一数字,转转LERR JB LERR CMP AL,9 JA LERR AND AX,000FH ;将;将ASCII码转换成数字码转换成数字 DEC AX ADD AX,AX;求出表内偏移量;求出表内偏移量 MOV BX,AX JMP TABBX ;查表,段内间接转移;查表,段内间接转移EXIT:MOV AH,4CH INT 21H LERR:MOV DX,OFFSET INERR;显示出错提示;显示出错提示 MOV AH,9 INT 21H JMP EXITP01:;各处理程序入口各处理程序入口 P02:P09:CODE
26、 ENDS END BEGIN 三、循环程序设计三、循环程序设计一种是一种是DO WHILE结构形式;结构形式;一种是一种是DO UNTIL结构形式。结构形式。循环初始状态循环控制条件循环体(a)循环初始状态循环控制条件循环体(b)NYNY例例:设计一个程序,完成从设计一个程序,完成从1连加到连加到100(即即1+2+.+99+100)的操作,结果保存在数据段的的操作,结果保存在数据段的SUM单元。单元。分析:分析:这样的问题如果采用顺序程序设计至少这样的问题如果采用顺序程序设计至少要一百条指令,并且程序的结构性和可读性差,要一百条指令,并且程序的结构性和可读性差,而采用循环程序设计就会简洁明
27、了。而采用循环程序设计就会简洁明了。DATA SEGMENT SUMDW?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA程序流程图:略程序流程图:略 程序如下:程序如下:START:MOV AX,DATA MOV DS,AX;数据段寄存器赋初值数据段寄存器赋初值 ;循环初始化;循环初始化 SUB AX,AX;工作寄存器清零工作寄存器清零 MOV CX,100;计数器赋初值计数器赋初值 CLC;清除进位标志清除进位标志 LP:INC AX;循环体循环体 ADC SUM,AX DEC CX;循环修改循环修改 JNZ LP;循环控制循环控制 ;*;插入显示程序的
28、地方;插入显示程序的地方(预留位置预留位置)HLTCODE ENDS END START例:编一个程序将字单元例:编一个程序将字单元BUF中所含中所含1的个数存入的个数存入COUNT单元中。单元中。分析:分析:要测出要测出BUFBUF字单元所含字单元所含1 1的个数,就应逐位测试,的个数,就应逐位测试,一个比较简单的办法是可以根据最高有效位是否为一个比较简单的办法是可以根据最高有效位是否为1 1来计数,然后用移位的方法把各位数逐次移到最高位来计数,然后用移位的方法把各位数逐次移到最高位去。去。循环的结束可以用计数值为循环的结束可以用计数值为1616来控制,但更来控制,但更好的办法是结合上述方法
29、可以用测试数是否为好的办法是结合上述方法可以用测试数是否为0 0作为作为结束条件,这样可以在很多情况下缩短程序的执行时结束条件,这样可以在很多情况下缩短程序的执行时间。此外考虑到间。此外考虑到BUFBUF本身为本身为0 0的可能性,应该采用的可能性,应该采用WHILEWHILE结构循环。结构循环。程序框图:程序框图:首先将首先将BUFBUF中的数送给寄中的数送给寄存器存器AXAX,然后将,然后将AXAX寄存寄存器逻辑左移一次,如果器逻辑左移一次,如果CF=1CF=1,则表明,则表明AXAX中的最中的最高位为高位为1 1,则计数器,则计数器CLCL计计数数1 1次,如果次,如果CF=0CF=0,
30、表明,表明AXAX最高位为最高位为0 0,这样依,这样依次将最高位移入次将最高位移入CFCF中去中去测试。移位之后,判断测试。移位之后,判断AXAX的值是否为的值是否为0 0,如果为,如果为0 0则结束循环,不为则结束循环,不为0 0,则继续循环。则继续循环。程序如下:程序如下:DATA SEGMENT;定义数据段;定义数据段BUFDW 0011110010101011B;定义数据;定义数据COUNTDB?;定义存放结果的单元;定义存放结果的单元DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOVAX,DATA MOVDS,AX MOVAX
31、,BUF MOVCL,0;计数器为;计数器为0LOPA:ANDAX,AX JEEXIT;(;(AX)=0,结束循环,结束循环 SHLAX,1;AX 左移一位左移一位 JNCLOPA INCCL;产生进位,(;产生进位,(CL)+1CL JMPLOPAEXIT:MOVCOUNT,CL MOVAH,4CH;返回;返回DOS INT 21HCODE ENDSENDSTART;结束汇编;结束汇编四、子程序四、子程序procedure_name PROC NEAR(FAR)procedure_name ENDP1.定义子程序定义子程序 2.子程序的调用和返回子程序的调用和返回CALLRET 3.现场保护
32、与现场恢复现场保护与现场恢复PUSH POP 4.子程序嵌套子程序嵌套子程序允许嵌套和递归子程序允许嵌套和递归 5.子程序的参数传递子程序的参数传递1)用寄存器传递参数)用寄存器传递参数2)通过变量传递参数)通过变量传递参数3)通过堆栈传递参数或参数地址)通过堆栈传递参数或参数地址五、宏指令五、宏指令宏指令名宏指令名 MACRO 形式参数形式参数1,形式参数,形式参数2,形式参数,形式参数N ;宏指令体;宏指令体(宏体宏体)ENDM多次重复使用的程序段用宏指令多次重复使用的程序段用宏指令宏定义:宏定义:宏调用:宏调用:宏指令名宏指令名 实际参数实际参数1,实际参数,实际参数2,实际参数,实际参
33、数N 宏汇编程序若遇到宏指令定义时并不对它进行汇编,只有宏汇编程序若遇到宏指令定义时并不对它进行汇编,只有在程序中引用的时候,汇编程序才把对应的宏指令体调出进在程序中引用的时候,汇编程序才把对应的宏指令体调出进行汇编处理行汇编处理(语法检查和代码块的插入语法检查和代码块的插入),这个过程称,这个过程称宏展开宏展开(或宏扩展或宏扩展)。宏指令调用后,在宏指令调用处产生用实参替。宏指令调用后,在宏指令调用处产生用实参替换形参的宏体指令语句。换形参的宏体指令语句。例:例:定义一条定义一条INOUT宏指令,既可以引用它输入宏指令,既可以引用它输入一串字符,也可引用它显示一串提示字符。宏定义一串字符,也
34、可引用它显示一串提示字符。宏定义如下:如下:INPUT MACRO;定义一条从键盘输入一个字符的宏指令;定义一条从键盘输入一个字符的宏指令INPUTMOVAH,1;采用宏指令语句采用宏指令语句INPUT编程,类似于高级语言语句编程,类似于高级语言语句INT21HENDM LFMACRO;定义一条换行宏指令;定义一条换行宏指令LFMOVDL,10MOVAH,2INT21HENDMCRMACRO ;定义一条回车宏指令;定义一条回车宏指令CRMOVDL,13MOVAH,2INT21HENDMINOUT MACRO X,Y ;定义一条输入;定义一条输入/输出宏指令输出宏指令INOUTMOVAH,XLE
35、ADX,YINT21HENDM宏调用:宏调用:DATASSEGMENTINPUT1DBPLEASE INPUT ANY CHARACTERS:,$KEYBUF DB10,11 DUP(?),13,10,$DATASENDSCODESSEGMENTASSUME CS:CODES,DS:DATASSTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DATASMOV DS,AXINOUT 9,INPUT;显示一串提示符的宏指令调用显示一串提示符的宏指令调用LF;换行,调用宏定义;换行,调用宏定义CR;回车,调用宏定义;回车,调用宏定义INOUT 10,KEYBUF;输入一串字符的
36、宏指令调用;输入一串字符的宏指令调用LFCRINOUT 9,KEYBUF+2;显示输入的一串字符的宏指令调用;显示输入的一串字符的宏指令调用RETCODES ENDSENDSTART一、系统功能调用概述一、系统功能调用概述 IBM PC机中的机中的BIOS和和DOS操作系统都提供了操作系统都提供了丰富的中断服务程序丰富的中断服务程序,这两组功能子程序主要是实这两组功能子程序主要是实现系统外部设备的输入输出操作、文件管理等。现系统外部设备的输入输出操作、文件管理等。BIOS是驻留在是驻留在PC机主板上机主板上ROM中的中的基本输入输出系统程序基本输入输出系统程序 DOS的核心模块的核心模块IBM
37、BIO.COM是基本是基本I/O设备处理程序,设备处理程序,完成数据输入和输出的基本操作。完成数据输入和输出的基本操作。DOS另一核心模块另一核心模块IBMDOS.COM是磁盘文件管理程序。是磁盘文件管理程序。调用调用DOS或或BIOS功能时,有以下几个基本步骤:功能时,有以下几个基本步骤:1)将调用参数装入指定的寄存器中;)将调用参数装入指定的寄存器中;2)如需功能号,把它装入)如需功能号,把它装入AH;3)如需子功能号,把它装入)如需子功能号,把它装入AL;4)按中断号调用)按中断号调用DOS或或BIOS中断中断;INT n5)检查返回参数是否正确。即如果有出口参数并)检查返回参数是否正确
38、。即如果有出口参数并且需要的话,分析出口参数决定后续的程序执行。且需要的话,分析出口参数决定后续的程序执行。二、二、DOS功能调用(功能调用(INT 21H )1.DOS键盘功能调用键盘功能调用(AH=1,6,7,8,A,B,C)get:movah,1;AH=1,等待键入字符等待键入字符int21h;AL键入的字符键入的字符(码码)cmpal,Y jeyes;若输入的是;若输入的是Y,则转,则转yes标号处标号处cmpal,Njeno;若输入的是;若输入的是N,则转,则转no处处jneget;键入其它字符,转到;键入其它字符,转到get处,处,;继续等待键入字符;继续等待键入字符yes:.no
39、:.2.字符串输入字符串输入LEA DX,BUFSIZE;DS:DX指向缓冲区的第一个字节指向缓冲区的第一个字节MOV AH,0AH ;0a号功能,输入字符串到缓冲区号功能,输入字符串到缓冲区INT 21H3.DOS显示功能调用显示功能调用1)显示单个字符)显示单个字符MOVAH,2;AH=2显示单个字符显示单个字符MOVDL,A;准备入口参数准备入口参数,41HDLINT 21H2)显示字符串)显示字符串(AH=9)STRING DB HELLO,0dh,0ah,$;字符串以字符串以$结束结束MOV DX,OFFSET STRING;调用参数调用参数DS:DX=串地址串地址MOV AH,9;
40、9功能功能DOS系统调用系统调用INT 21H;显示字符串;显示字符串HELLO并换行回车并换行回车4.DOS打印功能打印功能 (AH=5)DATA SEGMENT;定义数据段开始定义数据段开始STR DB Hello world!,0DH,0AH,$;数据区域数据区域.DATA ENDS;数据段结束;数据段结束CODE SEGMENT.LEASI,STRMOV AH,5NEXT:MOV DL,SICMP DL,$JZQUIT;若到数据尾;若到数据尾$处,则转处,则转QUIT处处INT21H;未到数据尾;未到数据尾$处,则继续处,则继续INCSIJMPNEXT;继续打印下一字符;继续打印下一字
41、符QUIT:HLT;结束打印;结束打印.三、常用的三、常用的ROM BIOS功能调用功能调用 INT 10HAH功能功能入口参数入口参数出口参数出口参数0设置显示方式设置显示方式AL=显示方式显示方式2置光标位置置光标位置BH=页号页号DH=行号行号DL=列号列号9在光标位置显示字符及在光标位置显示字符及属性属性BH=页号页号BL=属性值属性值AL=字符字符CX=字符重复次数字符重复次数A在光标位置显示字符在光标位置显示字符BH=页号页号AL=字符字符CX=字符重复次数字符重复次数F取当前显示方式取当前显示方式AH=字符列数字符列数AL=显示方式显示方式BH=当前页号当前页号INT 16H A
42、H功能功能入口参数入口参数出口参数出口参数0读键盘字符读键盘字符AL=ASCII码码AH=扫描码扫描码1读键盘缓冲区字符读键盘缓冲区字符ZF=0时,时,AL=字符字符ZF=1时,缓冲区空时,缓冲区空2读特殊功能键状态读特殊功能键状态AL=特殊功能键状态特殊功能键状态例:在屏幕上显示电子钟。例:在屏幕上显示电子钟。开始开始显示提示符显示提示符接收键入当前时间接收键入当前时间时、分、秒值转换及存储时、分、秒值转换及存储1延时延时1 1秒秒DL+1,DAA调整调整(DL)60H?DL清零、清零、DH加加1,DAA(DH)60H?NNNYYY时分秒值时分秒值BCD变变ASCII显示显示CH清零清零(C
43、H)24DL清零、清零、CH加加1,DAA1DATA SEGMENT BUF1 DB Current time is:$BUF2DB 10 DB 10 DUP(?)DATA ENDS STACK SEGMENT STACK DB 100 DUP(?)STACKENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKCURSORMACROROW,CLM MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H ENDMWIN MACRO ROWL,CLML,ROWR,CLMR,COLOR MOV AH,6 MOV AL,
44、0 MOV CH,ROWLMOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT10H ENDMASCBCDMACROREG ;ASCII变变BCD INCBX INC BX MOV REG,BX MOV CL,4SHLREG,CL INCBX MOV AL,BX ANDAL,0FH ORREG,AL ENDMBCDASCMACROREG INC BX INC BX MOV AL,REG MOV CL,4 SHR AL,CL OR AL,30HMOV BX,AL INC BX MOV AL,REG AND AL,0FH OR AL,30H MO
45、V BX,ALENDMINCBCDMACRO REG,COUNT MOV AL,REG INC AL DAA MOV REG,ALCMP AL,COUNT JNZ DISPY MOV REG,0 ENDMSTRDSPYMACROADRS LEA DX,ADRS MOV AH,9 INT 21H ENDMCLOCK PROC FARSTART:PUSH DS MOV AX,0 PUSH AXMOV AX,DATAMOV DS,AXWIN 0,0,24,79,7;全屏黑白;全屏黑白WIN 9,28,15,52,01010111BCURSOR 11,32STRDSPY BUF1CURSOR 13,3
46、6 LEA DX,BUF2MOV AH,0AH INT 21HLEA BX,BUF2ASCBCD CHASCBCD DHASCBCD DLTIMER:CALL DELY;延时;延时1秒秒 INCBCDDL,60H INCBCDDH,60H INCBCDCH,24HDISPY:LEA BX,BUF2 BCDASCCH BCDASCDH BCDASCDL INC BX MOV AL,$MOV BX,ALPUSH DXCURSOR13,36STRDSPYBUF2+2POPDXJMPTIMERDELY PROC ;延时子程序;延时子程序PUSHCXPUSHAXMOVAX,3FFFHX1:MOVCX,0
47、FFFFHX2:DECCXJNEX2DECAXJNEX1POPAXPOPCXRETDELY ENDPCLOCKENDPCODEENDSENDSTART例:下图是例:下图是“两只老虎两只老虎”的简谱。的简谱。根据乐谱在数据段中定义频率数据表根据乐谱在数据段中定义频率数据表(FREQ)和和节拍时间数据表节拍时间数据表(TIME),程序以,程序以1作为频率数作为频率数据表的结束标志。据表的结束标志。1=C 4/4 1 2 3 1|1 2 3 1|3 4 5-|3 4 5-|5 6 5 4 3 1|5 6 5 4 3 1|2 5 1-|2 5 1-|开始初始化显示歌名设置定时器设置计数值结束否?取节拍
48、时间调用发声程序取下一音符和节拍开始YNDATA SEGMENTFREQ DW262,294,330,262,262,294,330,262DW330,349,392,330,349,392,392,440DW392,349,330,262,392,440,392,349DW330,262,294,196,262,294,196,262,1TIMEDW 25,25,25,25,25,25,25,25,25,25DW50,25,25,50,12,12,12,12,25,25DW12,12,12,12,25,25,25,25,50,25,25,50SNAME DB TWO TIGER.$DATA
49、ENDSSTACK SEGMENTSTACK STACKDB100DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATAPLAY PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AX MOV DX,OFFSET SNAMEMOV AH,9 INT 21HMOV AL,0B6HOUT43H,ALMOV BP,OFFSET TIMEMOV SI,OFFSET FREQSONG:MOV DI,SICMP DI,1JZ EXITMOV BX,DS:BPCALL CSOUNDINC SI IN
50、C SI INC BP INC BP JMPSONG EXIT:RET CSOUNDPROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV DX,12H MOV AX,34DCH DIV DI OUT 42H,ALMOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,03H OUT 61H,AL MOV BX,3FFFHDLY0:MOV CX,32717DLY1:LOOP DLY1 DEC BX JNZ DLY0 MOVAL,AH OUT 61H,AL POP SI POP DX POP CX POP