




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 汇编语言程序设计汇编语言程序设计4.3 汇编语言的语法汇编语言的语法4.4 汇编语言程序的上机过程汇编语言程序的上机过程4.5 汇编语言程序设计汇编语言程序设计4.6 系统功能调用系统功能调用4.7 程序设计举例程序设计举例4.1 汇编语言与汇编程序汇编语言与汇编程序4.2 伪指令伪指令4.1 汇编语言与汇编程序汇编语言与汇编程序一、汇编语言概述一、汇编语言概述 用指令的助记符、符号地址、标号、伪指令等符号用指令的助记符、符号地址、标号、伪指令等符号书写的语言。书写的语言。用这种汇编语言书写的程序称为用这种汇编语言书写的程序称为汇编语言源程序汇编语言源程序二、汇编程序 把汇编语言
2、源程序翻译成在机器上能执行的机器语言把汇编语言源程序翻译成在机器上能执行的机器语言程序程序(目标代码程序目标代码程序)的过程叫做汇编,完成汇编过程的过程叫做汇编,完成汇编过程的系统程序称为汇编程序。的系统程序称为汇编程序。 DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART一、伪指令概述 伪指令也称为
3、伪操作,伪指令用于为汇编程序提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。也叫指示性语句。指示性语句。给出目标程序存放的位置、定义存储单元中存放的初始数据、分配存储区、指示程序结束等功能。伪操作不产生任何目标代码 。 伪指令是汇编语言的保留字,不能够用来命名变量名或标号伪指令是汇编语言的保留字,不能够用来命名变量名或标号 DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOV
4、SUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART汇编指令 汇编程序在对源程序进行汇编时把指令语句一对一地翻译成机器指令,然后在程序运行期间由CPU来执行其操作伪指令与汇编指令的区别:每一条汇编指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作。伪指令是在汇编期间由汇编程序执行的操作命令,它不生成目标代码。二、常用伪指令 1. 段定义伪指令SEGMENT-ENDSSegname SEGMENT align_type combine_type use_type class Segname ENDS可选择的段参数有定位类型、组合类型和类别名 一般情况下,这
5、些说明可以不用,但一般情况下,这些说明可以不用,但如果需用链接程序把本程序与其他程如果需用链接程序把本程序与其他程序模块相连接时,就需要使用这些说序模块相连接时,就需要使用这些说明。明。 DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART2. 段寄存器设定伪指令ASSUME定义段与段寄存器的对应关系
6、CS:CODE,DS:DATA只是说明段寄存器与定义段之间的对应关系,段寄存器的内容需要用程序按要求来加载。 DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART3. 汇编程序结束伪指令END END START DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAEND
7、SCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART这些伪操作可以把其后的数据存入指定的这些伪操作可以把其后的数据存入指定的存储单元,形成初始化数据,或者只分配存储单元,形成初始化数据,或者只分配空间而不存入确定的数值,开成未初始化空间而不存入确定的数值,开成未初始化数据。数据。4. 数据定义及存储器分配伪指令DB用来定义字节用来定义字节DW用来定义字用来定义字DD用来定义双字用来定义双字
8、DATASEGMENT BUF1DB34H BUF2DB21H SUMDB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA MOVDS,AX MOVAL,BUF1 ADDAL,BUF2 MOVSUM,AL MOVAH,4CH INT21H CODEENDS ENDSTART4. 数据定义及存储器分配伪指令操作数可以是字符串,如:操作数可以是字符串,如:MESS1DB ABMESS2DW AB 4241MESS24142MESS1通常定义字符串时,用通常定义字符串时,用DB低地址低地址高地址高地址低地址低地址高地址高地址4
9、. 数据定义及存储器分配伪指令repeat_count DUP(operand,operand)例如:例如:ARRAY1 DB 2 DUP(0,1,2,?),?)ARRAY2 DB 100 DUP(?)(?)用来指定括号中的操作用来指定括号中的操作数的重复次数数的重复次数5. 表达式赋值伪指令EQU / =ABCEQU 256 ;数赋以符号名DEFEQU 2*3 MOVE EQU MOV ;地址表达式赋以符号名以后遇到此标识符则等效于表达式的值或字符串X=10X=X+10给标识符定义一个数值。两者区别:EQU用给标识符定义一个数值时不能重复定义标识符,但“=”允许重复赋值。6. 地址计数器$J
10、NE $+6 ; 转向地址是当前指令JNE的首址+6例:例:$用在伪操作的参数字段用在伪操作的参数字段表示地址计数器的当前值表示地址计数器的当前值ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4如果汇编时如果汇编时ARRAY分配的偏移地址为分配的偏移地址为0070H 7. 对准伪指令ORG/EVEN/ALIGN1)设置起始地址伪指令ORG ORG 100H ;使下一地址是100H2)EVEN伪操作使下一变量或指令开始于一个偶数字节地址 EVEN ;使下一地址;使下一地址B从偶地址开始从偶地址开始B DW 2 DUP (?) ;对于字类型地址最好从偶地址开始;对于字类型地址最好
11、从偶地址开始3)ALIGN伪操作为保证双字数组边界从4的倍数开始创造了条件 ALIGN 4ARRAY DD 100 DUP (?);使双字数组边界从;使双字数组边界从4的倍数开始的倍数开始8. 过程定义伪指令PROC-ENDPprocedure_name PROC NEAR ( FAR )procedure_name ENDP 1)NEAR属性:调用程序和子程序在同一代码段中,属于段内调用。2)FAR属性:调用程序和子程序不在同一代码段中,为段间调用。一、汇编语言的语句结构 name:operation operand ;comment标号 操作码 操作数 注释 二、数据与表达式 1. 算术操
12、作符+、-、/和MOD 可用于数字 表达式或地址表达式中例如:数组ARRAY定义如下,试写出把数组长度(字数)存入CX寄存器的指令ARRAY DW 1,2,3,4,5,6,7END DW ?MOV CX,(END-ARRAY)/2MOV CX,7 2. 逻辑运算与移位操作符逻辑操作符有AND、 OR、 XOR、 NOT移位操作符有SHL和SHR按位操作按位操作 只能用于数值 表达式中 例如:MOV AX,1 SHL 3将表达式1 SHL 3的结果8送入AX将表达式256 SHR 2的结果64送入CX例如:ADD CX,256 SHR 23. 关系运算符关系运算符EQ(相等相等)、NE(不等不等
13、)、LT(小于小于)、LE(小于或等于小于或等于)、GT(有大于有大于)、GE(大于或等于大于或等于)6种种 结果为逻辑值,为真时表示为结果为逻辑值,为真时表示为0FFFFH,为假时为为假时为0000H例如:MOV AX,1234 GT 1024将0FFFFH送入AX将0送入BX例如:MOV BX,1234 LT 10244. 数值回送操作符数值回送操作符TYPE、LENGTH、SIZE、OFFSET、SEG等。等。这些操作符把一些特征或存储器地址的一部分作为数值回送。这些操作符把一些特征或存储器地址的一部分作为数值回送。1)类型回送操作符)类型回送操作符TYPE TYPE 表达式表达式 表达
14、式是变量: 回送该变量的以字节表示的类型 DB、DW、DD、分别对应、分别对应变量的类型属性为变量的类型属性为1、2、4。 表达式为常数: 回送0 例如:例如:ARRAY DW 1,2,3ADD SI,TYPE ARRAY汇编后的结果是:汇编后的结果是:ADD SI,22)偏移OFFSET回送操作符 回送变量或标号的偏移地址 如:MOV BX , OFFSET OPER1 等价于:LEA BX ,OPER13)SEG 回送变量或标号的段地址值 例如:例如:DATA是从存储器的是从存储器的05000H开始的一个数据段的段名,开始的一个数据段的段名,OPER是该是该段中的一个变量名,则:段中的一个
15、变量名,则:MOV BX,SEG OPER指令执行后,将把指令执行后,将把05000H作为立即数送到作为立即数送到BX寄存器中。寄存器中。4)LENGTH 例如:例如:KKK DW 20 DUP (?) ;汇编程序为变量;汇编程序为变量KKK;分配;分配20个字存储单元。个字存储单元。MOV CX ,LENGTH KKK;等价于;等价于 MOV CX ,20变量中使用DUP,汇编程序将回送分配给该变量的单元数, 又例如:又例如:ARRAY DW 1,2,3MOV CX,LENGTH ARRAY汇编后为:汇编后为:MOV CX,15)SIZE 回送分配给该变量的总字节数,是LENGTH 和TYP
16、E值的乘积 例如:例如:KKK DW 20 DUP (?) ;汇编程序为变量;汇编程序为变量KKK;分配;分配20个字存储单元。个字存储单元。MOV CX ,SIZE KKK;等价于;等价于 MOV CX ,40作业作业5第四章习题第四章习题 4.2、4.3、4.51.属性操作符(PTR、段操作符、SHORT、THIS、HIGH、LOW)1)PTR 更改一些已经规定了类型的存储单元的类型 type PTR expressionMOV BX,5 该指令把立即数存入BX寄存器内容指定的存储单元中,但汇编程序不能分辨是存入字单元还是字节单元,此里必须用PTR操作符来说明。XYZ DW 10 DUP(
17、?)PP EQU BYTE PTR XYZQQ EQU BYTE PTR XYZ+1把XYZ开始的2个存储单元规定为字节类型KK EQU DWORD PTR XYZ+2把接下来的4个存储单元规定为双字类型MOV BX , XYZMOV BL , PPMOV AL , QQ2)段操作符 MOV AX ,ES:BX+SI3)SHORT 用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的127个字节范围内。4)THIS THIS attribute THIS type像像PTR一样建立一个指定类型一样建立一个指定类型(BYTE、WORD、DWORD)的或指定距离的或指定距离(NEA
18、R、FAR)的地址操作数。的地址操作数。 FIRST_TYPE EQU THIS BYTEWORD_TABLE DW 100 DUP(?)FIRST_TYPE 与与 WORD_TABLE 的偏移地址及段地址的偏移地址及段地址完全相同,但完全相同,但FIRST_TYPE 是字节类型,而是字节类型,而WORD_TABLE是字类型。是字类型。5)字节分离操作符HIGH 和LOWHIGH取其高位字节,LOW取其低位字节 CONST EQU 0ABCDHMOV AH , HIGH CONST ;等价于等价于MOV AH ,0AB6. 优先级优先优先级级运算符运算符1 1 LENGTHLENGTH、SIZ
19、ESIZE、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括号内的表达式应优先计算 步骤包括: 源程序的录入编辑源程序的录入编辑汇编汇编连接形成可执行程序连接形成可执行程序运行运
20、行调试调试 编辑程序:如EDIT.EXE汇编程序:如ASM.EXE或MASM.EXE连接程序:如LIKE.EXE调试程序:如DEBUG.COM有时还需要CREF.EXE、EXE2BIN.EXE等文件 程序有顺序、循环、分支和子程序四种结构形式 执行框条件判别框开始结束开始框结束框1连接点指向线流程图的组成成分流程图的组成成分开始X0?结束Y0?NYYN一、顺序程序设计 顺序程序结构是指完全按顺序逐条执行的指令序列,这顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,在程序段中是大量存在的,但作为完整的程序则很少见,一般作为程序的一部分。顺序结构程
21、序是最简单的程序,一般作为程序的一部分。顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条一条执行。在顺序结构程序中,指令按照先后顺序一条一条执行。例:将两个字节数据相加,并存放到一个结果单元中例:将两个字节数据相加,并存放到一个结果单元中,并显示在屏幕上。并显示在屏幕上。DATASEGMENT AD1 DB4CH;定义第;定义第1个加数个加数 AD2 DB25H;定义第;定义第2个加数个加数 SUM DB?;定义结果单元;定义结果单元DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MO
22、VAL,AD1;取出第;取出第1个加数个加数 ADDAL,AD2;和第;和第2个加数相加个加数相加 MOVSUM,AL;存放结果;存放结果 MOVBL,AL;显示十六进制结果;显示十六进制结果 MOVCL,4 SHRAL,CL ANDAL,0FH ADDAL,30H END STARTMOV DL,ALMOV AH,2INT21HMOV AL,BLANDAL,0FHADDAL,30HMOV DL,ALMOV AH,2INT21HMOV AH,4CH;返回;返回DOSINT21HCODE ENDSENDSTART计算(25*178+355-360)/25,要求计算结果的商存入BUF单元,余数存入
23、BUF+2单元中。 DATA SEGMENT;定义数据段;定义数据段X DW 25;定义源数据;定义源数据Y DW 178Z DW 355BUF DW 2 DUP (?)(?);开辟结果单元;开辟结果单元DATA 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
24、AX ,CX ADC DX ,BX;DX,AXX*Y+ZSUB AX ,360SBB DX ,0;DX,AXX*Y+Z-360IDIV X MOV BUF , AX;存放商;存放商MOV BUF+2 ,DX;存余数;存余数MOV AH ,4CH;返回;返回DOSINT 21H;程序结束;程序结束CODE ENDS;代码段结束;代码段结束END BEGIN;结束汇编;结束汇编计算结果的商计算结果的商B1H存入存入BUF单元,单元,余数余数14H存入存入BUF+2单元中单元中 二、分支程序设计判定条件YN(a)判定条件(b)(a)IF_THEN_ELSE语句可以引出两个分支语句可以引出两个分支(b
25、)CASE语句则可以引出多个分支语句则可以引出多个分支 程序的分支一般用条件转移指令来产生程序的分支一般用条件转移指令来产生,利用转移,利用转移指令不影响条件码的特性,连续地使用条件转移指令指令不影响条件码的特性,连续地使用条件转移指令可使程序产生多个不同的分支。可使程序产生多个不同的分支。例: 编写计算如下分段函数值的程序: 1 1;X;X0 0Y= Y= 0 0;0=0;0=0 -1-1;X0;X0设输入数据为设输入数据为X、输出数据、输出数据Y,且皆为字节变量。且皆为字节变量。程序流程图如下:程序流程图如下:程序如下:程序如下:DATASEGMENTXDB-10YDB?DATAENDSC
26、ODESEGMENTASSUME 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 EXIT:MOVAH,4CHINT21H ;程序结束点,返回;程序结束点,返回DOSCODEENDSEND START例:例:设计一个程序段,要求根据键盘输入的设计一个程序段,要求根据键盘输入的19数字转向数字转向9个不同的处理程序段。个不同的处理程序段。分析:分析
27、:在数据段定义一个存储区,形成一张地址表,在数据段定义一个存储区,形成一张地址表,用来存放用来存放9 9个程序段的起始地址。将键盘输入的个程序段的起始地址。将键盘输入的1 19 9数字符转换为真值,用于查表得到偏移地址。若输数字符转换为真值,用于查表得到偏移地址。若输入非法字符则提示出错。入非法字符则提示出错。DATASEGMENTINPUTDBInput a number,13,10,$;提示信息;提示信息INERRDBInput number not 09,13,10,$ TAB DWP01;定义地址表;定义地址表DWP02 DWP03DWP04DWP05DWP06DWP07DWP08DW
28、P09DATAENDSCODE 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;从键盘接受一个输入字符;从键盘接受一个输入字符 CMP AL ,1 ;若输入字符不是若输入字符不是19中的某一数字中的某一数字,转转LERR JB LERR CMP AL ,9 JA LERR AND AX ,000FH ;将;将ASCII码转换成数字码转换成数字 DEC AX ADD AX ,AX
29、;求出表内偏移量;求出表内偏移量 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 ENDS END BEGIN 三、循环程序设计一种是一种是DO WHILE结构形式;结构形式;一种是一种是DO UNTIL结构形式。结构形式。循环初始状态循环控制条件循环体(a)循环初始状态循环控制条件循环体(b)NYNY
30、例例: 设计一个程序,完成从设计一个程序,完成从1连加到连加到100(即即1+2+.+99+100)的操作,结果保存在数据段的的操作,结果保存在数据段的SUM单元。单元。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;循环
31、体;循环体 ADC SUM,AX DEC CX;循环修改;循环修改 JNZ LP;循环控制;循环控制 ;*;插入显示程序的地方;插入显示程序的地方( (预留位置预留位置) ) HLTCODE ENDS END START例:编一个程序将字单元例:编一个程序将字单元BUF中所含中所含1的个数存入的个数存入COUNT单元中。单元中。 分析:分析:要测出要测出BUFBUF字单元所含字单元所含1 1的个数,就应逐位测试,的个数,就应逐位测试,一个比较简单的办法是可以根据最高有效位是否为一个比较简单的办法是可以根据最高有效位是否为1 1来计数,然后用移位的方法把各位数逐次移到最高位来计数,然后用移位的方
32、法把各位数逐次移到最高位去。去。 循环的结束可以用计数值为循环的结束可以用计数值为1616来控制,但更来控制,但更好的办法是结合上述方法可以用测试数是否为好的办法是结合上述方法可以用测试数是否为0 0作为作为结束条件,这样可以在很多情况下缩短程序的执行时结束条件,这样可以在很多情况下缩短程序的执行时间。此外考虑到间。此外考虑到BUFBUF本身为本身为0 0的可能性,应该采用的可能性,应该采用WHILEWHILE结构循环。结构循环。程序框图:程序框图: 首先将首先将BUFBUF中的数送给寄中的数送给寄存器存器AXAX,然后将,然后将AXAX寄存寄存器逻辑左移一次,如果器逻辑左移一次,如果CF=1
33、CF=1,则表明,则表明AXAX中的最中的最高位为高位为1 1,则计数器,则计数器CLCL计计数数1 1次,如果次,如果CF=0CF=0,表明,表明AXAX最高位为最高位为0 0,这样依,这样依次将最高位移入次将最高位移入CFCF中去中去测试。移位之后,判断测试。移位之后,判断AXAX的值是否为的值是否为0 0,如果为,如果为0 0则结束循环,不为则结束循环,不为0 0,则继续循环。则继续循环。 程序如下:程序如下:DATA SEGMENT;定义数据段;定义数据段BUFDW 0011110010101011B ;定义数据;定义数据COUNTDB ?;定义存放结果的单元;定义存放结果的单元DAT
34、A ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOVAX,DATA MOVDS,AX MOV AX,BUF MOV CL,0 ;计数器为;计数器为0LOPA: ANDAX,AX JEEXIT;(;(AX)=0,结束循环,结束循环 SHLAX,1;AX 左移一位左移一位 JNCLOPA INCCL;产生进位,(;产生进位,(CL)+1CL JMPLOPAEXIT: MOVCOUNT,CL MOVAH,4CH;返回;返回DOS INT 21HCODE ENDSENDSTART;结束汇编;结束汇编 MOV AX,BUF MOV CX,16 MOV BL
35、,0 L1: ANDAX,AX JEEXIT AND AX,8000H JZ L2 INCBLL2: SHL AX,1 LOOPL1EXIT: MOV COUNT,BL四、子程序procedure_name PROC NEAR ( FAR )procedure_name ENDP1. 定义子程序 2. 子程序的调用和返回CALLRET 3. 现场保护与现场恢复PUSH POP 4. 子程序嵌套子程序允许嵌套和递归 5. 子程序的参数传递1)用寄存器传递参数2)通过变量传递参数3)通过堆栈传递参数或参数地址1)用寄存器传递参数code segment assume cs:code,ds:data
36、begin: mov ax,data mov ds,ax mov bx,offset array mov cx,N call proc_sum mov result,al mov ah,4ch int 21h proc_sum proc xor al,al sum:add al,bx inc bx loop sum retproc_sum endpcode endsend begindata segment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h N dw $-array result db ?data ends2)通过变量传递参数data s
37、egment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h N dw $-array result db ?data endscode segment assume cs:code,ds:databegin: mov ax,data mov ds,ax call proc_sum mov ah,4ch int 21h proc_sum proc xor al,al mov bx,offset array mov cx,N sum:add al,bx inc bx loop sum mov result,al retproc_sum endpcode
38、endsend begin3)通过堆栈传递参数或参数地址code1 segment main proc far assume cs:code1,ds:data,ss:stackbegin: push ds sub ax,ax push ax mov ax,data mov ds,ax mov ax,offset array push ax mov ax,offset count push ax mov ax,offset result push ax call far ptr proc_sum ret main endpcode1 endsdata segment array db 1,2,3
39、 count dw 3 result db ?data endsstack segment stack dw 100 dup(0)stack endsdata segment array db 29h,18h,26h,19h,12h,04h,3,7,17h,35h count dw 10 result db ?data endsstack segment stack dw 100 dup(0)stack ends1)通过堆栈传递参数或参数地址code2 segment assume cs:code2proc_sum proc far push bp mov bp,sp push ax push
40、 bx push cx push di mov bx,bp+0Ah mov di,bp+8 mov cx,di mov di,bp+6 xor al,alsum:add al,bx inc bx loop sum mov di,al pop di pop cx pop bx pop ax pop bp ret 6 proc_sum endpcode2 endsend begin一、系统功能调用概述 IBM PC机中的BIOS和DOS操作系统都提供了丰富的中断服务程序,这两组功能子程序主要是实现系统外部设备的输入输出操作、文件管理等。 调用DOS或BIOS功能时,有以下几个基本步骤: 1)将调用
41、参数装入指定的寄存器中;2)如需功能号,把它装入AH;3)如需子功能号,把它装入AL;4)按中断号调用DOS或BIOS中断 ;INT n5)检查返回参数是否正确。即如果有出口参数并且需要的话,分析出口参数决定后续的程序执行。二、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处处jnege
42、t;键入其它字符,转到;键入其它字符,转到get处,处,;继续等待键入字符;继续等待键入字符yes: . no: .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
43、 AH,9;9功能功能DOS系统调用系统调用INT 21H;显示字符串;显示字符串HELLO并换行回车并换行回车三、常用的ROM BIOS功能调用 INT 10HAH功能功能入口参数入口参数出口参数出口参数0设置显示方式设置显示方式AL=显示方式显示方式2置光标位置置光标位置BH=页号页号DH=行号行号DL=列号列号9在光标位置显示字符及在光标位置显示字符及属性属性BH=页号页号BL=属性值属性值AL=字符字符CX=字符重复次字符重复次数数A在光标位置显示字符在光标位置显示字符BH=页号页号AL=字符字符CX=字符重复次字符重复次数数F取当前显示方式取当前显示方式AH=字符列数字符列数AL=显
44、示方式显示方式BH=当前页号当前页号INT 16H AH功能功能入口参数入口参数出口参数出口参数0读键盘字符读键盘字符AL=ASCII码码AH=扫描码扫描码1读键盘缓冲区字符读键盘缓冲区字符ZF=0时,时,AL=字符字符ZF=1时,缓冲区空时,缓冲区空2读特殊功能键状态读特殊功能键状态AL=特殊功能键状特殊功能键状态态例:在屏幕上显示电子钟。例:在屏幕上显示电子钟。开始开始显示提示符显示提示符接收键入当前时间接收键入当前时间时、分、秒值转换及存储时、分、秒值转换及存储1延时1秒DL+1,DAA调整调整(DL) 60H?DL清零、清零、DH加加1,DAA(DH)60H?NNNYYY时分秒值时分秒
45、值BCD变变ASCII显示显示CH清零清零(CH )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,C
46、LMR,COLOR MOV AH,6 MOV AL, 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,
47、REG AND AL,0FH OR AL,30H MOV 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
48、11,32STRDSPY BUF1CURSOR 13,36 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 ;延时子程序;延时子程序PU
49、SHCXPUSHAXMOVAX,3FFFHX1:MOVCX,0FFFFHX2: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
50、 | 2 5 1- | 2 5 1 - | 开始初始化显示歌名设置定时器设置计数值结束否?取节拍时间调用发声程序取下一音符和节拍开始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,
51、25,25,25,25,50,25,25,50SNAME DB TWO TIGER.$DATA 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,S
52、ICMP DI,1JZ EXITMOV BX,DS:BPCALL CSOUNDINC SI INC 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
53、 BX JNZ DLY0 MOVAL,AH OUT 61H,AL POP SI POP DX POP CX POP BX POP AX RETCSOUND ENDPPLAY ENDPCODE ENDS ENDPLAY例:用子程序调用实现把键盘上输入的十进制转换为十六进制数并显示出来。假定从键盘输入一个无符号十进制数范围在065535之间。分析:用一个子程序DECTOBIN实现从键盘接收十进制数,并把它转换为二进制数;另一个子程序BINTOHEX将二进制数以十六进制数的形式在屏幕上显示出来。另外为显示清晰,用RETURN子程序达到回车换行效果。这里采用寄存器BX在各子程序之间传送信息。也就是说,
54、在过程DECTOBIN中取得的输入数据转换为二进制数后保存在BX中,过程BINTOHEX需要使用系统功能调用把BX寄存器中的数用十六进制形式显示出来。 十进制到十六进制数转换流程图DECTOBIN子程序RETURN子程序BINTOHEX子程序开始调用RETURN子程序调用BINTOHEX子程序调用RETURN子程序从键盘取得十进制数保存在BX中显示回车和换行以十六进制形式显示BX中的数调用DECTOBIN子程序结束DATA SEGMENTMSG DB 0DH,0AH,PLEASE INPUT:$BUF1 DB 6;定义接字符串缓冲区的最大字符数;定义接字符串缓冲区的最大字符数DB ?;实际键入
55、的字符数;实际键入的字符数DB 6 DUP(0);存放键入的字符串;存放键入的字符串BUF2 DB 6 DUP(0);存放待显示;存放待显示16进制字符串进制字符串DAT DW 10;DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATAMOV DS,AXREPEAT:LEADX,MSGMOVAH,9;DOS功能调用,显示提示字符串功能调用,显示提示字符串INT21HCALLDECTOBIN;调用键盘输入子程序;调用键盘输入子程序CALLRETURN;调用回车换行子程序;调用回车换行子程序CMP BX,-1;若键入值;若键入值65535,BX=-1JZ EX;不显示十六进制数,直接退出;不显示十六进制数,直接退出CALL BINTOHEX;调用转换显示子程序;调用转换显示子程序CALL RETURNMOV AH,4CHINT 21HDECTOBIN PROC;段内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鱼尾鳍的血液流动
- 济宁市2024-2025学年八年级上学期语文期末测试试卷
- 集安市2025-2026学年七年级上学期语文月考测试试卷
- 电路基础知识课件教学
- 2025年度财务人员年度考核表个人总结
- 高速车速安全知识培训课件
- 电解池和原电池课件
- 高速收费业务知识培训课件
- 电芯活化知识培训课件
- 道路园林绿化养护服务方案
- 建筑工程从数字化建造到智慧
- 新教材北师大版高中数学必修第一册全册教学课件
- 五年级上册英语课件-Unit1 Goldilocks and the three bears第四课时|译林版(三起) (共18张PPT)
- 水利工程安全防洪度汛专项方案-版
- 先天性复拇畸形虎口形态特点及治疗策略-PPT幻灯片
- 询价小组签到表
- 办公用房登记表
- QC080000有害物质管理评审报告
- 以“五位一体”模式提升理论学习中心组学习质量和成效的实践与探究
- 运维服务方案 全
- 国防战备公路工程可行性研究报告
评论
0/150
提交评论