汇编语言及程序设计.ppt

上传人:牧羊曲112 文档编号:5780477 上传时间:2023-08-19 格式:PPT 页数:128 大小:1.69MB
返回 下载 相关 举报
汇编语言及程序设计.ppt_第1页
第1页 / 共128页
汇编语言及程序设计.ppt_第2页
第2页 / 共128页
汇编语言及程序设计.ppt_第3页
第3页 / 共128页
汇编语言及程序设计.ppt_第4页
第4页 / 共128页
汇编语言及程序设计.ppt_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《汇编语言及程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言及程序设计.ppt(128页珍藏版)》请在三一办公上搜索。

1、3.2 汇编语言程序设计,机器语言:计算机能直接理解并执行的二进制的代码,代码难以记忆,编程容易出错。每个CPU 都有特有的指令系统。汇编语言:面向微处理器的指令语言,用指令助记符表示,便于书写记忆。实质是机器语言的符号表示,汇编语言与机器码对应。针对特定CPU、效率低,通用性差,用于实时控制和硬件接口。高级语言:面向过程的语言,不依赖特定的机器,符合人们的思维习惯,通用性强,编译后的目标程序长,执行速度慢。,3.2.1 汇编语言的基本元素,一、汇编语言的分段结构及汇编过程1、源程序结构 由几个逻辑段组成(段及大小)以END伪指令结束 逻辑段由语句序列组成(指令、伪指令、宏指令、注释,空行)除

2、CS段外,其他段寄存器用户设置 含有返回DOS的程序指令,NAME AHEXDATAS SEGMENT;此处输入数据段代码 DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATAS;段地址赋值 MOV DS,AX MOV AX,STACKS;段地址赋值 MOV SS,AX;;此处输入代码据核心代码 MOV AH,4CH;返回操作系统 INT 21HCODES ENDS END START,例:要求把3个16位的数相加,其和仍为16

3、位数。NAME ADDHEXSTACK SEGMENTSTAPN DB 200 DUP(0);此处输入堆栈段代码TOP EQU LENGTH STAPNSTACK ENDSDATA SEGMENTNUM1 DW 1234HNUM2 DW 5678HNUM3 DW 0ABCDHANS DW?;此处输入数据段代码 DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAS;段地址赋值 MOV DS,AX,MOV AX,STACK;段地址赋值 MOV SS,AX MOV SP,TOP MOV AX,NUM1 ADD

4、AX,NUM2 ADD AX,NUM3 MOV ANS,AX MOV AH,4CH;返回操作系统 INT 21HCODE ENDS END START,例:求1开始的连续50个奇数的和,存放在SUM中DATAS SEGMENT SUM DW 0;此处输入数据段代码 DATAS ENDSSTACKS SEGMENT DB 200DUP(0);此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATAS;段地址赋值 MOV DS,AX,MOV CX,50;此处输入代码据核心代码 MOV

5、AX,0 MOV BX,1NEXT:ADD AX,BX INC BX INC BX DEC CX JNE NEXT MOV SUM,AX MOV AH,4CH;返回操作系统 INT 21HCODES ENDS END START,2、汇编过程,程序的编辑、汇编、连接,二、汇编语言语句的类型和格式,1、汇编语句种类指令性语句:为8086的指令系统,与机器指令对应,是可执行的语句。指示性语句:包括伪操作命令和伪操作符,不产生目标代码,是非执行指令,为汇编程序提供所需要的有关信息,仅在汇编过程中起作用。宏指令语句:简化汇编源程序设计,用宏指令定义一段指令序列,汇编时将该指令序列取代宏指令。,2、语句

6、格式,由汇编语言编写的源程序是由许多语句组成的。每个语句由14个部分组成,每部分之间用空格(至少一个)分开,其格式是:,。,3 指令性语句说明,操作数:标号,界限符,常量,变量,表达式,寄存器。常数操作数:数值常数,字符常数,数值符号名,数值表达式。寄存器操作数:各种寄存器。存储器操作数:标号,变量,4、运算符和伪操作符,1)运算符有算术运算符、逻辑运算符、关系运算符,算术运算符包括+、-、*、/、MOD、SHL(左移一位相当于乘2)、SHR(右移1位相当于除2),例:数组ARRAY定义如下 ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV AX,30*5 MOV

7、CX,(TRY-ARRAY),逻辑运算符逻辑运算符包括AND、OR、NOT、XOR 4种逻辑运算符时按位运算的,只能对常数运算,得到的结果也是常数。,例:MOV AL,NOT 0FFH MOV BL,8CH AND 73H MOV AH,8CH OR 73H MOV CH,8CH XOR 73H,关系运算符,关系运算符包括EQ、NE、LT、GT、LE、GE 6种关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。运算结果是一个数值,若结果为真,输出全是1,若结果为假,输出全0。,例:MOV AX,10H GT 16 ADD BL,6 EQ 0110B,SEG取段址算符,2)取值

8、运算和属性操作,.,分析运算符,.OFFSET取偏移地址算符,.TYPE取类型算符,.LENGTH取变量所含存储单元的个数,.SIZE取变量所含存储区的总字节数。,.PTR,合成操作符,功能:PTR把它左边的属性指派给它右边的变量、标号或数值,使之产生一个新的存储器地址操作数。,新存储器操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应量相同。PTR给已分配的存储器一个另外的定义但并不重新分配存储器。,例:,N1 DB 15H,36H N2 DW 1122H,3344HLO:MOV AX,WORD PTR N1;使N1类型转换成字与AX类型匹配 MOV BL,BYTE PTR N2;使

9、N2类型转换成字节与BL类型匹配,也可以用PTR来改变距离属性,如:JMP FAR PTR LO使JMP安排在其他代码段中也可以使用,实现段间转移。,.SHORT操作符,.HIGH/LOW,格式:HIGH/LOW 变量或标号,字节分离运算符,对一个数或地址表达式,HIGH 从中分离出高位字节,LOW分离出低位字节,例:K1 EQU 0ABCDH K2 EQU 1234H MOV AH,HIGH K1 MOV BL,LOW K2,3)其他运算符,优先级,3.2.2 伪指令语句,指令语句:汇编程序把它们翻译成机器代码,命令8086执行对应操作。,伪指令语句:汇编程序并不把它们翻译成机器代码,只是用

10、来指示、引导汇编程序在汇编时做一些操作,它本身不占用存储单元。,*数据定义语句DB、DD等*标号赋值语句EQU,*段定义语句SEGMENTENDS*段分配语句ASSUME*过程定义语句PROCENDP*程序开始结束语句ORG,END,伪指令主要分为下列几类:,一、数据定义语句,DB、DW和DD等可用于定义变量和预置存储器,变量后不能带冒号,任何变量均有下列三属性。,(1)段属性即变量所使用的段;,(2)段内偏移属性;,(3)变量的类型:字节、字、双字等。,DB/DW/DD/DQ/DT变量定义伪指令,功能:定义一数据存贮区。,该数据存贮区的类型由所使用的数据定义伪指令指定(其中DB/DW/DD/

11、DQ/DT定义的分别为字节型/字类型/双字型/四字/十个字节);,存贮区中数据的个数由其后表达式的个数(包括重复因子)决定;,并为各存储单元提供一个初值。,根据表达式的不同可有以下几种常见形式。,a.表达式为预置的一个常数项表达式,表达式存储的格式,例:DA1 DB 10H,52H DA2 DW 1122H,34HDA3 DD 5*20H,0FFEEH,DA1,10,52,22,11,34,00,A0,00,00,EE,FF,00,00,DA2,DA3,00,例:表达式为字符串FIST DB HELLO SECOND DW OKTHREE DB OK,FIST,48,45,4C,4C,4F,4

12、B,4F,4F,4B,SECOND,THREE,HELLO,O,K,O,K,注意:用DB和DW定义时不同的存放方式,b.表达式中出现“?”,表示只分配存储单元,其初值不定。,如:SUMDW?;分配一个字单元F1DB?;分配一个字节单元,c.表达式为预置地址表达式(DW/DD),如:TABLE-0FFDW TABLE;TABLE的偏移量D-PTR-T DD TABLE;TABLE的16位偏移量和段址,d.表达式为预置重复的算式。,如:ZIPS DB 100 DUP(0)DB 2 DUP(0,3 DUP(1),二、表达式赋值语句,1.赋值语句EQU,功能:为常量、变量、表达式或其他符号定义一个名字

13、,但不申请分配内存。,例:COUNT EQU 100;常数值赋给符号名COUNT DATA EQU COUNT+2;表达式值赋给符号名DATA A1 EQU BX+SI;变址寻址存储单元内容赋给符号名A1 B1 EQU OFFSET A1;偏移地址值赋给符号名B1 C1 EQU ADD;加法指令赋给符号名C1,注:PURGE语句可以解除对某一个标号的赋值,使它在后面可以重新定义。PURGE C1;C1不再代替ADD,2.等号语句=,功能:等号语句“=”与EQU语句具有相同的功能,区别仅在于EQU左边的标号不允许重新定义,而用“=”定义的语句允许重复定义。,三、段定义语句,定义方式:段名 SEG

14、MENT 定位类型 组合方式 分类名 语句 段名 ENDS,格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名,功能:定义4个逻辑段,指明段和段寄存器关系。,四、过程定义语句,其中过程名是为该过程指定的一个名称,与变量、标号的定义法相同。,功能:把具有一定功能的程序段设计成为一个过程(子程序),便于实现模块化的程序设计。,MCODE SEGMENTMAIN SPD PROC FAR;过程定义,远过程属性 RETSPD EDNP CALL SPD;同一段内调用 MCODE ENDS,例:过程的定义及调用格式,NCODE SEGMENT CALL SPD;远过程调用 NCODE E

15、NDS END MAIN,1.NAME和END伪指令,功能:定义一个模块,作为一个独立的汇编单位,在输出汇编语言程序的列表文件时,将在每一页的开头打印出该程序名。若源程序中省略NAME,则将源文件名作为目标模块的名字。,五、程序开始和结束语句,注:一个模块是一个独立的汇编单位,汇编处理只进行到模块结束语句END为止。,例:CODE SEGMENT START:SUB1 PROC NEAR SUB1 ENDP CODE ENDS END START,2.ORG,格式:ORG 表达式,功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。,表达式为给定的偏移地址。一般情况下,段定义语句(SEG

16、MENT)指出了段的起点,偏移地址为0,段内各语句或数据的地址由段地址开始依次类推可确定。当用户要求指定某条指令或数据为某个指定地址时,可用ORG来改变。,例:用ORG改变数据段地址,DATA SEGEMENT ORG 100H A1 DB 10H,20H,30H;A1偏移地址为100H ORG 200H A2 DW 3031H,3233H;A1偏移地址为200HDATA ENDS,六、宏指令,一般格式为:宏指令名 MACRO 形式参量表 宏体 ENDM 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,会产生源程序

17、所需的代码。,例如:SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM,代码段:MOV AX,3H SHIFT MOV BX,6H,代码段:MOV AX,3H MOV CL,4 SAL AL,Cl MOV BX,6H,外部伪指令,格式:PUBLIC 符号表,功能:用来说明该模块中被定义的那些常量、变量和标号(含过程名)可以被其他模块所引用。,如:PUBLIC ABC,BCD,CDE,格式:EXTRN 符号:类型,,功能:指出本模块中需要引用但却在其他模块中定义并说明为PUBLIC属性的符号(含常量,变量,标号和过程),符号的类型(BYTE、WORD、DWORD、NEAR、F

18、AR和ABS(符号常量)必须与它们在其他模块中定义时的类型一致。,3.2.3 汇编程序设计,程序设计的基本步骤分析课题确定算法画出流程图存储器资源分配编写程序上机调试程序设计注意问题程序模块化程序正确完整算法可靠合理注重软件执行速率,顺序结构 分支选择结构 循环结构,一、顺序结构与简单程序设计简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。,例1:编写计算Z=(X*X-3*Y)/2的程序,设X,Y为单字节整数,结果Z为一个字。DATA SEGMENTX DB 25Y DB 32Z DW?DATA ENDSCODE SEGMENT ASSUME CS:CO

19、DE,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV AL,XMUL ALMOV BX,0MOV BL,YADD BL,BLADC BH,0ADD BL,YADC BH,0SUB AX,BXSHR AX,1MOV Z,AXMOV AH,4CHINT 21HCODE ENDS END START,例2 利用查表法计算平方值。已知0 15的平方值连续存在以TABL开始的存储区域中,求XD单元内容X的平方值,并放在YD单元中。假定0X 15且为整数。分析:建立平方表,通过查表完成。,NAME MYPROGDATA SEGMENTTABL DB 0,1,4,9,16,25

20、,36,49,64,81;DB 100,121,144,169,225;015的平方XD DB 6YD DB?DATA ENDSSTACKSEGMENTSTA DB 100 DUP(?)TOP EQU LENGTH STASTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,START:MOVAX,DATAMOVDS,AX;为DS送初值MOV AX,STACK MOV SS,AX MOV SP,TOP LEA BX,TABL;以下部分完成求平方值MOVAH,0;亦可用查表指令完成MOVAL,XD;LEA BX,TABLADDBX,AX;MOV

21、 AL,XDMOVAL,BX;XLAT MOVYD,AL;MOV YD,AL MOV AH,4CH;MOV AX,WORD PTR XD INT 21H;MOV AL,BYTE PTR XDCODEENDSEND START,例3 已知 Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数,写出程序。分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下:,MOV AL,ZMOVBL,WADDAL,BLDAAMOVBL,AL;BL=(W+Z)MOVAL,XMOVDL,YADDAL,DL;AL=(X+Y)DAA;十进制调整SUBAL,BL;

22、AL=(X+Y)-(Z+W)DAS;十进制调整MOVZ,AL;结果送Z,二、分支程序设计,分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,主要分为以下两种类型。1、两路分支结构程序中使用一条条件判断语句就可以实现。,例4 比较存储单元中的两个8位无符号数,大者放在AL寄存器中,设偏移地址已在BX中。MOV AL,BXINC BXCMP AL,BXJAE BIGEREXCH:MOV AL,BXBIGER:,例5 在数据区中,对数据块传送,源数据块BLOCK1,目的数据块BLOCK2,两者地址有重叠。要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数

23、据块底部,采用减量方式传送。DATA SEGMENTSTRG DB 1000 DUP(?)BLOCK1 EQU STRG+5BLOCK2 EQU STRG+10BLENG EQU 100DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DSTS,ES:DATASTART:MOV AX,DATA MOV DS,AX MOV ES,AX,MOV CX,BLENGMOV SI,OFFSET BLOCK1MOV DI,OFFSET BLOCK2CLDPUSH SIADD SI,BLENG-1CMP SI,DIPOP SIJB GOSTDADD SI,BLENG-1ADD

24、DI,BLENG-1GO:REP MOVSBMOV AH,4CHINT 21HCODE ENDSEND START,2 三路分支结构例6 试编写程序段,实现符号函数。1 X0Y=0 X=0(X的范围:-128+127)-1 X0 X给定值放在DATX单元,函数值放在DATY单元。符号函数可表示为程序可通过对符号标志的判别来确定执行哪一分支。,NAME EXE_4DATA SEGMENTDATX DB-3DATY DB?DATA ENDSCODE SEMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV AL,DATX CMP AL

25、,0JGE BIGERMOV AL,0FFHMOV DATY,ALJMP NEXTBIGER:JE EQULMOV AL,1MOV DATY,ALJMP NEXTEQUL:MOV DATY,ALNEXT:MOV AH,4CHINT 21HCODE ENDSEND START,3 多路分支程序,利用表实现分支 根据AL中各位被置位情况,控制转移到10个子程序R0R9之一中去。分析:对于这种程序关键要找出每种情况的转移地址,从图中可见表地址=表基地址+偏移量,而偏移量可由AL各位所在位置*2求得表基地址放在BX中 例7:设有10种处理子程序,程序入口地址为R0-R9的内存区域中,根据键盘不同的输入

26、值,试实现不同的分支跳转。设ADRTAB为表格的首址。,NAME EXE-5DATA SEGMENTADRTAB DW R0,R1,R2,R3,R4,R5,R6,R7 DW R8,R9TEN DB?DATA ENDSSTACK SEGMENTSTA DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,LENGTH STA,MOV AH,01INT 21HCOMPUT:MOV AH,0AND AL,0F

27、HADD AL,ALMOV BX,OFFSET ADRTABADD BX,AXMOV AX,BXJMP AXR0:R1:.R9:MOV AH,4CHINT 21HCODE ENDS END START,三、循环程序设计,1 循环程序结构循环程序是经常遇到的程序结构,在对某一段程序多次执行时使用。例8 计算1到100的和,并把它放入SUM单元中。,DATA SEGMENTSUM DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV CX,100,AGAIN:ADD AX,C

28、XDEC CXJNZ AGAINMOV SUM,AXMOV AH,4CHINT 21HCODE ENDS END START,一个循环结构通常由以下几个部分组成。1 循环初始化部分。一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。只有正确地进行了初始化设置循环程序才能正确运行,及时停止。2循环处理部分。是要求重复执行的程序段部分,对应于要求重复执行的操作。3循环控制部分。由该部分修改并判断控制循环的条件是否满足,以决定是否继续循环。有计数器控制和用特征条件判断来控制。4循环结束部分。如循环运行结果存储或输出等,2 循环程序的基本逻辑结构 DOUNTIL结构:在执行循环体之后

29、,再判断循环控制条件是否满足。循环程序的循环体至少必须执行一次。DOWHILE结构:循环控制部分在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体,否则就退出循环。其循环体有可能并不执行。,3 循环程序设计例 9 在内存的字单元X中有一个16位的二进制数,统计X单元中1的个数,并将结果存入RESULT单元中。分析:这是一个循环统计的工作。采用DOWHILE结构,做16次循环,每次将最高位移入CF中进行测试,先判断结果是否为0,若为0,则结束;否则统计计数后循环重复。,DATA SEGMENTX DW 31A0HRESULT DW?DATA ENDSCODE SEGMENT ASSUM

30、E CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV CX,0 MOV AX,X AGAIN:AND AX,AX JZ EXIT SHL AX,1,JNC NEXTINC CXNEXT:JMP AGAINEXIT:MOV RESULT,CXMOV AH,4CHINT 21HCODE ENDS END START,例10 设内存BLOCK开始的单元中依次存放着10个16位符号数,求它们的和并放在SUM单元中,试编写程序。,例11 设内存BUFF开始的单元中依次存放着30个8位无符号数,求它们的和并放在SUM单元中,试编写程序。LEA SI,BUFF;

31、设地址指针MOVCX,30;设计数初值XORAX,AX;设累加器初值AGAIN:ADDAL,SIADCAH,0INCSIDECCXJNZAGAIN;循环累加MOVSUM,AX,4 多重循环在实际应用中,有些问题较复杂,一重循环不够,必须使用多重循环实现,这些循环是一层套一层的,通常称为循环嵌套。例13:在DS所决定的数据段,从偏移地址ARRAY开始顺序存放10个有符号16位数,现要编写程序将这10个字数据从大到小排序。分析:排序的方法有很多,在这里,我们采用冒泡法。,MOV BL,0FFH;标记有交换A1:CMP BL,0FFH JNE A4;无交换则结束XOR BL,BL;BL清零MOV C

32、X,COUNT-1XOR SI,SI;SI清零A2:MOV AX,ARRAYSICMP AX,ARRAYSI+2JGE A3;大等于转XCHG ARRAYSI+2,AXMOV ARRAYSI,AXMOV BL,0FFHA3:INC SIINC SILOOP A2JMP A1A4:,四、子程序设计,子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和

33、存储单元往往需要保护,以免影响返回后主程序的运行。主程序在调用子程序时,一方面初始数据要传给子程序,另一方面子程序运行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。,参数传递一般有三种方法实现。(1)利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。(2)利用存储单元。这种参数传递方法,把所需传递的参数直接放在子程序调用指令代码之后。(3)利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。,例:6个单字节数相加。分析:将6个字节相加的程序段设计为子程序。主程序分2次调用该子程序,但每次调用的参数不同。,DATASEGMENTADD

34、1 DBFEH,86H,7CH,35H,68H,77HADD2 DB45H,BCH,7DH,6AH,87H,90HSUMDB 2 DUP(0)COUNTDB2DATAENDSSTACKSEGMENTSTTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,START:MOVAX,DATA MOVDS,AXMOVAX,STACKMOVSS,AX MOV SP,LENGTH STTMOVSI,OFFSETADD1MOVBX,OFFSET SUMMOVCX,COUNT;循环初值为2CLCAGAIN:CALL SUBADD;调用子

35、程序MOV BX,AL ADD SI,06H INC BX LOOP AGAIN;循环调用2次MOVAH,4CHINT21H,;子程序入口参数:SI;出口参数:ALSUBADDPROC;完成一个字节相加 PUSH CX;保护CX的值 PUSH SIMOV CX,6 MOV AL,0;SUB1:ADD AL,SI;SI是一个源操作数指针INC SILOOP SUB1 POP SIPOPCX;恢复CX的值RETSUBADDENDPCODEENDSEND START,例15 将6个单字节数转化为ASCII码(1),DATASEGMENTADD1 DW0H,06H,7H,5H,8H,7HADDDB 6

36、 DUP(0)COUNTDB6DATAENDSSTACKSEGMENTSTTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,START:MOVAX,DATA MOVDS,AXMOVAX,STACKMOVSS,AX MOV SP,LENGTH STTMOVSI,OFFSET ADD1MOVBX,OFFSET ADD2MOVCX,COUNT;循环初值为6 AGAIN:PUSH SI CALL SUBADD;调用子程序 POP AX MOV BX,AL INC SI INC SI INC BX LOOP AGAIN;循环调用

37、6次,MOVAH,4CHINT21H;子程序入口参数:堆栈;出口参数:堆栈SUBADDPROC;完成一个字节相加 MOV AX,SP+2 ADD AL,30H;DI是另一个源操作数指针 MOV SP+2,AX RETSUBADDENDPCODEENDSEND START,将6个单字节数转化为ASCII码(2),START:MOVAX,DATA MOVDS,AXMOVAX,STACKMOVSS,AX MOV SP,LENGTH STTMOVSI,OFFSET ADD1MOVBX,OFFSET ADD2MOVCX,COUNT;循环初值为6 AGAIN:MOV AX,SI CALL SUBADD;调

38、用子程序 MOV BX,AL INC SI INC SI INC BX LOOP AGAIN;循环调用6次MOVAH,4CHINT21H,;子程序入口参数:AX,出口参数:ALSUBADDPROC;完成一个字节相加 ADDAX,30H;DI是另一个源操作数指针 RETSUBADDENDPCODEENDSEND START,例16 延时子程序的调用DATA SEGMENTDATA ENDSSTACK SEGMENT STACKSTA DW 50 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV

39、AX,STACK MOVSS,AX MOV SP,LENGTH STT MOV BX,20H CALL DLY MOV AH,4CH INT 21H,DLY PROC NEAR;延时子程序 PUSH CXDDD:MOV CX,0FFHCCC:LOOP CCCDEC BXCMP BX,0JNE DDDPOP CXRETDLY ENDPCODE ENDSEND START,MOV AX,SIZE ARY1PUSH AXMOV AX,OFFSET ARY1PUSH AXCALL SUNADMOV AX SIZE ARY2 PUSH AXMOV AX,OFFSET ARY2PUSH AXCALL SU

40、MAD,SUMAD PROC FARPUSH AXPUSH BXPUSH CXPUSH BPMOV BP,SPPUSHFMOV CX,BP+14MOV BX,BP+12MOV AX,0ADN:ADD AL,BXINC BXADC AH,0LOOP ADNMOV BX,AXPOPFPOP BPPOP CXPOP BXPOP AXRET 4,五、DOS系统功能调用和BIOS中断调用,DOS及ROM BIOS提供功能子程序以对基本I/O设备、内存、文件、时钟和作业的管理,用户通过调用软中断INT n实现。(1)把入口参数送规定寄存器(2)将子程序编号送AH(3)发软中断命令,使用DOS系统功能调用的

41、一般过程:见下图所示。,系统功能调用的方法,(1)键入单字符,功能:从键盘输入一个字符并显示,同时将输入字符的ASCII码送入寄存器AL中,碰到CTRL+Break则退出。,1.DOS键盘功能调用,1号功能调用,例:交互式程序中用户按下数字键1,2,3,程序转入相应的服务子程序,若按下其他键就继续等待。KEY:MOV AH,1;读入键值AL INT 21H CMP AL,1;键值为1否?JE ONE CMP AL,2;键值为2否?JE TWO CMP AL,3;键值为3否?JE THREE JMP KEY ONE:TWO:,功能:从键盘输入一个字符但不显示,同时将输入字符的ASCII码送入寄存

42、器AL中,碰到CTRL+Break则退出。,8号功能调用,(2)输入字符串,0AH功能调用:能从键盘接收字符串到内存的输入缓冲区,要求预先定义一个输入缓冲区,缓冲区的第一个字节指出能容纳的最大字符个数,由用户给出;第二个字节存放实际输入的字符个数,由系统最后填入;从第三个字节开始存放从键盘接收的字符,直到ENTER键结束。,0AH功能调用时,要求将DS:DX指向缓冲区的第一个字节。,例:开辟一个缓冲区,从键盘输入一个字符串,将输入的字符数CL寄存器,并将指针指向字符串的第一个字符。,BUFF DB 100;用户定义存放100字节的缓冲区 DB?;系统填入实际输入字符字节数 DB 100 DUP

43、(?);存放输入字符的ASCII码值MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFFMOV AH,0AHINT 21HMOV BX,DXMOV CL,BX+1;输入字符数CLADD DX,2;使指针指向第一个字符,(3)检查键盘状态,0BH功能调用:检验是否有键按下,若有键按下,AL=0FFH,若没有键按下,AL=0,无论检测到是否有键按下,程序继续执行下一条指令。,例:检测键盘工作,若用户未按键,程序循环执行,若用户按下任何键,程序转去调用发声子程序。,LOOP:MOV AH,0BH;检测键盘状态,0BH功能调用 INT 21H INC AL;若AL=0FFH,1

44、后为0 JNZ LOOP;无键按下,循环执行 CALL SOUND;有键按下,调子程序,2.DOS显示功能调用,(1)单字符显示,2号功能调用:将字符送到屏幕显示出来。它要求将要显示字符的ASCII码值送入DL寄存器,MOV DL,:MOV AH,2 INT 21H,(2)字符串输出,9号功能调用:显示字符串,要求DS:DX指向串地址首地址,并且字符串必须以$字符为结束符。,例:在屏幕上显示HOW DO YOU DO?字符串,且光标换行。,CR EQU 0DH;回车 LF EQU 0AH;换行 MES DB HOW DO YOU DO?,CR,LF,$MAIN:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES MOV AH,9 INT 21H,3、返回操作系统,功能:结束当前正在执行的程序,返回操作系统,ROM BIOS的中断调用,键盘输入(类型号为16H的中断调用),功能号为0,1,2 且放在AH寄存器中功能号为0,等待键盘输入的ASCII码放入AL中。MOV AH,0H INT 16H CMP AL,20H功能号为1,对键盘扫描,不等待键盘。功能号为2,检查键盘各特殊键的状态。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号