第五章微机原理_第1页
第五章微机原理_第2页
第五章微机原理_第3页
第五章微机原理_第4页
第五章微机原理_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 汇编语言程序设计汇编语言程序设计my_data segment again: Mov al,siarray1 db 05,a2H,00,10H,85H Inc si n equ 5 Cmp al, 50array2 db n dup(?) Jbe next my_data ends Mov di, almy_code segment Inc di assume cs:my_code next: dec cx assume ds:my_data jnz againbegin: mov ax, my_data mov ah,4ch mov ds, ax int 21h Lea si,

2、 array1 my_code ends Lea di, array2 end begin Mov cx, n05A2001085array1array2DSCS教材上另一例子教材上另一例子(p.90)汇编语言基本构成:汇编语言基本构成:1. 基本格式基本格式2. 语句行构成语句行构成标号标号 操作码操作码 操作数操作数1 ,操作数,操作数2 ;注释;注释(1) 8088汇编语句中的标记汇编语句中的标记(3) 表达式表达式3. 伪指令伪指令4. 指令指令(1) 符号定义语句符号定义语句(2) 数据定义语句数据定义语句(3) 段定义语句段定义语句(4) 过程定义语句过程定义语句(5) 程序开始结

3、束语句程序开始结束语句(2) 符号符号 8088汇编语言的源汇编语言的源程序是由多个段组成程序是由多个段组成的,的, 一个可执行的汇一个可执行的汇编程序一般至少有一编程序一般至少有一个代码段,其中包含个代码段,其中包含可执行的语句。其基可执行的语句。其基本格式如图本格式如图:1. 基本格式基本格式S_NAME1 SEGMENT 语句 语句S_NAME1 ENDSS_NAME2 SEGMENT 语句 语句S_NAME2 ENDSS_NAME3 SEGMENT 语句 语句S_NAME3 ENDS END2. 语句行构成语句行构成 每个段是由语句行构成的。一个语句行的基本格式为:每个段是由语句行构成

4、的。一个语句行的基本格式为: 标号标号 操作码操作码 操作数操作数1 ,操作数,操作数2 ;注释;注释(1) 8088汇编语句中的标记汇编语句中的标记 标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以下段的开头。使用时要注意以下3点:点: 标识符可由数字、字母和下划线组成;标识符可由数字、字母和下划线组成; 不能以数字开头,数据可用在非开头的其它位置;不能以数字开头,数据可用在非开头的其它位置; 其最大长度为其最大长度为31个字符。个字符。 保留字保留字是汇编语言中预先保留的特殊字串,只能用于特殊用

5、途,所是汇编语言中预先保留的特殊字串,只能用于特殊用途,所有有8086/8088的指令、伪指令和寄存器名都是保留字的指令、伪指令和寄存器名都是保留字。如。如AX、MOV、DB、INT、EQU等等。等等。 保留字不能用作标识符保留字不能用作标识符 界符是用于一个程序或一条指令中不同部分的分隔符,界符是用于一个程序或一条指令中不同部分的分隔符, 如如 MOV AX, 0010H 中的中的“,”就是界符。其内容见下表:就是界符。其内容见下表: ; * , : + - = ( ) $ & ? . / 常量就是指令中的一些不变的数据。它可以用常量就是指令中的一些不变的数据。它可以用二进制、十六进

6、制、十进制和八二进制、十六进制、十进制和八进制进制表示,也可以用引号引起来的字串。例如:表示,也可以用引号引起来的字串。例如: 二进制:二进制: 00011101B 十六进制:十六进制:0C5AAH 十进制:十进制: 9856D 八进制:八进制: 237O 字串:字串: The 2X means 2 multiple X 其中的其中的B、H、D和和O为数制的结尾符。为数制的结尾符。 6) 注释注释 注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分的关系,一般写在某语句的后面或某段的开始处,注释的前面由它部

7、分的关系,一般写在某语句的后面或某段的开始处,注释的前面由“;”前前导,表示后面的内容为注释。如果一行写不下,换行后也要使用导,表示后面的内容为注释。如果一行写不下,换行后也要使用“;”前导。前导。(2) 符号符号 在在8086/8088汇编语言的源程序中为了使程序有很好的可读性和易修改性,通汇编语言的源程序中为了使程序有很好的可读性和易修改性,通常使用有一定意义的符号来代替某些单元、数据或表达式。常使用有一定意义的符号来代替某些单元、数据或表达式。符号可分为四类:寄存符号可分为四类:寄存器、变量、标号、数。如器、变量、标号、数。如SUM、DATA1。 8086/8088的寄存器是程序中最常出

8、现的符号,它可分为字节寄存器和字寄存器,的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如如AX为字寄存器,而为字寄存器,而AL则为字节寄存器。只有则为字节寄存器。只有AX、BX、CX、DX可分为字和字可分为字和字节寄存器。节寄存器。 变量是存放在某些单元中的操作数变量是存放在某些单元中的操作数,使用有一定意义的符号来代表这些单元。,使用有一定意义的符号来代表这些单元。所有的变量都有一个固定的地址,它由段和偏移组成;同时还有一个类型,它可以所有的变量都有一个固定的地址,它由段和偏移组成;同时还有一个类型,它可以是字节、字或双字。在程序中,变量可以使用数据定义伪指令进行初始化,见伪

9、指是字节、字或双字。在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。令一节中的数据定义部分。 标号实际上是用符号表示的地址,因此它也是由段、偏移地址和类型组成,其标号实际上是用符号表示的地址,因此它也是由段、偏移地址和类型组成,其类型分为类型分为段内(段内(NEAR)和段间()和段间(FAR)两种,通过两种,通过 SEG 标号标号 OFFSET 标号标号可以分别得到标号的段地址和偏移地址。可以分别得到标号的段地址和偏移地址。 如果是如果是NEAR类型,在程序执行时,只取标号的偏移地址,例如在过程调用类型,在程序执行时,只取标号的偏移地址,例如在过程调用(CALL)

10、时,只取)时,只取IP,而对于,而对于FAR类型,则要取段地址和偏移地址,在类型,则要取段地址和偏移地址,在CALL时要时要取取IP和和CS。 在程序设计中,为了程序有良好的可读性和可修改性,有些数据使用符号来表在程序设计中,为了程序有良好的可读性和可修改性,有些数据使用符号来表示,通过伪操作,将数据与某些符号相联系。示,通过伪操作,将数据与某些符号相联系。(3) 表达式表达式 表达式由操作数和运算符组成表达式由操作数和运算符组成,如,如3+2、77 AND 55、NOT 5AH等。等。 操作数用于代表一个数据或一个地址。操作数用于代表一个数据或一个地址。 运算符包括算术、逻辑、关系、分析、综

11、合五类运算符。运算符包括算术、逻辑、关系、分析、综合五类运算符。 算术运算符算术运算符 包括包括 + 、*、/ 、MOD 参加运算的内容可以是数据,也可以是地址,但在一个算术运算符参加运算的内容可以是数据,也可以是地址,但在一个算术运算符 的两边不能都是地址。的两边不能都是地址。 逻辑运算符逻辑运算符 包括包括 AND、OR、NOT、XOR 关系运算符关系运算符 包括包括 相等相等 :EQ 大于:大于:GT 不等:不等:NE 小于或等于:小于或等于:LE 小于:小于:LT 大于或等于:大于或等于:GE 关系运算结果只有两个关系运算结果只有两个真、假真、假。 如果关系是真,则结果为如果关系是真,

12、则结果为 0FFH(0FFFFH);); 如果关系是假,则结果为如果关系是假,则结果为0。例如例如 MOV BX, DATA1 LT 0010H MOV BX, 0FFFFH MOV BX, DATA1 LT 0010H MOV BX, 0 当当 DATA1 0010H 时时 分析运算符分析运算符 分析运算在汇编语言程序设计中很重要。它包括分析运算在汇编语言程序设计中很重要。它包括 取存储单元偏移:取存储单元偏移:OFFSET 取存储单元段:取存储单元段: SEG 取类型:取类型:TYPE 取字节数:取字节数: SIZE 按类型取长度:按类型取长度:LENGTH例例1: 设有数据段中使用设有数

13、据段中使用 DATA1 DB ?定义了一个单元,则定义了一个单元,则 05A2001085DSCSDATA12000:1500 MOV AL, DATA1 可将可将DATA1中的数传送到中的数传送到AL中,中, AL=05 MOV AX, SEG DATA1可将可将DATA1的所在段地址传到的所在段地址传到AX中,中,AX=2000 MOV AX, OFFSET DATA1可将可将DATA1的偏移地址传入的偏移地址传入AX中中, AX=1500 例例2: 设有数据段中使用设有数据段中使用 DATA1 DW 100 DUP (?) 定义了定义了100个字单元,则个字单元,则 MOV AX, TY

14、PE DATA1 AX=2 MOV AX, SIZE DATA1 AX=200 MOV AX, LENGTH DATA1 AX=100 合成运算符合成运算符 合成运算符包括两个地址操作符合成运算符包括两个地址操作符 PTR和和THIS。 PRT改变存储器地址操作数的改变存储器地址操作数的操作类型操作类型,但其段地址和偏移地址不变。,但其段地址和偏移地址不变。 如:如: DATA1 DW 100 DUP(?)05A2001085DSMOV AL, DATA1MOV AL, BYTE PTR DATA1MOV AX, DATA1DATA1DATA1 SEGMENTWBUFFER EQU THIS

15、WORDBUFFER DB 12H, 34H, 00H, 91H DATA1 ENDSCODE1 SEGMENT ASSUME CS: CODE1, DS: DATA1START: MOV AX, DATA1 MOV DS, AX MOV AL, BUFFER MOV BX, WBUFFER CODE1 ENDS END STARTTHIS用来建立新的存储器地址操作数,但不分配存储单元。新的操作用来建立新的存储器地址操作数,但不分配存储单元。新的操作 数类型在数类型在THIS中指定,而其段地址和偏移量就是汇编时的当前值。中指定,而其段地址和偏移量就是汇编时的当前值。(教材,教材,p.106)1

16、234009185DSBUFFERWBUFFERAL=12HBX=3412H3. 伪指令伪指令 在在8086/8088汇编语言中汇编语言中伪指令伪指令是用于诸如是用于诸如数据定义、存储区分配数据定义、存储区分配等功能。所谓等功能。所谓伪指令是非机器指令,它是在汇编期间进行操作的伪指令是非机器指令,它是在汇编期间进行操作的。(1) 符号定义语句符号定义语句 EQU 为了使程序便于阅读和修改,我们有时使用一个符号来代表一个值,而符号为了使程序便于阅读和修改,我们有时使用一个符号来代表一个值,而符号代表了一定的意义,在程序中使用一个符号代表一个值进行操作,其格式为:代表了一定的意义,在程序中使用一个

17、符号代表一个值进行操作,其格式为: 例如:例如: PORT EQU 3F8H在程序中可使用在程序中可使用 MOV DX, PORT 对对DX进行赋值,实际上进行赋值,实际上PORT就是一个常量。就是一个常量。还可在语句中进行运算,如:还可在语句中进行运算,如: DATA_PORT EQU 3F8H STAT_PORT EQU 3F8H+2 SEED EQU 10 FUNC EQU SEED*SEED+2*SEED+1 对符号的赋值还可使用对符号的赋值还可使用“=”操作,它与操作,它与EQU的区别是的区别是“=”操作可以重复操作可以重复定义,而定义,而EQU则不能重复定义。如:则不能重复定义。如

18、: X=3 Y=6 Y=Y*Y-X MOV AX, Y 通过上述操作,最后使通过上述操作,最后使Y=33,后面的,后面的MOV语句中,当生成目标代码时将用语句中,当生成目标代码时将用33取代取代Y。即。即 MOV AX, 21H (33D)(2) 数据定义语句数据定义语句重要重要 数据定义语句用于为数据分配相应的存储单元。数据定义语句用于为数据分配相应的存储单元。用一个符号名代表一个用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有: 字节定义字节定义DB 字定义字定义DW 双字定义双字定义DD 四字

19、定义四字定义DQ 十字节定义十字节定义DT 重复定义重复定义 m DUP(n) (重复(重复m次个数据次个数据 n ) 与数据相联系的符号名称为与数据相联系的符号名称为变量变量。数据定义语句的格式为:数据定义语句的格式为: 例:例: DATA1 DB ? DATA2 DW 1000H DATA3 DD 3000A455H DATA4 DB 4 DUP(0) DATA5 DW 0120H, 0240H, 0360H 通过上述定义,在存储器中将产生如图所通过上述定义,在存储器中将产生如图所示的结果。示的结果。 DS随机随机001055A4003000000000200140026003DATA1D

20、ATA2DATA3DATA4DATA5DS544849532049532041204558414D504C45例:例: DATA6 DB THIS IS A EXAMPLEDATA6THIS ISAEXAMPLE 数据定义语句数据定义语句定义的数据在存储器中占定义的数据在存储器中占 有相应的单元,如上面语句中的第二句有相应的单元,如上面语句中的第二句 在程序运行时将会以在程序运行时将会以00和和10占据两中存占据两中存 储单元。储单元。 而而EQU只是定义了一个数据,在汇编只是定义了一个数据,在汇编 后以实际数据的形式体现在程序中。后以实际数据的形式体现在程序中。 也就是说,也就是说,EQU语

21、句不会占有存储单语句不会占有存储单 元。元。(3) 段定义语句段定义语句 (p.106) 在段定义中,在段定义中,SEGMENT和和ENDS总是成对使用的,它们将数据和程序总是成对使用的,它们将数据和程序分为多个段,如数据段、栈段和代码段。分为多个段,如数据段、栈段和代码段。 ASSUME是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是数是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是数据段,哪个是代码段,哪个是栈段。据段,哪个是代码段,哪个是栈段。 ORG用于指定目标程序存放单元的起始偏移地址,通常写在第一条源用于指定目标程序存放单元的起始偏移地址,通常写在第一条源程序的前面,用于指

22、定这段程序的首地址。如使用了:程序的前面,用于指定这段程序的首地址。如使用了: ORG 100则程序执行时就从则程序执行时就从CS:100处开始执行其后面的程序。处开始执行其后面的程序。例:求出两个例:求出两个16位数位数M1和和M2的积的积 DATA_SEG SEGMENT M1 DW 0058H M2 DW 012AH M3 DW ? M4 DW ? DATA_SEG ENDS STACK_SEG SEGMENT S_DATA DB 100 DUP(?) TOP EQU LENGTH S_DATA STACK_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE

23、_SEG, DS:DATA_SEG, SS:STACK_SEG 58002A01DSM1M2M3M4 START: MOV AX, DATA_SEG MOV DS, AX MOV AX, STACK_SEG MOV SS, AX MOV AX, TOP MOV SP, AX MOV BX, OFFSET M1 MOV AX, BX MOV DX, 0 MOV BX, OFFSET M2 MUL BX MOV BX, OFFSET M3 MOV BX, AX MOV BX, OFFSET M4 MOV BX, DX MOV AH, 4CH INT 21H DOCE_SEG ENDS END ST

24、ART : SEGMENT和和ENDS前面必须有标号,而且在相互配对的段,它们前前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。意字串,但为了程序的可读性,应使其有一定的意义。 ASSUME语句可使汇编器知道语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇指向哪个段,但它只在汇编时起作用,在运行时编时起作用,在运行时CPU并不知道除并不知道除CS外的其它段地址,所以必须在外的其它段地址,所以必须在程序中用指令进行赋值。程序

25、中用指令进行赋值。 首条被执行的语句有一个标号,在程序的结尾使用首条被执行的语句有一个标号,在程序的结尾使用END后跟上这个标后跟上这个标号,用以标出这个程序的开始执行处。号,用以标出这个程序的开始执行处。(4) 过程定义语句过程定义语句 (p.112) 和其它程序设计一样,和其它程序设计一样,8086/8088汇编程序设计有过程或子程序的设计汇编程序设计有过程或子程序的设计方法。方法。8086/8066汇编程序的过程从运行位置上分为近过程(汇编程序的过程从运行位置上分为近过程(NEAR)和)和远过程(远过程(FAR),其定义如下:),其定义如下: PROC_NAME1 PROC NEAR R

26、ET PROC_NAME1 ENDP PROC_NAME2 PROC FAR RET PROC_NAME2 ENDP 过程和其它程序可定义在同一个段中,也可定义在不同的段中。对过过程和其它程序可定义在同一个段中,也可定义在不同的段中。对过程的调用要使用程的调用要使用CALL语句,如:语句,如: CALL PROC_NAME1 CALL PROC_NAME2 如果在过程定义中没有写明是如果在过程定义中没有写明是NEAR过程或过程或FAR过程,则汇编器将这过程,则汇编器将这个过程默认为个过程默认为NEAR过程。过程。(5) 程序开始和结束语句程序开始和结束语句 (p.113) 整个程序的结束使用整

27、个程序的结束使用 END 标出,当汇编器读到标出,当汇编器读到 END 时,它认为程序时,它认为程序到此就结束了。在程序中,首条被执行的语句有一个标号,在程序的结到此就结束了。在程序中,首条被执行的语句有一个标号,在程序的结尾使用尾使用 END 后跟上这个标号,用以标出这个程序的开始执行处。后跟上这个标号,用以标出这个程序的开始执行处。 汇编语言程序的执行过程:汇编语言程序的执行过程:编辑程序编辑程序. ASM 文件文件汇编程序汇编程序. OBJ 文件文件连接程序连接程序. EXE 文件文件Edit 等等MASMLINK 汇编语言程序设计与其它语言的程序设计一样,都要有良好的数据结构汇编语言程

28、序设计与其它语言的程序设计一样,都要有良好的数据结构和算法,对每个要解决的问题要经过入下步骤:和算法,对每个要解决的问题要经过入下步骤:根据问题提出相应的算法或逻辑过程;根据问题提出相应的算法或逻辑过程; 根据已确定的算法或逻辑过程画出程序流程图,把解题的思路和逻辑根据已确定的算法或逻辑过程画出程序流程图,把解题的思路和逻辑 顺序以图示的方法表示出来。顺序以图示的方法表示出来。 分配工作单元和寄存器。当然,在分配工作单元和寄存器。当然,在8086/8088汇编程序设计中,由于可汇编程序设计中,由于可 用资源相对其它一些用资源相对其它一些CPU和计算机系统较多,所以这项工作也可在程和计算机系统较

29、多,所以这项工作也可在程 序编制中进行。序编制中进行。 编写程序代码。编写程序代码。 在程序设计中,程序的在程序设计中,程序的是程序设计好坏的重要指标,特别是在汇编是程序设计好坏的重要指标,特别是在汇编程序设计中,其特点要求我们对程序运行的效率加以重点关注。对于汇程序设计中,其特点要求我们对程序运行的效率加以重点关注。对于汇编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准:编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准:程序的执行时间。每一条语句都有自己的执行时间,在程序的执行时间。每一条语句都有自己的执行时间,在8086/8088指令指令 手册中每条指令的运行时间都有明

30、确的定义。根据这些时间,我们可手册中每条指令的运行时间都有明确的定义。根据这些时间,我们可 算出程序的运行时间。算出程序的运行时间。程序所占有的字节数。有一些计算机系统,可能应用于工业控制或工程序所占有的字节数。有一些计算机系统,可能应用于工业控制或工 业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求我业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求我 们的程序有尽可能少的字节数,以满足缩减硬件资源的要求。们的程序有尽可能少的字节数,以满足缩减硬件资源的要求。程序的语句行数。程序的语句行数。 例例1:将一个字节乘以:将一个字节乘以128例例2:数:数AL中的中的“1”的个数

31、。的个数。例例1:将一个字节乘以:将一个字节乘以128我们可以通过:我们可以通过: MOV AL, DATA MOV BL, 128 MUL BL也可以通过也可以通过 MOV AL,DATA MOV CL,7 SHL AL,CL还可以通过还可以通过 MOV AH, DATA MOV AL, 0 SHR AX, 1来完成。来完成。 例例2:数:数AL中的中的“1”的个数:的个数:程序程序1: MOV AH, 0 MOV CX, 8 AGAIN: SHL AL, 1 JC ADD1 JMP NEXT ADD1: INC AH NEXT: LOOP AGAIN HLT程序程序2: MOV AH, 0

32、 CLC AGAIN: SHL AL, 1 ADC AH, 0 OR AL, AL JNZ AGAIN HLT显然,程序显然,程序2在运行效率和程序行数上都优于程序在运行效率和程序行数上都优于程序1。 直线程序设计是程序设计中最简单的设计方法,它是将确定好的算法或直线程序设计是程序设计中最简单的设计方法,它是将确定好的算法或逻辑关系以正确的语句和正确的逻辑关系有序地编写出来,形成程序。逻辑关系以正确的语句和正确的逻辑关系有序地编写出来,形成程序。例例5-1:求两:求两32位无符号数的乘积。(强调思路和程序结构)位无符号数的乘积。(强调思路和程序结构) 在在8086/8066中,单个可处理数据的

33、最大位数为中,单个可处理数据的最大位数为16位,所以在计算中不能位,所以在计算中不能一次将两个一次将两个32数的积求出,所以可通过部分积的求法,求出它们的积。数的积求出,所以可通过部分积的求法,求出它们的积。算法如下图。算法如下图。 D11 D12 D21 D22D12D22D11D22D12D21D11D21+部分积部分积1部分积部分积2部分积部分积3部分积部分积4结果结果 DX AXDX AXDX AXDX AX NAME 32 BIT MULTIPLYDATA SEGMENTMULNUM DW 0010, 0A100H, 0000, 0FFFFH, 4 DUP(?)DATA ENDSST

34、ACK SEGMENT PARA STACK DB 100 DUP(?)TOP EQU LENGTH STACKSTACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART PROC FAR ;将本程序作为将本程序作为DOS操作系统的子程序。操作系统的子程序。 BEGIN: PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX Segment 的类型及属性说明的类型及属性说明在需要用连接程序将本程序在需要用连接程序将本程序与其它模块相连接时,需要与其它模块相连接时

35、,需要使用这些说明。使用这些说明。 MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX ; 以上为设置段地址以上为设置段地址 ;和栈指针和栈指针 LEA BX, MULNUM ;取数据的首地址取数据的首地址MUL32: MOV AX, BX ;取取D12至至AX MOV SI, BX+4 ;取取D22至至SI MUL SI ;D12D22 MOV BX+8, AX ;存存 结果结果 MOV BX+0AH, DX ;存中间结果存中间结果 MOV AX, BX+2 ;取取D11至至AX MUL SI ; D11D22 ADD AX, BX+0AH ; +

36、 ADC DX, 0 ; 加加+ 的进位的进位 MOV BX+0AH, AX MOV BX+0CH, DX ;存中间结果存中间结果 D12D22D11D22D12D21 D11D21+部分积部分积1部分积部分积2部分积部分积3部分积部分积4结果结果DX AXDX AXDX AXDX AXD11 D12D21 D2200006F2720094635 MOV AX, BX ;取取D12至至AX MOV DI, BX+6 ;取取D21至至DI MUL DI ; D12D21 ADD AX, BX+0AH ; + + ADC DX, BX+0CH ; + 加加进位进位 MOV BX+0AH, AX ;

37、存结果存结果 MOV BX+0CH, DX ;存中间结果存中间结果 + PUSHF ;保存上次计算的进位位保存上次计算的进位位 MOV AX, BX+2 ;取取D11至至AX MUL DI ;与与D21相乘相乘 POPF ;取上次的进位位取上次的进位位 ADC AX, BX+0CH ; + + ADC DX, 0 ; +进位进位 MOV BX+0CH, AX MOV BX+0EH, DX ;存结果存结果 RET ; 返回到返回到DOSStart endpCODE ENDS END BEGIN D12D22D11D22D12D21 D11D21+部分积部分积1部分积部分积2部分积部分积3部分积部

38、分积4结果结果DX AXDX AXDX AXDX AXD11 D12D21 D22 在很多实际问题中,通常要根据不同的情况,执行不同的程序块或语句,在很多实际问题中,通常要根据不同的情况,执行不同的程序块或语句,这就需要在设计程序时使用运算后的结果,依据一定的条件进行相应的判这就需要在设计程序时使用运算后的结果,依据一定的条件进行相应的判断,根据判断结果的真或假,去运行相应的程序或语句。断,根据判断结果的真或假,去运行相应的程序或语句。例例2 :有一数学函数如下:有一数学函数如下: 1 x0 y=f(x)= 0 x=0 -1 x0Y=0 Y=1 Y= -1YYNN框图如下框图如下开始开始DAT

39、A SEGMENT X DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AX, X OR AX, AX JZ ZERO JNS PLUS MOV BL, 0FFH JMP HALTZERO: MOV BL, 0 JMP HALTPLUS: MOV BL, 1HALT: MOV AH, 4CH INT 21HCODE ENDS END START 在上面的程序中,要特别注在上面的程序中,要特别注意其中的两中意其中的两中JMP HALT的的使用,从而保证每个分支的使用,从而保证每

40、个分支的完整性。完整性。 对于程序中多次、有规律执行的部分,我们通常使用循环结构要重复运行这对于程序中多次、有规律执行的部分,我们通常使用循环结构要重复运行这些部分,使程序有较高的运行效率和可读性。循环结构主要由三部分组成,它们些部分,使程序有较高的运行效率和可读性。循环结构主要由三部分组成,它们是:是: 1. :重复运行的部分,其中还包含了工作部分和循环控制部分。工作部:重复运行的部分,其中还包含了工作部分和循环控制部分。工作部分进行相应的操作,而循环控制部分则保证在不满足循环条件时,跳出循环。分进行相应的操作,而循环控制部分则保证在不满足循环条件时,跳出循环。 2. :在循环体中包括了循环

41、结束条件运算部分。每循环一次除了:在循环体中包括了循环结束条件运算部分。每循环一次除了工作部分进行相应的操作外,循环条件部分还要通过运算,得出当前循环的状态,工作部分进行相应的操作外,循环条件部分还要通过运算,得出当前循环的状态,以便在适当的条件下结束循环。以便在适当的条件下结束循环。 3. :用于设置开始循环时,循环体所处的初始状态,如循环变量初值,:用于设置开始循环时,循环体所处的初始状态,如循环变量初值,循环体中用到的数据和地址指针等。循环体中用到的数据和地址指针等。DATA SEGMENTSUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:

42、DATASTART PROC FARBEGIN: PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS ,AX MOV CX, 10 MOV AX, 0AGAIN: ADD AX, CX LOOP AGAIN MOV SUM, AX RETSTART ENDPCODE ENDS END BEGIN 该程序是一个以计数器为该程序是一个以计数器为循环条件的循环结构,是循循环条件的循环结构,是循环中常见的结构之一。环中常见的结构之一。例例3:求:求1-10的累加和。的累加和。DATA SEGMENTSTR DB THIS IS A STRING$LEN DW

43、?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART PROC FARBEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV CX, 0 LEA BX, STRAGAIN: MOV AL, BX CMP AL, $ JZ HALT INC CX INC BX JMP AGAIN上述程序是一个以控制条件为上述程序是一个以控制条件为循环条件的循环结构。循环条件的循环结构。HALT: MOV LEN, CX RET START ENDPCODE ENDS END BEGIN例例4:有一

44、以:有一以“$”结束的字串,请求出它的长度。结束的字串,请求出它的长度。例例5:设有:设有数组数组 X x1, x2, x3 , x10 ,数组数组 Y y1, y2, y3 , y10 ,试编程计算试编程计算 z1= x1-y1 z2 = x2+y2 z3 = x3-y3 z4 = x4+y4 z5 = x5-y5 z6 = x6-y6 z7 = x7+y7 z8 = x8-y8 z9 = x9-y9 z10=x10-y10开始开始初始化:设逻辑尺,初始化:设逻辑尺,地址指针,循环次数地址指针,循环次数i=0测试逻辑尺第测试逻辑尺第 i 位的值位的值 = 0 ?Xi-yiXi+yiZi 结果

45、结果 i i+1循环结束循环结束 ?结束结束nyyn设逻辑尺:设逻辑尺:0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1Data segmentX db 11,22,33,44,45,66,77,88,99,100Y db 1,2,3,4,5,6,7,8,9,10Z db 10 dup( ?)Logrule dw 0000001010110111bData endsCode segment assume cs:code, ds: dataStart proc farBegin: push ds xor ax, ax push ax mov ax, data mov ds, ax

46、mov bx, 0 mov cx, 10 Mov dx, logrule again: mov ax, xbx shr dx, 1 jc subtract add ax, ybx jmp resultSubtract: sub ax, ybx result: mov zbx, ax inc bx inc bx loop again ret start endp code ends end begin 注意此寻注意此寻址方式址方式 DELAY: PUSH AX PUSH DX MOV DX, 3FFH TIME1: MOV AX, 0FFFFH TIME2: DEC AX NOP JNE TIM

47、E2 DEC DX JNE TIME1 POP DX POP AX RET 在循环中,多种循环也是程序设计在循环中,多种循环也是程序设计中常用的结构之一,多重循环通常有多个中常用的结构之一,多重循环通常有多个循环变量。在多重循环中,各自的循环变循环变量。在多重循环中,各自的循环变量要明确,否则将导致循环体的混乱。以量要明确,否则将导致循环体的混乱。以两重循环为例,外层循环的循环次数为两重循环为例,外层循环的循环次数为N,内层循环次数为内层循环次数为M,则内层体被运行了,则内层体被运行了NM次。下面是一个用于延时的子程序。次。下面是一个用于延时的子程序。多重循环的程序设计多重循环的程序设计例例6

48、: 延时子程序延时子程序(不精确延时)(不精确延时) 输入输出设备以输入输出设备以ASC码表示字符、数字;码表示字符、数字; 在机器内部,以二进制(十六进制)表示在机器内部,以二进制(十六进制)表示 ; 我们习惯使用十进制数。我们习惯使用十进制数。 因此需进行数制的转换。因此需进行数制的转换。 例例1:将:将BX寄存器中的二进制数以十六进制的形式在显示器上显示寄存器中的二进制数以十六进制的形式在显示器上显示 出来。出来。 Dec ch Jnz rotate RetMain endpCode ends end beginBX1010 1100 0101 10010000 11111100 010

49、1 1001 10100000 1010Code segmentMain proc far assume cs:codeBegin: push ds xor ax, ax push ax mov ch, 4 mov cl, 4Rotate: rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl printf add al, 7hPrintf: mov ah, 2 mov dl, al int 21h例例2:从键盘输入十进制数从键盘输入十进制数 n( ASC表示表示 ),进行),进行 n+180 的运算后,在显的运算后,在显 示

50、器上输出(示器上输出(ASC )。)。提高题提高题 ASC码转换为码转换为BCD码码 BCD码转换为二进制数码转换为二进制数 用于计算用于计算 二进制数转换为二进制数转换为BCD码码 BCD码转换为码转换为ASC码码 Data segmentNbcd db 4 dup(?) ;保存键盘输入后转换的;保存键盘输入后转换的BCD码码Result db 5 dup(?) ;保存二进制计算后转换的;保存二进制计算后转换的BCD码码Data endsCode segment assume cs:code,ds:dataMain proc farBegin: push ds xor ax, ax push ax Mov ax, data Mov ds, ax Lea bx, Nbcd Mov cx, 4Again: Mov ah, 1 Int 21h Sub al, 30h Jl exit Cmp al, 9 Jg exit Mov bx, al Inc bx Loop again jmp nextExit: jmp exit1;DOS功能调用功能调用键盘输入,输入的字符在键盘输入,输入的字符在 al 寄存器中寄存器中 将输入的十进制将输入的十进制数的数的ASC码转换成码转换成BCD码码lea bx, Nbcd Mov ah,0Mov al, bxInc bxShl ax, 1 ;千位千

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论