基于8086的微机原理3b.ppt

上传人:re****.1 文档编号:570005962 上传时间:2024-08-01 格式:PPT 页数:113 大小:305.50KB
返回 下载 相关 举报
基于8086的微机原理3b.ppt_第1页
第1页 / 共113页
基于8086的微机原理3b.ppt_第2页
第2页 / 共113页
基于8086的微机原理3b.ppt_第3页
第3页 / 共113页
基于8086的微机原理3b.ppt_第4页
第4页 / 共113页
基于8086的微机原理3b.ppt_第5页
第5页 / 共113页
点击查看更多>>
资源描述

《基于8086的微机原理3b.ppt》由会员分享,可在线阅读,更多相关《基于8086的微机原理3b.ppt(113页珍藏版)》请在金锄头文库上搜索。

1、基于基于8086的微机原理的微机原理补充课件参考教材补充课件参考教材微型计算机原理与接口技术(第四版)微型计算机原理与接口技术(第四版)(中国科技大学周荷琴吴秀清主编)(中国科技大学周荷琴吴秀清主编)第第2章章 8086 系统结构系统结构第第3章章 8086的寻址方式和指令系统的寻址方式和指令系统第第4章章 汇编语言程序设计汇编语言程序设计 第第4章章 汇编语言程序设计汇编语言程序设计 汇编语言程序设计格式汇编语言程序设计格式1 伪指令语句伪指令语句2 DOS功能调用和功能调用和BIOS中断调用中断调用3 程序设计方法程序设计方法4 宏汇编和条件汇编宏汇编和条件汇编51汇编语言的基本概念汇编语

2、言的基本概念(1)机器语言:由)机器语言:由0、1代码所组成的语言。面向机器,代码所组成的语言。面向机器,同一组代码对不同的计算机表示不同的含义。同一组代码对不同的计算机表示不同的含义。(2)汇编语言:由助记符表示的语言。面向机器。)汇编语言:由助记符表示的语言。面向机器。(3)高级语言:用一些接近人们书写习惯的英语和数)高级语言:用一些接近人们书写习惯的英语和数学表达式形式的句子编写程序。这种语言不面向机器,学表达式形式的句子编写程序。这种语言不面向机器,而是面向过程、面向对象。而是面向过程、面向对象。4.1 汇编语言程序格式汇编语言程序格式2汇编语言程序的结构形式汇编语言程序的结构形式(1

3、)完全段结构程序)完全段结构程序 例:在屏幕上显示字符串例:在屏幕上显示字符串“Good Morning!”标准结构标准结构DATASEGMENT MESDB Good Morning!DB 0DH,0AH,$DATAENDSSTK SEGMENT STACKST1 DW 128 DUP(?)TOS LABEL WORDSTK ENDSCODESEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STKSTART:MOV AX,STKMOV SS,AXMOV SP,OFFSET TOS PUSH DS MOV AX,0 ;PSP(Program Segm

4、ent Prefix) PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES MOV AH,9 INT 21H RETMAIN ENDPCODE ENDS END START非标准结构非标准结构 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STK START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS其余部分与前面相同。其余部分与前面相同。说明:用连接程序对目标程序(说明:用连接程序对目标程

5、序(OBJ文件)进行连接和文件)进行连接和定位时,操作系统为每个程序建立了一个程序段前缀定位时,操作系统为每个程序建立了一个程序段前缀PSP,其长度为,其长度为256字节。主要用于存放所要执行程序字节。主要用于存放所要执行程序的有关信息,同时也提供了程序与操作系统的接口。在的有关信息,同时也提供了程序与操作系统的接口。在PSP的开始处(偏移地址的开始处(偏移地址0000H)安排了一条指令)安排了一条指令INT 20H。执行该指令即可返回到。执行该指令即可返回到DOS。 DOS在建立了程序段前缀在建立了程序段前缀PSP后,就将要执行的程后,就将要执行的程序从磁盘装入内存。在定位时,代码段在序从磁

6、盘装入内存。在定位时,代码段在PSP之后,然之后,然后是数据段、堆栈段。后是数据段、堆栈段。 在程序开始时,在程序开始时,DS指向指向PSP所在段。所在段。ES也不指向也不指向用户的附加段,因此,在程序开始处,用指令将用户的附加段,因此,在程序开始处,用指令将DS、ES、SS等指向用户所设计的段。(其中等指向用户所设计的段。(其中SS段可省略)段可省略)(2)简化段程序结构)简化段程序结构DOSSEG.MODEL SMALL.STACK 100H.DATA MES DB This is a example program. DB 0DH,0AH,$.CODESTART:MOV AX,DATA

7、MOV DS,AX MOV DX,OFFSET MES MOV AH,9 INT 21H MOV AH,4CH INT 21H END START也可以用标准方式返回也可以用标准方式返回DOS。3、汇编语言的数据类型、汇编语言的数据类型(1)指令性语句)指令性语句 是执行语句,以机器指令作基础,与机器指令相对是执行语句,以机器指令作基础,与机器指令相对应。汇编程序可将它翻译成目标代码(机器指令)。应。汇编程序可将它翻译成目标代码(机器指令)。CPU可以执行。可以执行。指令性语句只能出现在代码段中。指令性语句只能出现在代码段中。语句格式:语句格式: 标号:指令助记符标号:指令助记符 操作数,操作

8、数操作数,操作数 ;注释;注释(2)伪指令语句)伪指令语句 是说明性语句。它没有对应的目标代码。汇编程序是说明性语句。它没有对应的目标代码。汇编程序汇编源程序时对伪指令语句进行处理。它完成对数据的汇编源程序时对伪指令语句进行处理。它完成对数据的定义、段块定义、存储区分配等操作,完成汇编控制。定义、段块定义、存储区分配等操作,完成汇编控制。语句格式:语句格式: 名字名字 伪指令助记符伪指令助记符 操作数,操作数操作数,操作数 ;注释;注释补充:汇编语言基本语法补充:汇编语言基本语法1语法基础语法基础(1)字符集)字符集汇编语言程序中允许出现的字符为:汇编语言程序中允许出现的字符为:英文字母:英文

9、字母:AZ,az数字字符:数字字符:09其它字符:其它字符:+ - * / ()() ? (2)保留字)保留字 保留字是由系统规定的,有特定含义的专用名字。保留字是由系统规定的,有特定含义的专用名字。汇编语言中的保留字有:汇编语言中的保留字有:寄存器的名字:寄存器的名字:AX、BX、CX、DX、SP、BP、SI、DI、IP、CS、DS、ES、SS指令助记符:指令助记符:MOV、PUSH、POP、ADD、SUB、MUL、伪指令符:伪指令符:DB、DW、ASSUEM、EQU、LABEL、PROC等等一些特殊的运算符与操作符:一些特殊的运算符与操作符:LT、EQ、OR、HIGH、SEG、OFFSET

10、、PTR等等2语句格式语句格式一般形式:一般形式: 标识符标识符 助记符助记符 操作数操作数1,操作数理,操作数理2 :注释:注释例:例: START:MOV AX,DATA X DB 1,2(1)助记符)助记符助记符是语句的主体,对指令语句它是机器指令的助记助记符是语句的主体,对指令语句它是机器指令的助记符(指令的符号),对于伪指令它是伪指令符。符(指令的符号),对于伪指令它是伪指令符。(2)标识符)标识符 标号:用于指令语句中,代表相应语句的符号地址。标号:用于指令语句中,代表相应语句的符号地址。位于代码段内,它具有三个属性:位于代码段内,它具有三个属性: 段值(段值(SEGMENT):)

11、:标号所在的段的段基址。标号所在的段的段基址。 段内偏移地址(段内偏移地址(OFFSET):标号地址与所在段的段首:标号地址与所在段的段首地址之间的偏移地址的字节数。地址之间的偏移地址的字节数。 类型(类型(TYPE):):指在转移指令中标号可转移的距离。指在转移指令中标号可转移的距离。NEAR:近标,本段内引用,地址指针为:近标,本段内引用,地址指针为2字节;字节;FAR:远标,可在其它段内引用,地址指针为:远标,可在其它段内引用,地址指针为4字节。字节。如果定义一个标号紧跟冒号,则表示此标号为近标。如果定义一个标号紧跟冒号,则表示此标号为近标。变量变量 变量是存储区中数据区的名字,一方面代

12、表所表示变量是存储区中数据区的名字,一方面代表所表示的值,另一方面代表相应的存储空间的地址。用作存储的值,另一方面代表相应的存储空间的地址。用作存储器操作数,直接寻址。它位于器操作数,直接寻址。它位于DS、ES段内。也具有三段内。也具有三种属性:种属性: 段值(段值(SEGMENT):):标号所在的段的段基址。标号所在的段的段基址。段内偏移地址(段内偏移地址(OFFSET):):变量地址与所在段的段变量地址与所在段的段首地址之间的偏移地址的字节数。首地址之间的偏移地址的字节数。类型(类型(TYPE):):指变量中每个元素所包含的字节数。指变量中每个元素所包含的字节数。类型有:字节(类型有:字节

13、(BYTE)、字()、字(WORD)以及双字)以及双字(DWORD)等。)等。常量常量常量在汇编时已有确定的值。它没有属性。常量在汇编时已有确定的值。它没有属性。常量在程序中可以直接出现。常量在程序中可以直接出现。二进制常量以二进制常量以B结尾结尾八进制以八进制以Q结尾结尾十六进制数以十六进制数以H结尾结尾十进制以十进制以D结尾(一般不写)结尾(一般不写)字符串常量用单引号表示。字符串常量用单引号表示。对于经常使用的常量,可以定义为符号常量。对于经常使用的常量,可以定义为符号常量。如如 PI EQU 3 PORT = 218H(3)操作数)操作数 操作数是第三章所讲的寻址方式中所允许的数据类操

14、作数是第三章所讲的寻址方式中所允许的数据类型。包括:常量、变量、标号、寄存器名以及表达式等。型。包括:常量、变量、标号、寄存器名以及表达式等。 (4)注释)注释 以分号表示,用来说明一条指令或一段程序的功能,以分号表示,用来说明一条指令或一段程序的功能,它可以省略。汇编程序对分号后的内容不汇编。加注释它可以省略。汇编程序对分号后的内容不汇编。加注释是为了让程序容易读懂。是为了让程序容易读懂。3、表达式、表达式 表达式由运算对象及运算符所组成,在汇编时由表达式由运算对象及运算符所组成,在汇编时由汇编程序对它进行运算。运算的结果作为一个语句的汇编程序对它进行运算。运算的结果作为一个语句的操作数去使

15、用。运算对象可以是常数、变量或标号,操作数去使用。运算对象可以是常数、变量或标号,运算结果可以是一个常数字,也可以是一个存储器的运算结果可以是一个常数字,也可以是一个存储器的地址,在此地址中存放了数据(称为变量)或指令地址,在此地址中存放了数据(称为变量)或指令(称为标号)。(称为标号)。MASM中使用了中使用了6类运算符类运算符算术算术运算符运算符逻辑逻辑运算符运算符关系关系运算符运算符数值返回数值返回运算符运算符修改属性修改属性运算符运算符其它其它运算符运算符(1)算术运算符)算术运算符主要的算术运算有:主要的算术运算有:+、*、/、MOD、SHL、SHR例:源程序指令格式如下:例:源程序

16、指令格式如下: DA EQU 300 MOV AX,DA-80 MOV BX,DA MOD 100 MOV CX,DA/100 MOV DH,01100100B SHR 2汇编时,计算表达式形成指令为:汇编时,计算表达式形成指令为: DA EQU 300 MOV AX,220 MOV BX,0 MOV CX,3 MOV DH,19H(2)逻辑运算符)逻辑运算符逻辑运算有逻辑运算有AND(与)、(与)、OR(或)、(或)、XOR(异或)、(异或)、NOT(非)(非)4种。逻辑运算符与逻辑运算指令一样,也种。逻辑运算符与逻辑运算指令一样,也是按位运算,它只能对常数进行运算,得到的结果也是是按位运算

17、,它只能对常数进行运算,得到的结果也是常数。常数。逻辑运算符作为操作数,处理是在汇编期间完成的。而逻辑运算符作为操作数,处理是在汇编期间完成的。而逻辑指令作为指令助记符,它是在程序执行期间完成的。逻辑指令作为指令助记符,它是在程序执行期间完成的。例:例:MOV AL,56H AND AL,34H AND 12H(3)关系运算符)关系运算符 关系运算符有:关系运算符有:EQ(等于)、(等于)、NE(不等)、(不等)、LT(小于)、(小于)、GT(大于)、(大于)、LE(小于等于)、(小于等于)、GE(大(大于等于)。于等于)。 关系运算符的两个操作数必须是数据,或是同一段关系运算符的两个操作数必

18、须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,若结果为真,输出全是结果是一个数值,若结果为真,输出全是1,即,即0FFH或或0FFFFH。若结果为假,输出全是。若结果为假,输出全是0。关系运算符一般。关系运算符一般与逻辑运算符组合起来使用。与逻辑运算符组合起来使用。例:例:MOV AX,10H GT 16 ADD BL,6 EQ 0100B相当于:相当于:MOV AX,0 ADD BL,0FFH以上三种运算符也叫做数值表达式。以上三种运算符也叫做数值表达式。(4)数值返回运算符(分析运算符)数值返回运算符

19、(分析运算符)用于分析一个存储器操作数的属性,并返回某个参数值。用于分析一个存储器操作数的属性,并返回某个参数值。 SEG:获取变量或标号的段地址(段基值)。获取变量或标号的段地址(段基值)。如:如:MOV AX,SEG DATA1 MOV DS,AX等价于:等价于: MOV AX,DATA MOV DS,AX其中其中DATA1为为DATA 段内定义的一个变量名。段内定义的一个变量名。 OFFSET:返回变量或标号的偏移地址。返回变量或标号的偏移地址。如:如:MOV BX,OFFSET DA1等价于:等价于:LEA BX,DA1 在在DOS的的9号功能调用中经常用到此运算符。号功能调用中经常用

20、到此运算符。 TYPE:取变量或标号的类型属性值。其值与变量或取变量或标号的类型属性值。其值与变量或标号的类型关系为:标号的类型关系为: 变量或标号变量或标号返回值返回值变量或标号变量或标号返回值返回值BYTE1QWORD8WORD2TWORD10DWORD3NEAR-1(0FFH)FWORD4FAR-2(0FEH) LENGTH:取变量相同类型的个数。取变量相同类型的个数。依据数据定义伪指令后第一个表达式的形式而定。依据数据定义伪指令后第一个表达式的形式而定。为为N DUP(?)时,取(?)时,取N;否则取;否则取1 SIZE:取变量所包含的总字节数。取变量所包含的总字节数。 SIZE=LE

21、NGTH*TYPE例:某数据段定义如下:例:某数据段定义如下:A DW 100 DUP(?),(?),1200HB DB 1,2,3,100 DUP(0)C DB ABCD指令:指令:MOV AL,TYPE A MOV BL,TYPE B MOV CL,TYPE C MOV AH,LENGTH A MOV BH,LENGTH B MOV CH,LENGTH C MOV DX,SIZE A MOV SI,SIZE B MOV DI,SIZE C执行后,执行后,AX= BX= CX= DX= SI= DI= (5)修改属性运算符)修改属性运算符修改属性运算符也叫综合运算符、合成运算符、属性定修改属

22、性运算符也叫综合运算符、合成运算符、属性定义符等。义符等。 段操作符:段操作符:用来临时给一个存储器操作数指定一个段属性(段超越)用来临时给一个存储器操作数指定一个段属性(段超越)例:例:MOV AX,ES:BXPTR:用来临时指定或修改存储器操作数的类型。用来临时指定或修改存储器操作数的类型。PTR本身不分配存储单元,仅给已分配的存储单元赋予本身不分配存储单元,仅给已分配的存储单元赋予新的属性。以保证运算时操作数类型的匹配。常与类型新的属性。以保证运算时操作数类型的匹配。常与类型BYTE、WORD、NEAR、FAR等连用。等连用。例:例:N1 DB 15H,36H N2 DW 1122H,3

23、344H LO:MOV AX,WORD PTR N1 MOV BL,BYTE PTR N2执行结果:执行结果:AX=3645H,BL=22H例:例:MOV BX,10H此指令将立即数此指令将立即数10H送入送入BX间址指定的存储单元,但间址指定的存储单元,但由于由于10H既可以是既可以是10H,也可以是,也可以是0010H,所以汇编时,所以汇编时认为错误。一般用认为错误。一般用BYTE 或或WORD指定:指定:MOV BX,BYTE PTR 10HMOV WORD PTR BX,10H THIS:与与PTR类似,用来指明类型。且常与类似,用来指明类型。且常与EQU连连用。用。例:例:FIRST

24、 EQU THIS BYTE TABLE DW 1234H,5678HFIRST的偏移地址与的偏移地址与TABLE的偏移地址相同,区别在的偏移地址相同,区别在于于FIRST为字节类型,而为字节类型,而TABLE为字类型。为字类型。执行下列指令后,执行下列指令后,AX=1234H,BL=34H MOV AX,TABLE MOV BL,FIRST SHORT:用来说明转移类指令中转向地址的属性,用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令之间的距离在指出转向的目标地址与本指令之间的距离在128+127之间,即限制在短转移范围内。短标号可以用在条件转之间,即限制在短转移范围内。短标

25、号可以用在条件转移指令中,使用短标号的指令比使用近标号的指令少一移指令中,使用短标号的指令比使用近标号的指令少一个字节。个字节。 HIGH和和LOW字节分离符,对一个数或地址表达式,字节分离符,对一个数或地址表达式,HIGH从中分离从中分离出高位字节,出高位字节,LOW从中分离出低位字节。从中分离出低位字节。例:例:K1 EQU 0ABCDH K2 EQU 1234H MOV AH,HIGH K1 MOV BL,LOW K2等价于:等价于:MOV AH,0ABH MOV BL,34H (6)其它运算符)其它运算符其它运算符有(),其它运算符有(), , ,MASK和和WIDTH等等6种。圆括号

26、用来改变运算符的优先级别,()中的运种。圆括号用来改变运算符的优先级别,()中的运算符具有最高优先级。余下的几种运算符由于用得不多,算符具有最高优先级。余下的几种运算符由于用得不多,这里不作介绍。这里不作介绍。(7)运算符的优先级)运算符的优先级如果一个表达式同时具有多个运算符,则按以下规则运如果一个表达式同时具有多个运算符,则按以下规则运算:算:优先级高的先运算,优先级低的后运算。优先级高的先运算,优先级低的后运算。优先级相同时按表达式中从左到右的顺序运算。优先级相同时按表达式中从左到右的顺序运算。括号可以提高运算符的优先级,括号内的运算总是在括号可以提高运算符的优先级,括号内的运算总是在相

27、邻的运算之前进行。相邻的运算之前进行。各种运算符的优先级如下表:(数字越小,优先级越高)各种运算符的优先级如下表:(数字越小,优先级越高) 运算符优先级次序表运算符优先级次序表优先级运算符1() LENGTH,WIDTH,SIZE,MASK2TR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:3HIGH,LOW4*,/,MOD,SHL,SHR5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT4.2 伪指令语句伪指令语句1、数据定义伪指令、数据定义伪指令格式格式1:变量名:变量名 助记符助记符 操作数,操作数,操作数,操作数, ;注

28、释;注释格式格式2:变量名:变量名 助记符号助记符号 n DUP(操作数,操作数(操作数,操作数) ;注释;注释用来定义一个变量的类型并分配存储单元。可赋初值也用来定义一个变量的类型并分配存储单元。可赋初值也可不赋初值(用?代替)。可不赋初值(用?代替)。常用符号:常用符号:DB DW DD DF DQ DT定义字节:定义字节: 1 2 4 6 8 10 分配原则:低字(节)低地址,高字(节)高地址。分配原则:低字(节)低地址,高字(节)高地址。在格式在格式2中,中,n必须是正整数,表示括号中的操作数的重必须是正整数,表示括号中的操作数的重复次数,复次数,DUP后面必须带括号。后面必须带括号。

29、例:用常数、表达式、字符串、?以及例:用常数、表达式、字符串、?以及DUP定义变量定义变量 DA1 DB 10H,52H DA2 DW 1122H,34H DA3 DD 5*20H FIRST DB ab SECOND DW ab ;相当于;相当于DW 6162H,此时只,此时只能有两个字符。能有两个字符。 M1 DB ? M2 DW 0D55H,?,? ONE DB 2 DUP(2) TWO DB 2 DUP(?) THREE DB 2 DUP(1,2 DUP(20)存储区中的存放形式如下存储区中的存放形式如下: DA1 10 M1 XX 52 M2 55 DA2 22 0D 11 XX 3

30、4 XX 00 ONE 02 DA3 A0 02 00 TWO XX 00 XX 00 THREE 01 FIRST 61 14 62 14 SECOND 62 01 61 14 用伪指令用伪指令DW和和DD可以将变量或标号的偏移地址存可以将变量或标号的偏移地址存入存储器,当用入存储器,当用DD来定义时,原变量或标号的偏移来定义时,原变量或标号的偏移地址存入低位字中,原变量或标号的段地址存入高地址存入低位字中,原变量或标号的段地址存入高位字中。位字中。例:例:DATA SEGMENT X DW 120 PAR1 DB AB PAR2 DW AB ONE DW PAR1 TWO DW ADR2

31、THREE DD ADR3 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DAT START:MOV AX,DATA MOV DS,AXADR2:MOV AX,0ADR3:MOV BX,1 HLTCODE ENDS ENDS START 在命令提示符下观察数据定义伪指令的结果在命令提示符下观察数据定义伪指令的结果(文件名文件名:DB.ASM)2符号定义伪指令符号定义伪指令(1)EQU 格式:符号名格式:符号名 EQU 表达式表达式例:例:CR EQU 0DH PORT EQU 218H C1 EQU ADD ;加法指令赋给符号名;加法指令赋给符号名C1 PU

32、RGE C1 ;C1不再代替不再代替ADD。(2)=(等号)(等号)格式:符号名格式:符号名=表达式表达式等号与等号与EQU语句具有相同的功能,区别在于语句具有相同的功能,区别在于EQU不允不允许对同一符号重新定义,而许对同一符号重新定义,而“=”则可以重新定义。则可以重新定义。例:例:N=100 MOV AX,N N=N-20 MOV CX,N若换成若换成EQU则出错。则出错。注意:注意:N并不分配内存单元。并不分配内存单元。(3)LABEL 格式:名称格式:名称 LABEL 类型类型功能:为功能:为LABEL语句下一行语句所使用的变量或标号语句下一行语句所使用的变量或标号取一别名并赋给新的

33、类型。其中变量的类型为取一别名并赋给新的类型。其中变量的类型为BYTE、WORD、DWORD等,标号的类型为等,标号的类型为NEAR、FAR。例:例:X LABEL WORD M DB 12H,34H MOV AL,M ;AL=12H MOV BX,X ;BX=3412HLABEL相当于相当于EQU THIS。3完全段定义伪指令完全段定义伪指令(1)SEGMENTENDS格式:段名格式:段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS说明:说明:(1)定位方式有)定位方式有PARA、BYTE、WORD和和PAGE等等4种,种,其中其中PARA为隐含的定位方

34、式,表示段首址的低为隐含的定位方式,表示段首址的低4位必位必须为须为0。(2)组合方式有)组合方式有NONE、PUBLIC、COMMON、AT 表表达式、达式、STACK和和MEMORY等等6种,表明本段同其它种,表明本段同其它段的组合关系。段的组合关系。(3)类别明典型的有)类别明典型的有DATA、CODE和和STACK等等3种,种,连接时类别名相同的段存放在连续的存储区中。连接时类别名相同的段存放在连续的存储区中。(2)ASSUME8086中允许设置多个逻辑段,但只允许中允许设置多个逻辑段,但只允许4个逻辑段同时个逻辑段同时有效,有效,ASSUME 用来将它们分别定义成代码段、数用来将它们

35、分别定义成代码段、数据段、附加段和堆栈段。据段、附加段和堆栈段。格式:格式:ASSUME CS:段名,:段名,DS:段名,:段名,ES:段名,:段名,SS:段名:段名 也可用也可用ASSUME 段寄存器:段寄存器:NOTHING来取消前面来取消前面所定义的段名。所定义的段名。注意:注意:ASSUME放在可执行程序开始位置的前面,指放在可执行程序开始位置的前面,指明段寄存器与段名之间的关系,但并未给段寄存器明段寄存器与段名之间的关系,但并未给段寄存器赋初值(赋初值(CS除外)。程序中用户需要用除外)。程序中用户需要用MOV指令将指令将段名传送到对应的段寄存器中。段名传送到对应的段寄存器中。例:例

36、:CODE SEGMENT ASSUME CS:CODE,DS:DATA1,SS:STACK,ES:DATA2 START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AX,STACK MOV SS,AX在程序中,在程序中,DS、ES必须赋值,而必须赋值,而SS可忽略。可忽略。4简化段定义伪指令简化段定义伪指令(1)DOSSEG:用于标记各简化段,顺序由系统安排。用于标记各简化段,顺序由系统安排。(2)MODEL格式:格式:MODEL 模式选择符模式选择符 ,高级语言,高级语言功能:指明简化段所使用的内存模式,指示数据与代码功能:指明简化

37、段所使用的内存模式,指示数据与代码允许使用的长度。允许使用的长度。模式选择符:模式选择符:SMALL,MEDIUM,COMPACT,LARGE。SMALL:小模式,所有的数据在一物理段中,所有代:小模式,所有的数据在一物理段中,所有代码存放在另一物理段中。代码段与数据段均为近程,码存放在另一物理段中。代码段与数据段均为近程,不与高级语言连接时一般为不与高级语言连接时一般为SMALL模式。模式。(3)STACK:定义一个堆栈段,并形成定义一个堆栈段,并形成SP、SS的值。的值。(4)DATA:定义一个数据段。:定义一个数据段。(5)CODE:定义代码段。:定义代码段。5过程定义伪指令过程定义伪指

38、令(1)格式:过程名)格式:过程名 PROC NEAR/FAR RET N 过程名过程名 ENDP功能:定义一个过程,其它程序可以用功能:定义一个过程,其它程序可以用CALL指令调用指令调用它。它。过程名:是给所定义的过程取的名字。它是主程序调用过程名:是给所定义的过程取的名字。它是主程序调用的目的操作数,即子程序的入口地址。它像标号一的目的操作数,即子程序的入口地址。它像标号一样具有三种属性:段属性、偏移地址属性、距离属样具有三种属性:段属性、偏移地址属性、距离属性性NEAR/FAR。 RET N:返回指令,其中:返回指令,其中N表示返回时所丢弃的字节表示返回时所丢弃的字节数(偶数)。数(偶

39、数)。(2)过程嵌套)过程嵌套过程中调用过程。过程中调用过程。例:例:MSUB PROC FAR CALL SUB1 RET SUB1 PROC NEAR RET SUB1 ENDP MSUB ENDP注意:过程与注意:过程与C语言中的函数类似,但与函数的格式不语言中的函数类似,但与函数的格式不同。同。6与地址有关伪指令与地址有关伪指令(1)ORG 格式:格式:ORG 表达式表达式功能:给汇编程序设置位置指针,指定下面语句的起始功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。偏移地址。说明:一般情况下,段定义语句(说明:一般情况下,段定义语句(SEGMENT)指出了)指出了段的起点,

40、偏移地址为段的起点,偏移地址为0。段内各个语句或数据的地。段内各个语句或数据的地址由段地址开始依次类推可确定。而用址由段地址开始依次类推可确定。而用ORG指令则指令则可以指定将指令或数据从某个地址开始存放。可以指定将指令或数据从某个地址开始存放。例:用例:用ORG指定代码段地址。指定代码段地址。 CODE SEGMENT ORG 100H ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX CODE ENDS例:用例:用ORG改变数据段地址。改变数据段地址。 DATA SEGMENT ORG 100H A1 DB 10H,20H,30H ;A1

41、偏移地址为偏移地址为100H ORG 200H A2 DW 3031H,3233H ;A2的偏移地址的偏移地址200H DATA ENDS(2)EVEN格式:格式:EVEN功能:使下一语句的地址调整为偶地址。可提高存储器功能:使下一语句的地址调整为偶地址。可提高存储器的存取速度。的存取速度。例:例:DATA SEGMENT X1 DB 0DH EVEN X2 DW 100DUP(?)(?) DATA ENDS(3)$(汇编地址指针)(汇编地址指针)例:例:DATA SEGMENT BUF DB 12345ABCDE COUNT=$BUF ;COUNT=10 DATA ENDS例:例:DATA

42、SEGMENT ORG 100H BUF DB ABCD ORG $+5 NUM DW 50 ;NUM的地址为的地址为0109H DATA ENDS7模块定义与连接伪指令模块定义与连接伪指令 在编写规模比较大的汇编源程序时,可以将整个程在编写规模比较大的汇编源程序时,可以将整个程序划分成几个独立的源程序,称之为模块。然后将序划分成几个独立的源程序,称之为模块。然后将各个独立的模块分别汇编,生成各自的目标程序,各个独立的模块分别汇编,生成各自的目标程序,最后将它们连接生成一个完整的可执行程序。这种最后将它们连接生成一个完整的可执行程序。这种方式称为多模块程序设计。方式称为多模块程序设计。(1)E

43、ND格式:格式:END 标号标号功能:标记汇编源程序结束。功能:标记汇编源程序结束。说明:放在源程序的最后一行,表示汇编程序到此结束。说明:放在源程序的最后一行,表示汇编程序到此结束。如果缺省,则会出问题。另外,在多模块程序设计如果缺省,则会出问题。另外,在多模块程序设计中,只有主模块才需要加标号,而其他模块则不能中,只有主模块才需要加标号,而其他模块则不能加标号。标号是程序中第一条可执行指令的标号,加标号。标号是程序中第一条可执行指令的标号,常用常用BEGIN、START表示,可缺省。如缺省,则用表示,可缺省。如缺省,则用过程名过程名(2)PUBLIC格式:格式:PUBLIC 符号符号1,符

44、号,符号2,功能:指明本模块中的某些符号是公共的,其它模块可功能:指明本模块中的某些符号是公共的,其它模块可以使用。通常指明变量、标号、过程名等。以使用。通常指明变量、标号、过程名等。(3)EXTERN 格式:格式:EXTERN 名字:类型名字:类型, 功能:指明本模块中所用的某些符号是外部的,其它功能:指明本模块中所用的某些符号是外部的,其它模块中已用模块中已用PUBLIC对其说明。对其说明。4.3 DOS系统功能调用和系统功能调用和BIOS中断调用中断调用1常用常用DOS系统功能调用系统功能调用DOS系统功能调用即系统功能调用即DOS为用户提供的一组例行子程序,为用户提供的一组例行子程序,

45、其调用和返回不是用其调用和返回不是用CALL和和RET,而是用,而是用INT n和和IRET。这些子程序可分为以下几个方面:。这些子程序可分为以下几个方面:磁盘的读写及控制管理。磁盘的读写及控制管理。内存管理内存管理基本输入基本输入/输出管理(如键盘、打印机、显示器)输出管理(如键盘、打印机、显示器)其他管理(如日期、时间)其他管理(如日期、时间)所有这些子程序按顺序编号(调用号),分别为所有这些子程序按顺序编号(调用号),分别为075H。调用方法:子程序入口参数送相应寄存器调用方法:子程序入口参数送相应寄存器 调用功能号送调用功能号送AH INT 21H(1)1号功能调用(键盘输入并显示)号

46、功能调用(键盘输入并显示) MOV AH,1 INT 21H 功能:扫描键盘,等待输入,若有键盘按下,则将功能:扫描键盘,等待输入,若有键盘按下,则将键值读入并判断是否为键值读入并判断是否为Ctrl+Break键,若是,退出;键,若是,退出;若不是,则将键值(字符的若不是,则将键值(字符的ASCII码)送码)送AL,同时,同时在在CRT上显示该字符。上显示该字符。(2)6号功能调用号功能调用 MOV DL,0FFH MOV AH,6 INT 21H 功能:从键盘上接收一个字符,并送至功能:从键盘上接收一个字符,并送至AL,且,且ZF=0。若无键按下,则若无键按下,则ZF=1。(3)11号功能调

47、用号功能调用 MOV AH,0BH INT 21H 功能:扫描键盘,无键按下,功能:扫描键盘,无键按下,AL=0;有键按下,;有键按下,AL=FFH。(4)2号功能调用(显示一个字符)号功能调用(显示一个字符) MOV AH,2 MOV DL,待显字符,待显字符ASCII码码 INT 21H (5)9号功能调用(字符串显示)号功能调用(字符串显示) MOV DX,待显示字符串首地址,待显示字符串首地址 MOV AH,9 INT 21H 功能:将以功能:将以$为结束标志的字符串在屏幕上显示。为结束标志的字符串在屏幕上显示。说明:说明:(1)执行前要在)执行前要在DS数据段定义一个字符串,该字符串

48、数据段定义一个字符串,该字符串必须在必须在$结尾。结尾。(2)若字符串无)若字符串无$结尾,则在其尾部加一结尾,则在其尾部加一$;若字符;若字符串中间有串中间有$,则只能采用,则只能采用2号功能调用逐个字符输出。号功能调用逐个字符输出。 (6)10号功能调用(字符串输入)号功能调用(字符串输入) MOV AH,10 MOV DX,待存数据区首地址,待存数据区首地址 INT 21H 功能:从键盘上接收字符串送到内存数据中。功能:从键盘上接收字符串送到内存数据中。 注意:数据区的定义形式:注意:数据区的定义形式: BUF DB 50 ;数据区长度;数据区长度 DB ? ;实际输入字符的个数;实际输

49、入字符的个数 DB 50 DUP(?)(?) ;存放输入的字符;存放输入的字符 如果输入的字符数大于数据区所定义的字符个数,如果输入的字符数大于数据区所定义的字符个数,就会发出就会发出“嘟嘟嘟嘟”声。声。(7)4CH号功能调用(返回操作系统)号功能调用(返回操作系统) MOV AH,4CH INT 21H 功能:结束当前正在执行的程序,返回操作系统,功能:结束当前正在执行的程序,返回操作系统,屏幕显示操作系统提示符。屏幕显示操作系统提示符。2BIOS中断调用中断调用 驻留在驻留在ROM中的中的BIOS提供了系统加电自检、引导提供了系统加电自检、引导装入装入I/O设备的处理程序及接口控制等功能模

50、块来处理设备的处理程序及接口控制等功能模块来处理所有的系统中断。与所有的系统中断。与DOS系统功能调用类似,用户可以系统功能调用类似,用户可以直接用指令设置参数,然后中断调用直接用指令设置参数,然后中断调用BIOS中的程序。中的程序。 下面介绍几条常用的中断调用。下面介绍几条常用的中断调用。(1)键盘中断调用()键盘中断调用(INT 16H)软中断软中断INT 16H有多个功能,其中常用的是有多个功能,其中常用的是0、1、2号号功能功能0号:号:MOV AH,0 INT 16H功能:从键盘读字符,并将其功能:从键盘读字符,并将其ASCII码送码送AL。扫描码。扫描码送送AH。与。与DOS的的1

51、、8号功能类似。号功能类似。1号:号:MOV AH,1 INT 16H功能:判断是否有键按下。有键按下,功能:判断是否有键按下。有键按下,ZF=0,且,且AL,AH同上。无键按下,同上。无键按下,ZF=1。与。与DOS的的6号、号、0B号功能号功能类似。类似。例:按任意键,程序退出执行。例:按任意键,程序退出执行。DOS功能调用(功能调用(11号功能):号功能): MOV AH,0BH INT 21H CMP AL,0FFH JZ STOP ;有键按下,;有键按下,AL=0FFH STOP:MOV AH,4CH INT 21HDOS功能调用(功能调用(6号功能):号功能): MOV AH,06

52、H MOV DL,0FFH INT 21H JNZ STOP ;有键按下,;有键按下,ZF=0 STOP:MOV AH,4CH INT 21HBIOS中断调用(中断调用( INT 16H):): MOV AH,1 INT 16H JNZ STOP ;有键按下,;有键按下,ZF=0 STOP:MOV AH,4CH INT 21H(2)显示器中断调用()显示器中断调用(INT 10H) INT 10H的功能调用可以进行屏幕设置。共有的功能调用可以进行屏幕设置。共有16种种功能号,其中的功能号,其中的0E号功能与号功能与DOS的的2号功能类似。号功能类似。例:在当前光标位置显示人处字符例:在当前光标

53、位置显示人处字符“7”,并使光标进,并使光标进1。 MOV AH,0EH MOV AL,37H INT 10H DOS调用可实现相同的功能:调用可实现相同的功能: MOV AH,2 MOV DL,37H INT 21H(3)时间设置和读取()时间设置和读取(INT 1AH) INT 1AH可以实现对时间的设置和读取。调用此功可以实现对时间的设置和读取。调用此功能时,能时,AH存放功能号,如下表所示:存放功能号,如下表所示:AH 功能入口参数出口参数2读时钟CH:CL=时:分DH:DL=秒:1/100秒(BCD)6置报警时间CH:CL=时:分DH:DL=秒:1/100秒(BCD)7清除报警原理:

54、时间计数器每原理:时间计数器每55ms自动加自动加1,所以将,所以将CX和和DX中中数除以数除以65520得到小时数,余数除以得到小时数,余数除以1092得分数,余数得分数,余数除以除以182得秒数。得秒数。应用举例:利作中断调作产生应用举例:利作中断调作产生5秒延时(秒延时(P206) DELAY5S PROC LLP:MOV AH,0 INT 1AH CMP DX,0500H JNZ LLP RET DELAY5S ENDP3、DOS与与BIOS调用举例调用举例例:编写程序,将键入的例:编写程序,将键入的4位十进制数以压缩的位十进制数以压缩的BCD码码形式存入字变量形式存入字变量SW中。中

55、。为了接收键入的为了接收键入的4位十进制数,需定义一变量数据区,位十进制数,需定义一变量数据区,定义形式为:定义形式为:BUF DB 5,0,5 DUP(?)(?) ;为回车符留一字节;为回车符留一字节单元。单元。程序如下:程序如下: DATA SEGMENT MES DB PLEASE INPUT 4 NUMBERS DB 0DH,0AH,$ BUF DB 5,0,5 DUP(?)(?) SW DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES MOV

56、AH,9 INT 21H LEA DX,BUF MOV AH,10 INT 21H ;等待从键盘上接收数字;等待从键盘上接收数字 MOV AX,WORD PTR BUF+4 AND AX,0F0FH ;转化为非压缩;转化为非压缩BCD数数 MOV CL,4 SHL AL,CL OR AL,AH ;十位与个位数合并在十位与个位数合并在AL中。中。 MOV BYTE PTR SW,AL MOV AX,WORD PTR BUF+2 AND AX,0F0FH SHL AL,CL OR AL,AH MOV BYTE PTR SW+1,AL MOV AH,4CH INT 21HCODE ENDS END

57、START例:设计程序,使计算机不停地响铃(其例:设计程序,使计算机不停地响铃(其ASCII码为码为07H),按任意键停止。),按任意键停止。CODE SEGMENT ASSUME CS:CODESTART:MOV DL,07H MOV AH,2 INT 21H MOV AH,0BH INT 21H CMP AL,0FFH JNZ START ;有键按下,;有键按下,AL=0FFH MOV AH,4CH INT 21H CODE ENDS END START思考题:思考题: 试设计一程序,使计算机屏幕上每秒钟显示一行字试设计一程序,使计算机屏幕上每秒钟显示一行字符符“Good Morning!

58、”,按任意键结束。,按任意键结束。4.4 汇编语言程序设计的基本方法汇编语言程序设计的基本方法1顺序结构程序设计顺序结构程序设计例例1:求两个数的平均值,这两个数分别在:求两个数的平均值,这两个数分别在X单元和单元和Y单单元中,而平均值放在元中,而平均值放在Z单元中。假定均为字节数,程序单元中。假定均为字节数,程序如下:如下:DATA SEGMENT X DB 95 Y DB 87 Z DB ?DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV D

59、S,AX MOV AL,X ADD AL,Y ;两数相加,和送两数相加,和送AL,进位送,进位送CF MOV AH,0 ADC AH,0 ;进位送;进位送AH MOV BL,2 DIV BL ;求平均值;求平均值 MOV Z,AL RETMAIN ENDPCODE ENDS END MAIN例例2:内存中:内存中TABLE开始存放开始存放09的平方值,通过人机的平方值,通过人机对话,当任意给定一个数对话,当任意给定一个数X(09),查表得),查表得X的平方的平方值,放在值,放在AL中。程序如下中。程序如下:DATA SEGMENTTABLE DB 0,1,4,9,16,25,36,49,64,

60、81BUF DB Please input one number(09):,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 INT 21H MOV AH,1 INT 21H ;1号功能调用,键入数送号功能调用,键入数送AL AND AL,0FH MOV BX,OFFSET TABLE MOV AH,0 ADD BX,AX MOV AL,BX ;查表得输入数的平方;查表得输入数的平方 MOV AH,4CH INT 21HCODE

61、ENDS END START此例中也可用查表指令此例中也可用查表指令XLAT来实现。来实现。思考题:思考题: 编写程序,计算编写程序,计算09中某数的立方。某数用字节变中某数的立方。某数用字节变量量X存放,其立方用字变量存放,其立方用字变量XXX存放。建立存放。建立TAB表连续表连续存放存放09的立方,用查表求的立方,用查表求X的立方。的立方。顺序结构程序常见类型:顺序结构程序常见类型:公式计算,如公式计算,如Z=(X+Y)*8-X)/2查表计算、数码转换。如平方表、立方表、查表计算、数码转换。如平方表、立方表、ASCII表、表、七段数据码显示表等。七段数据码显示表等。 2分支结构程序设计分支

62、结构程序设计用转移指令来控制程序的流向。用转移指令来控制程序的流向。(1)简单分支结构)简单分支结构例例1:当:当X 0时,时,Y=1;当;当X=0时,时,Y=0;当;当X 0时,时,Y=1。试编写程序完成这一功能。试编写程序完成这一功能。程序如下:程序如下: DATA SEGMENT X DB ? Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JGE NEXT1 MOV AL,0FFH ;小于;小于0 JMP EXIT NEXT1:JE NE

63、XT2 ;等于;等于0 MOV AL,1 ;大于;大于0 JMP EXIT NEXT2:MOV AL,0 EXIT: MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START例例2:编制计算下面函数的程序(:编制计算下面函数的程序(X、Y均为带符号字节均为带符号字节数):当数):当X0、Y0时,时,Z=1;当;当X、Y均为负数时,均为负数时,Z=-1;当;当X、Y异号时,异号时,Z=0。DATA SEGMENT X DB -8 Y DB 90 Z DB 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:M

64、OV AX,DATA MOV DS,AX CMP X,0 JS L1 ;X小于小于0,转,转L1 CMP Y,0 JL L2 ;Y小于小于0,转,转L2 MOV Z,1 ;X、Y均大于或等于均大于或等于0 JMP EXIT L1:CMP Y,0 JGE L2 ;Y大于等于大于等于0,转,转L2 MOV Z,-1 ;X、Y均为负数均为负数 JMP EXIT L2:MOV Z,0 ;X、Y异号异号EXIT: MOV AH,4CH INT 21H CODE ENDS END START方法方法2:先判断:先判断X、Y是否异号,异号是否异号,异号Z赋赋0;若不异号即;若不异号即同号,则只需再判断其中任

65、一数的符号即可知同号,则只需再判断其中任一数的符号即可知X和和Y是是正数还是负数。正数还是负数。代码段部分程序段如下:代码段部分程序段如下: MOV Z,0 MOV AL,X XOR AL,Y ;根据;根据X、Y的符号置的符号置S标志标志 JS EXIT ;异号;异号 MOV Z,1 ;同号;同号 CMP X,0 JNS EXIT ;同为正数;同为正数 NEG Z ;同为负数,;同为负数,0求补后得到求补后得到-1 EXIT:MOV AH,4CH INT 21H(2)多分支结构)多分支结构方式方式1:依次测试条件是否满足。:依次测试条件是否满足。例:有例:有8个加工子程序,入口地址分别为个加工

66、子程序,入口地址分别为P1、P2,P8。编程实现检测键盘输入命令,使系统分别转向。编程实现检测键盘输入命令,使系统分别转向8个加工子程序。个加工子程序。 MOV AH,1 INT 21H CMP AL,1 JE P1 CMP AL,2 JE P2 CMP AL,8 JE P8 JMP STP1: 方式方式2:用跳转表实现多分支:用跳转表实现多分支方法:在存储器中先建立一个跳转表,表中包括每个分方法:在存储器中先建立一个跳转表,表中包括每个分支程序的入口地址,跳转指令或关键字,利用此表就可支程序的入口地址,跳转指令或关键字,利用此表就可实现分支结构。实现分支结构。根据表内地址分支:跳转表中存放了

67、每个分支程序的根据表内地址分支:跳转表中存放了每个分支程序的入口地址,只要找到表地址,再将其中内容取出,即可入口地址,只要找到表地址,再将其中内容取出,即可得到分支的入口地址。得到分支的入口地址。 表地址表地址=跳转表首地址跳转表首地址+偏移地址偏移地址通常将表地址送通常将表地址送BX,再用,再用JMP WORD PTRBX实现实现多分支的转移。多分支的转移。 BASE P1低位低位 开始开始 P1高位高位 BASE+2 P2低位低位 取编号取编号 P2高位高位 求偏移量求偏移量 P1 求表地址求表地址 P2 转到相应程序转到相应程序例:将上例程序改为用跳转表来实现:例:将上例程序改为用跳转表

68、来实现: BASE DW P1,P2,P3,P4 DW P5,P6,P7,P8 KEY DB ? MOV AH,1 INT 21H AND AL,0FH MOV BX,OFFSET BASE ;取首地址;取首地址 MOV AH,0 ADD AL,AL ADD BX,AX ;求表地址;求表地址 JMP WORD PTR BX例:设有首地址为例:设有首地址为BUFFER的数组,已按升序排好,字的数组,已按升序排好,字组的长度为组的长度为N(=10),在该数组中查找数),在该数组中查找数M(为(为80),),若找到则从数组中删除,若找不到则将它插入到正确的若找到则从数组中删除,若找不到则将它插入到正

69、确的位置。且变化后的数组长度在位置。且变化后的数组长度在DX中。中。DATA SEGMENT N DW 10 M DW 80BUFFER DW 5,10,21,32,47 DW 65,77,85,90,105DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,M ;待查数送;待查数送AX MOV CX,N ;设置计数器;设置计数器 MOV DX,CX ;初始化;初始化DX MOV DI,OFFS

70、ET BUFFER CLD REPNE SCASW ;用重复串扫描指令查找用重复串扫描指令查找 JE DEL ;找到,转删除;找到,转删除 DEC DX MOV SI,DX ADD SI,DX ;地址指针指向最后一个数地址指针指向最后一个数 L1: CMP AX,BUFFERSI: 与与SI所指单元的内容比较所指单元的内容比较 JL L2 MOV BUFFERSI+2,AX ;比比SI所指单元内容大所指单元内容大 JMP L3L2: MOV BX,BUFFERSI MOV BUFFERSI+2,BX ;数组下移一位;数组下移一位 SUB SI,2 ;修改地址指针;修改地址指针 JMP L1 L

71、3 ADD DX,2 ;因为;因为DX前面减了前面减了1,故应加,故应加2 JMP NEXT1 DEL: JCXZ NEXT DEL1: MOV BX,DI MOV DI-2,BX ADD DI,2 LOOP DEL1NEXT: DEC DXNEXT1:RET ;程序结束,返回到程序结束,返回到DOSMAIN ENDPCODE ENDS END START 3、循环程序结构、循环程序结构所谓循环结构就是对同一种操作重复多次,这种程序有所谓循环结构就是对同一种操作重复多次,这种程序有两种结构形式:两种结构形式:先执行,后判断:进入循环后至少执行一次循环体,先执行,后判断:进入循环后至少执行一次循

72、环体,再判断循环结束条件。一般用于循环次数固定的程序。再判断循环结束条件。一般用于循环次数固定的程序。先判断,后执行:进入循环体后,先判断循环结束条先判断,后执行:进入循环体后,先判断循环结束条件,再决定是否执行循环体。可能循环体一次也不执行。件,再决定是否执行循环体。可能循环体一次也不执行。一般用于循环次数不确定的程序。一般用于循环次数不确定的程序。 (1)用条件控制循环(次数已知)用条件控制循环(次数已知) 例:从例:从BUF开始的开始的10个连续单元中存放有个连续单元中存放有10个无符号个无符号字节数,找出其中的最大者送入字节数,找出其中的最大者送入YY单元中。单元中。DATA SEGM

73、ENT XX DB 71,32,43,64,195,6,87,19,108,8 N=$XX YY DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,XX LEA SI,XX MOV CX,N-1 LOP1: INC SI CMP AL,SI JAE LOP2 MOV AL,SILOP2:DEC CX JNZ LOP1 MOV YY,AL MOV AH,4CH INT 21HCODE ENDS END START (2)用条件控制循环)用条件控制循环由于无法确定循环次数,但可以用条

74、件来确定循环是否由于无法确定循环次数,但可以用条件来确定循环是否结束。结束。例:从自然数例:从自然数1开始计数,直到累加和大于开始计数,直到累加和大于1000为止,为止,统计被累加的自然数的个数,并把统计的个数送入统计被累加的自然数的个数,并把统计的个数送入N单单元,把累加和送入元,把累加和送入SUM单元。单元。DATA SEGMENT N DB ? SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV A

75、X,0 MOV BX,AX MOV CX,AX LOP: INC BX ADD AX,BX INC CX CMP AX,1000 ;累加和小于;累加和小于1000? JBE LOP MOV N,CX ;累加次数送;累加次数送N单元单元 MOV SUM,AX RETMAIN ENDPCODE ENDS END START典型循环程序设计:典型循环程序设计:1、存储器中有一字符串首地址为、存储器中有一字符串首地址为BUF,字符串长度,字符串长度N小于小于256,要求分别计算出其中数字,要求分别计算出其中数字09,字母,字母A Z和和其它字符的个数,并分别将它们的个数存放到此字符串下面的三其它字符的

76、个数,并分别将它们的个数存放到此字符串下面的三个单元中。(个单元中。(P171例例4-65)2、将一个包含有、将一个包含有20个数据的数组个数据的数组M分成两个数组,正分成两个数组,正数数组数数组P和负数数组和负数数组N,并分别把这两个数组中数据的,并分别把这两个数组中数据的个数显示出来。(实验题)个数显示出来。(实验题)3、编程序统计学生的数学成绩,分别归类、编程序统计学生的数学成绩,分别归类9099分,分,8089分,分,7079分,分,6069分及分及60分以下,并将各段的分以下,并将各段的人数送入内存单元中。(实验题)人数送入内存单元中。(实验题)4、编程序统计、编程序统计AX中中1的

77、个数(两种方法)的个数(两种方法)(3)多重循环)多重循环多重循环:循环体内再套循环。多重循环:循环体内再套循环。常见类型:数组访问,排序。常见类型:数组访问,排序。例:在以例:在以BUF为首址的字节存储单元区中存放有为首址的字节存储单元区中存放有N个无个无符号数,试编程将它们从小到大排序。(冒泡法)符号数,试编程将它们从小到大排序。(冒泡法)排序方法:将第一个数与其后的排序方法:将第一个数与其后的N-1个数比较,如果后个数比较,如果后面的数小于第一个数,则将它们互换,否则继续比较。面的数小于第一个数,则将它们互换,否则继续比较。N-1次后,次后,N个数中的最小数放在第一个存储单元中。个数中的

78、最小数放在第一个存储单元中。余下的余下的N-1个中,经过个中,经过N-2次比较后,第二小者放在第二次比较后,第二小者放在第二个单元中。个单元中。最后两个存储单元中的数比较最后两个存储单元中的数比较1次后,从次后,从小到大的顺序就实现了。小到大的顺序就实现了。N个数,共比较(个数,共比较(N-1)+(N-2)+2+1次。次。DATA SEGMENT BUF DB 20H,90H,10H,80H,70H DB 40H,50H,30H,60H N =-BUFDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX

79、MOV DX,N-1 MOV SI,1 LOP1:MOV DI,SI INC DI ;(;(SI)+1 DI MOV AL,BUF+SI-1 LOP2:CMP AL,BUF+DI-1 JBE NEXT XCHG BUF+DI-1,AL MOV BUF+SI-1,ALNEXT:INC DI ; (DI)+1 DI CMP DI,N JBE LOP2 INC SI ;(;(SI)+1 SI CMP SI,N-1 JBE LOP1 MOV AH,4CH INT 21HCODE ENDS END START4子程序结构程序设计子程序结构程序设计子程序是具有一定的功能,能被多次调用的程序。子程序是具有一

80、定的功能,能被多次调用的程序。(1)子程序定义与调用)子程序定义与调用定义:过程名定义:过程名 PROC NEAR/FAR RET 过程名过程名 ENDP 调用:调用:CALL 过程名过程名例例1:段内直接调用子程序,显示符:段内直接调用子程序,显示符“M”。CODE SEGMENT ASSUME CS:CODE MAIN PROC FAR START:PUSH DS MOV AX,0 PUSH AX CALL OUTPUT RET MAIN ENDP OUTPUT PROC NEAR MOV DL,M MOV AH,2 INT 21H RET OUTPUT ENDP CODE ENDS EN

81、D START例例2:段间调用,显示同上。:段间调用,显示同上。 CODE1 SEGMENT ASSUME CS:CODE1 MAIN PROC FAR START:PUSH DS MOV AX,0 PUSH AX CALL FAR PTR OUTPUT RET MAIN ENDP CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2OUTPUT PROC FAR MOV DL,M MOV AH,2 INT 21H RETOUTPUT ENDP CODE2 ENDS END START (2)子程序的结构)子程序的结构子程序通常由子程序说明部分与代码部分所组成。子程

82、序通常由子程序说明部分与代码部分所组成。说明部分由下列几部分所组成:子程序名称,子程序功说明部分由下列几部分所组成:子程序名称,子程序功能,入口参数,出口参数,使用的寄存器和存储单元,能,入口参数,出口参数,使用的寄存器和存储单元,调用的其它子程序,调用的其它子程序,代码部分:保护现场;根据入口参数,获取要处理的数代码部分:保护现场;根据入口参数,获取要处理的数据;进行数据处理;根据出口参数,将处理后的数据送据;进行数据处理;根据出口参数,将处理后的数据送至指定的区域;恢复现场;返回主程序。至指定的区域;恢复现场;返回主程序。例:有一个子程序说明如下:例:有一个子程序说明如下: ;名称:;名称

83、:BCD2BIN ;功能:将一个字节的;功能:将一个字节的BCD码转换成二进制数码转换成二进制数 ;所用寄存器:;所用寄存器:CX ;入口参数:;入口参数:AL存放两位存放两位BCD码码 ;出口参数:;出口参数:AL存放二进制数存放二进制数 ;调用其它子程序:无;调用其它子程序:无代码部分如下:(算法:代码部分如下:(算法:45=4*10+5) BCD2BIN PROC NEAR PUSH CX MOV CH,AL AND CH,0FH MOV CL,4 SHR AL,CL MOV CL,10 MUL CL ADD AL,CH POP CX RET BCD2BIN ENDP (3)子程序参数的

84、传递方法:)子程序参数的传递方法: 用寄存器传递参数:适合于参数较少的情况,传递用寄存器传递参数:适合于参数较少的情况,传递速度较快。速度较快。 用存储器传递参数:适合于参数较多的情况,事先用存储器传递参数:适合于参数较多的情况,事先需要在存储器中建立一个参数表。需要在存储器中建立一个参数表。 用堆栈传递参数:适合于参数较多的情况,尤其是用堆栈传递参数:适合于参数较多的情况,尤其是在子程序嵌套与递归调用的情况。在子程序嵌套与递归调用的情况。 例:把一个例:把一个2位十进制数表示成的压缩型位十进制数表示成的压缩型BCD数转换成数转换成与其对应的二进制数。(用寄存器传递参数)与其对应的二进制数。(

85、用寄存器传递参数) 用上面的子程序调用即可实现,程序如下:用上面的子程序调用即可实现,程序如下: DATA SEGMENT X DB 56H ;压缩;压缩BCD码码 Y DB ? ;对应的二进制数;对应的二进制数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR PUSH DX MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AL,X CALL BCD2BIN MOV Y,AL RET MAIN ENDP BCD2BIN PROC NEAR PUSH CX MOV CH,AL AND C

86、H,0FH MOV CL,4 SHR AL,CL MOV CL,10 MUL CL ADD AL,CH POP CX RET BCD2BIN ENDP CODE ENDS END START (4)子程序的嵌套与递归调用)子程序的嵌套与递归调用嵌套:子程序中调用子程序。嵌套:子程序中调用子程序。递归调用:子程序自己调用自己。如求递归调用:子程序自己调用自己。如求N!例:编写子程序,将无符号二进制字节数转换成十进制例:编写子程序,将无符号二进制字节数转换成十进制数输出。数输出。根据题意,设计一个主程序根据题意,设计一个主程序MAIN和两个子程序和两个子程序BTD、DISP,BTD实现二进制到十进

87、制的转换,实现二进制到十进制的转换,DISP完成数完成数据的显示。据的显示。程序如下:程序如下: DATA SEGMENT X DB 0FBH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV BH,X CALL BTD RET MAIN ENDP BTD PROC NEAR MOV AL,BH MOV AH,0 MOV BL,100 DIV BL MOV BH,AH ;保留余数;保留余数 CALL DISP ;显示百位;显

88、示百位 MOV AL,BH MOV AH,0 MOV BL,10 DIV BL MOV BH,AH CALL DISP ;显示十位;显示十位 MOV AL,BH CALL DISP ;显示个位;显示个位 RET BTD ENP DISP PROC NEAR MOV DL,AL ADD AL,30H MOV AH,2 INT 21H RET DISP ENDP CODE ENDS END MAIN例:编程求例:编程求N!(假定!(假定N小于小于8) 8!=40320,9!=362880。程序如下:程序如下: DATA SEGMENT N DB 5 R DW ? DATA ENDS CODE SE

89、GMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AL,N CALL FACT MOV R,DX RET MAIN ENP FACT PROC NEAR CMP AL,0 JNE L1 MOV DX,1 RET L1: PUSH AX DEC AL CALL FACT POP CX CALL MULT MOV DX,AX RET FACT ENDP MULT PROC NEAR MOV AL,CL MUL DL RET MULT ENDP CODE ENDS END MAIN本章习题本章习题1、2、3、4、5、6、8、12实验习题程序设计部分实验习题程序设计部分

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号