收藏 分享(赏)

微机原理课件第04章.ppt

上传人:精品资料 文档编号:10527250 上传时间:2019-11-25 格式:PPT 页数:88 大小:517.50KB
下载 相关 举报
微机原理课件第04章.ppt_第1页
第1页 / 共88页
微机原理课件第04章.ppt_第2页
第2页 / 共88页
微机原理课件第04章.ppt_第3页
第3页 / 共88页
微机原理课件第04章.ppt_第4页
第4页 / 共88页
微机原理课件第04章.ppt_第5页
第5页 / 共88页
点击查看更多>>
资源描述

1、李宝平 计算机学院通信工程系 libaoping ,汇编语言程序设计,第 4 章,4.1 8086汇编语言程序格式4.1.1 汇编语言程序上机过程 4.1.2 汇编语言程序格式4.1.3汇编语言语句格式4.1.4 伪指令与伪操作,4.2 汇编语言程序设计 4.2.1 顺序程序设计4.2.2 分支程序设计4.2.3 循环程序设计4.2.4 子程序设计,汇编程序(翻译程序),源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。 高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编语言的

2、处理过程: (1)编写汇编语言源程序,生成扩展名为ASM的汇编源源文件。 (2)对汇编源程序进行编译,把ASM文件汇编成OBJ文件。 (3)用LINK程序对目标文件进行连接,生成EXE文件 。,4.1,8086汇编语言基础,1)效率低(与人们描述计算过程的需要差距大); 2)机器硬件的具体结构联系过于紧密在一种结构的机器上开发 的程序极难移植到另一种不同结构的机器上去。,4.1,8086汇编语言基础,汇编语言进行程序设计的优点,1)充分利用机器的硬件功能和结构特点,加快程序的执行速度, 减少目标程序所占用的存储空间; 2)用来编写实时控制程序、实时通信程序,有时也用来编制某些 系统软件程序。,

3、汇编语言进行程序设计缺点,4.1.2 汇编语言源程序格式,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由3个(或4个)逻辑段组成:数据段存放数据、变量(附加数据段存放数据、变量)堆栈段堆栈区域代码段存放程序指令,0000:03FF,环境与代码运行,FFFF:0,堆栈段,数据段,代码段,CS:IP,DS,SS:SP,系统起始运行程序,中断向量区 (系统专用),栈底,最多4个活动段,分段结构,ES,一个基本的汇编语言程序框架如下:stack SEGMENT PARA stackDB 100 DUP(stack)stack ENDSdata SEGMENTdata ENDScode SE

4、GMENTASSUME CS:code, DS:data, ES:data, SS:stackstart: MOV AX, dataMOV DS, AXMOV ES, AXMOV AL, 4CHINT 21Hcode ENDSEND start,堆栈段,数据段,代码段,真指令,汇编语言语句格式,在8086汇编中使用的语句可以分成2种类型,这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。,伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应

5、如何汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。,4.1.1,注意: 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。,汇编语言源程序中的语句可以由四项组成,格式如下:名字 操作码 操作数 ;注释,汇编语言语句格式,4.1.1,(2)操作码可以是指令、伪指令或宏指令的助记符。 (3)操作数字段是操作符的操作对象。 (4)注释字段是以“;”开头的说明部分,可以用英文或者中文书写。,1.汇编语言格式,(1)名字项是程序设计人员自己定义的符号, 用于代表内存单元的地址,表示本条语句的符号地址。一般来说,名字可以是标号和变量,统称为标识符。,

6、指令性语句的格式为:标号: 指令助记符 目的操作数,源操作数 ; 注释指示性语句的格式为:名字 伪指令 操作数1, 操作数2, ,操作数n ; 注释,汇编语言的一个实例: hello.asm(例022)stack SEGMENT para stack stackdw 100 dup(0)stack endsdata SEGMENT Hello DB Hello, world!,0DH,0AH,$ data ENDS prog SEGMENTASSUME CS:prog,DS:data,SS:stack start: MOV AX,dataMOV DS,AXLEA DX,hello ;取字符串首

7、地址MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21H ;退回DOS prog ENDSEND start,名字,标号,1. 名字,标号指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。 变量段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。,操作码可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译成机器语言指令。 对于伪操作,汇编程序根据其功能进行处理。对于宏指令,则将根据其定义展开,转换成对应的代码。,2. 操作码,操作数的形式 :常量、标号/名字、变量及表达式。 1.常

8、量 二进制数,以B结尾。如01001101B。 十进制数,如85。 十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。 字符串:用引号括起来的1个或多个字符。如ERROR!, a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H, 61H。,3. 操作数,变量即内存中的存储单元或数据区。变量名是存储单元(数据区)的符号地址或 名字。 变量也有三个属性: 段地址变量所在段的段地址 偏移量变量单元地址与段首地址之间的位移量。类 型有BYTE、WORD 、DWORD三种之一。 变量在程序中作为存储器操作数被引用。,3.变量,如 Start : MO

9、V AX, data,PTR,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。 有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。 表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。,如 Start : MOV AX, 16*8+TABLE,用于数字表达式, 例:MOV AX,4*1024汇编后的形式为:MOV AX,4096 用于地址表达式, 例:LEA SI,TAB+3若TAB的偏移地址为1000H,则汇编后的形式为:LEA SI,1003H,1)算术运算符 +、-、*、/,MOD,逻辑运算符只能用于数字表达式

10、中。例: MOV CL,36H AND 0FH经汇编后:MOV CL,06H注意: 不要把逻辑运算符与逻辑运算指令混淆:例:AND AX, 3FC0H AND 0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。,2)逻辑运算符 AND、OR、XOR、NOT 移位运算符SHL、SHR,关系运算的结果是一个逻辑值:真或假关系为真,结果为全1关系为假,结果为全0例: MOV BX, PORT GT 300H若PORT的值大于300H为真,则汇编后为:MOV BX, 0FFFFH若为假,则汇编后为:MOV BX, 0,3)关系运算符EQ、NE、LT、GT、

11、LE、GE,取地址运算符SEG、OFFSET SEG: 取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 例:VAR DB 12HMOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG VAR ;取变量VAR的段地址注意: 下面两条指令的异同:MOV BX, OFFSET VARLEA BX, VAROFFSET只能取静态的偏移地址;LEA指令即可取静态的偏移地址,也可取动态的偏移地址。,4)数值回送操作符,TYPE 取变量的类型(1,2,4) LENGTH 取所定义变量的长度(即变量中元素的个数) SIZE 取所定义存储区的字节数(=TYPE * LEN

12、GTH) 例:VAR DW 1,2,3,4,5 则 TYPE VAR = 2LENGTH VAR = 5SIZE VAR = 10,取值运算符TYPE、LENGTH、SIZE,5)属性操作符,PTR,SHORT,THIS,HIGH,LOW,HIGHWORD,LOWWORD PTR 用来指定地址操作数的类型。 格式: PTR 类型BYTE, WORD, DWORD和 NEAR, FAR ,SHORT BYTE、WORD、DWORD用于描述数据存储单元(变量)地址 NEAR、FAR (SHORT ?)用于描述转移、调用的目的地址,例:MOV BYTE PTRDI,0 ;字节类型MOV WORD P

13、TRDI,0 ;字类型MOV DI,0B5H ;类型不定PTR也可用来进行强制类型转换 例:STR1 DW ? ;STR1定义为字类型 MOV AX,STR1 ;合法MOV AL,STR1 ;非法 MOV AL,BYTE PTR STR1 ;合法,SHORT: 用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的-128+127个字节范围之内。 THIS: 格式为: THIS attribute 或 type 它可以象PTR一样建立一个指定类型(BYTE、WORD或DWORD)的或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。 例

14、如:FIRST_TYPE EQU THIS BYTEWORD_TABLE DW 100 DUP(?),此时FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字节类型的,而WORD_TABLE则是字类型的。,又如: START EQU THIS FARMOV CX,l00 MOV指令有一个FAR属性的地址START,这就允许其它段的JMP指令直接跳转到START来。 HIGH和LOW; HIGHWORD 和LOWWORD称为字节分离操作符字节。它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。CONST EQU 0ABCDHMOV AH, HIGH CONS

15、T 则汇编完成 MOV AH, 0ABH,6)注释项,注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。但是,对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序易于被读懂,因此,编制程序必须写好注释。,四、 伪指令与伪操作,数据定义 伪指令 符号定义 伪指令 段定义和段寄存器指定伪指令 过程定义 伪指令 结束 伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:,名字 伪指令 操作数1, 操作数2, ,操作数n ; 注释,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于C语言中的#define。符号定义伪指令有两种:EQU

16、=,用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。 用”=”定义的符号可在任何时候进行重定义。 二者均不占用存储空间,仅是给符号赋值,(1)定义常量的伪指令,例:FIVE EQU 5COUNT EQU CXTEN EQU 10DIST = BYTE PTRSI+BPGOTO = JMP MOV AX, TENMOV CX, COUNTADD DIST, FIVEDIST = WORD PTRSI+BP+1ADD DIST, AXGOTO LABEL,定义,引用,(2)数据定义伪指令,用于定义变量,即内存单元或数据区。数据定义伪指令的格式为: 变量名 数据定义伪指

17、令 操作数,操作数, 常用的数据定义伪指令有如下几种:DB 定义字节DW 定义字DD 定义双字 操作数可以是常数、变量或表达式,例1: DATA_B DB 10,5,10H DATA_W DW 100H,-4 DATA_D DD 0FFFBH汇编后的内存分配情况 如右图所示。,05H,10H,00H,01H,FCH,FFH,FBH,FFH,00H,00H,0AH,DATA_B,DATA_W,DATA_D,10,5,10H,100H,-4,0FFFBH,例2:操作数可以是字符串,例如STR DB HELLO汇编后的情况如图:,STR,H,E,L,L,O,注意:下面两个定义的不同之处: DB AB

18、 ;41H在低字节,42H在高字节(先A后B) DW AB ;42H在低字节,41H在高字节(先B后A),48H,45H,4CH,4CH,4FH,操作数?用来保留存储空间,但不存入数据. 例3:ABC DB 0,1,2,3,4,OK,$RSV DW ?,?,?,?,?,?,?,?复制操作符DUP:重复的数据可以使用复制操作符DUP,如上面RSV亦可写成:RSV DW 8 DUP(?)ARRAY DB 2 DUP(0,1,2,?)若操作数中若使用$,则表示的是地址计数器的当前值。,例4: TABLE DB 10 DUP(?)BUFFER DW TABLE,$+3 设TABLE的偏移地址为0080

19、H,则汇编后如下图所示:,BUFFER,0080H,80H,TABLE,008AH 008BH 008CH 008DH,. . .,8DH,00H,00H,0089H,10 Bytes,$,$+3,(3)定义程序开始和结束的伪指令,在源程序开始处可以用NAME或TITLE为模块取名字。 NAME NAME module_name汇编程序将以给出的“模块名”作为模块的名字。 TITLETITLE textTITLE伪指令可指定每一页上打印的标题。同时,若程序中没有NAME伪指令,则汇编程序将用text 中的前6个字符作为模块名。text最多可有60个字符。 若程序中既无NAME又无TITLE伪指

20、令,则将用源程序名作为模块名。所以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出标题来。,汇编结束伪指令,END的使用END 第一条指令的标号或主过程名 作用:表示汇编到此结束 位于源程序的最后一行。END之后的语句不会被汇编程序翻译,(4)指令集选择伪指令,汇编语言选择指令系统8086;选择8086指令系统286;选择80286指令系统286P ;选择保护方式下的80286指令系统,(5)地址计数器与对准伪操作,地址计数器$把它称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。在程序中,“$”出现在表达式里,它的值为程序下一个所能分配

21、的存储单元的偏移地址。,SORTD SEGMENTARRAY DB 25,46,3,75,5COUNT EQU $ - ARRAYSORTD ENDSARRAY的偏移地址值为0000H$ 的偏移地址值为0005HCOUNT = 0005H 0000H = 5,ARRAY,0000H,0005H,$,地址对准器伪指令ORG,下一个地址变量的偏移地址值由ORG确定DATA SEGMENT ORG 2VAR1 DB 2,3,4 ORG $ + 3 VAR2 DW 1234H DATA ENDS,VAR1,$ + 3 VAR2,0002H,0008H,$,ORG是起始位置设定伪指令,用来指出源程序或数

22、据块的起点。利用ORG伪指令可以改变位置计数器的值。,EVEN伪操作使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到此目的。例如: DATA_SEG SEGMENT EVEN WORD_ARRAY DW 100 DUP(?) DATA_SEG ENDS,对准伪指令,(七)过程定义伪指令,PROC FAR 、ENDP 远过程定义伪指令 PROC NEAR、ENDP 近过程定义伪指令,过程名 PROC FAR(NEAR)过程指令集合RET 过程名 ENDP 注:过程定义必须在代码段内PROC FAR 为定义远过程PROC

23、 NEAR 为定义近过程,(八) 段定义伪指令,汇编语言程序是按段来组织程序和数据的。和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。 3/4类段:代码(程序)、数据/附加数据、堆栈 段定义伪指令:SEGMENT、ENDS、ASSUME、ORG 定义一个段的基本格式:段名 SEGMENT 定位类型组合方式类别段名 ENDS,这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。 如: data SEGMENTdata ENDS,SEGMEN

24、T和ENDS伪指令,ASSUME伪指令,在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句来指定。如ASSUME CS:code,DS:data,ES:data,SS:stack语句中的code和data为段名。这个语句说明:(1) CS将指向名字为code的代码段(2) DS和ES将指向名字为data的数据段(3) SS将指向名字为stack的堆栈段,注意: ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句MOV AX,dataMOV DS,AXMOV ES,AXMOV AX,stackMOV SS,AX将段基址装入段寄存器。

25、如果程序中用到堆栈段,则SS也需装入实际的初值。代码段基地址不需要程序员装入CS寄存器,而由操作系统(OS)负责装入。,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。它的格式为:,1) 定位类型说明如何确定逻辑段的边界。有4种: PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0H。默认类型 BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。 WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。 PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应

26、为00H。,也即:PAGE(页边界) - 能被256除;PARA(段边界) -能被16除; WORD(字边界) - (能被2除);BYTE (字节边界),段名 SEGMENT 定位类型 组合类型 类别,2) 组合类型说明程序连接时的段合并方式,共6种: PRIVATE :该段为私有段,连接时将不与其它模块中的同名段合并 PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。 COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。 AT : 按绝对地址定位,段地址就是表达式的值。 STACK : 专用于说明堆栈段,组合方式同P

27、UBLIC MEMORY :置于地址最高处,多个时取第一个,其余作为COMMON,3) 类别用单引号 括起来的字符串。所有同类别的段被安排在连续的存储区域中。如:在模块1中有段定义:seg1 SEGMENT PARA STACK stackseg1 ENDS在模块2中有段定义:seg2 SEGMENT PARA STACK stackseg2 ENDS 则连接时这两个段被安排在一起。,1-定义问题,分析问题2-建立数学模型,确定算法3-画出程序框图(流程图) 4-分配内存工作单元和寄存器5-根据框图,编写源程序6-上机运行、调试程序。将源程序存成.ASM文件;对源程序汇编,生成.OBJ目标文件

28、;把.OBJ文件连接成.EXE执行文件。,4.2 汇编语言程序设计,汇编语言上机过程:,Y,Y,Y,N,N,N,有错 ?,有错 ?,有错 ?,结束,汇 编,输入(修改)源程序,连 接,运 行,查 错,开始,用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件,用MASM宏汇编程序进行汇编。 汇编后生成.OBJ目标文件。 命令格式:MASM ;,用LINK连接程序进行连接。 连接后生成.EXE可执行文件。 命令格式:LINK ;,用TD、DEBUG等调试程序进行调试。 命令格式:TD ,程序设计是把解决实际问题的方法转化为程序。由于实际问题有简单与复杂之分,因此程序设计就需要根据解

29、决问题的思路,运用一些基本的程序设计方法设计出解决不同问题的程序来。在汇编程序设计过程中,首先对要解决的问题的过程进行具体的描述,这也是编程的准备阶段,对于较小的程序可以使用程序流程图。对于较大的程序可以采用模块化程序设计方法。无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来。基本的程序结构包括顺序结构、分支结构、循环结构及子程序结构。由于不同的问题可采用不同结构设计,因此需要对各种结构形式有所了解,才能找到解决某一问题的最佳程序结构形式。 ,顺序结构是一种最简单的程序设计结构形式。采用这种结构只能完成简单的任务程序设计。顺序结构在任何结构的程序中都会出现,因此说它是

30、基础。下面举一个顺序结构的程序设计例子,要求完成表达式所规定的操作: Y=X1+X2+X3。首先分析程序设计方法: 表达式Y=X1+X2+X3的计算过程可采用顺序执行的方法来完成: 首先读入数据X1、X2、X3;其次计算X1、 X2、 X3的和;最后保存结果到指定变量Y中。 根据计算步骤编写汇编语言程序:利用伪指令确定存储器的分配,将X1、X2、X3定义为字变量;按照汇编语言源程序结构要求编写源程序。,顺序程序设计,程序如下: (例006) stack segment para stackdw 64h dup(?) stack ends data1 segmentX dw 5Y dw 6Z d

31、w 7W dw ? data1 endscode segmentassume cs:code,ss:stack,ds:data1start: mov ax,data1mov ds,axmov ax,Xadd ax,Yadc ax,Zmov W,axmov ax, 4c00h int 21hcode endsend start,顺序程序设计,可以看出,上面的源程序是由数据段和代码段两部分组成的。在数据段定义了X、Y、Z为自变量,在运行时应填入具体数值。代码段确定了各段与段寄存器的关系,并且以计算机的基本操作指令按顺序执行的结构形式将计算机操作过程进行描述,从而完成程序设计的最初阶段任务。一个源程

32、序的编写过程还说明不了程序的正确性,必须经过上机调试,才能验证设计的程序是否符合要求。,顺序程序设计,顺序程序设计,用查表法求Z=X3 定义数据段DATA SEGMENT TABLE DB 0, 1, 8, 27, 64, 125, 216 XVAL DB 6 YVAL DB ? DATA ENDS,TABLE,定义堆栈段 STACK SEGMENTDB 100 DUP ( ?)STACK ENDS,顺序程序设计,定义代码段 CODE SEGMENTASSUME CS:CODE, DS:DATA ,SS:STACK START PROC FARPUSH DSMOV AX, 0PUSH AXMO

33、V AX, DATAMOV DS, AXLEA BX, TABLEMOV AL, XVALXLATMOV YVAL, ALRET START ENDP CODE ENDSEND START,循环结构程序设计针对的是处理一些重复进行的过程的操作。采用循环结构设计的程序,其长度缩短了,不仅节省了内存,也使得程序的可读性大大提高。使用循环结构形式设计程序时, 通常将循环程序划分三个部分: 循环的初始化部分:主要为循环所需的变量赋初值。 循环体:程序所要完成的主要工作部分,这一部分的内容是由所要处理的问题来确定的,这一部分的执行结果可能影响到循环是否继续进行。 循环控制部分:这一部分主要是以条件表达式

34、的结果作为是否结束循环的条件。在事先知道了循环次数的情况下,可采用循环计数控制循环的结束;在事先不知道循环次数的情况下,多采用结果及给定特征作为条件来控制循环的结束。 下图 可以帮助我们很好地理解循环结构程序。,循环程序设计,图 循环程序结构 (a) 单循环结构; (b) 双循环结构,在编写程序之前要对解决的问题进行分析: 首先确定程序采用循环结构完成数据搬家操作。 定义数据单元。 按顺序将源数据逐一搬家(该步骤要求修改源数据地址、目的数据地址及搬家次数)。 搬家程序的控制是以变化的数据个数作为条件。,循环程序设计,下面举例说明这类指令的功能及应用。要求将偏移地址为1000H开始存放的100个

35、字节的数据传送到偏移地址为1500H开始的连续内存区。假设它们的段地址存放在DS中,段地址为2000H。,程序如下: MOV AX, 2000HMOV DS, AXMOV SI, 1000HMOV DI, 1500HMOV CX, 100 LOOP: MOV AL, SIMOV DI, ALINC SI INC DIDEC CXJNZ LOOPHLT,根据循环程序的嵌套层数不同,可以将循环程序的结构分成单循环、双循环和多重循环。,要求将内存中以AREAY1为首地址的100个字节数据搬移到以AREAY2为首地址的内存中去。 程序如下: MOV SI, OFFSET AREAY1MOV DI,OF

36、FSET AREAY2MOV CX, 100 AGAIN: MOV AL, SIMOV DI, ALINC SI INC DIDEC CXJNZ AGAINHLT,将100个字符的字符串从内存的BUFFER1搬移到内存的BUFFER2中去。 程序如下:MOV SI , OFFSET BUFFER1MOV DI, OFFFET BUFFER2MOV CX, 100CLDREPE MOVS BUFFER1,BUFFER2注意:上述程序中的BUFFER1应处于DS段中,而BUFFER2应处于ES段中,循环程序设计,计算,和清0 AX 计数初值100 CX,(AX) = (AX) + (CX),(CX

37、) = (CX) - 1,(CX) = 0,SUM = (AX),Y,N,流程图,循环程序设计,;数据段定义 DATA SEGMENTSUM DW ? DATA ENDS;堆栈段定义 STACK SEGMENT PARA STACKDW 100 DUP(?) STACK ENDS ;代码段定义 CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS:STACK MAIN: MOV AX,DATAMOV DS,AX ; 主程序定义法MOV AX,0 ; 和清零,循环程序设计,MOV CX,100 ; 赋计数初值 AGAIN: ADD AX, CX ; 累加DEC C

38、X ; 计数器减 1JNZ AGAIN ; CX 不为零循环MOV SUM,AXMOV AH, 4CH ;DOS 中断号送 AH INT 21H ; INT 21H 返回 CODE ENDS ; 结束代码段END MAIN ; 结束汇编,七段共阴LED数码管显示,七段共阴LED数码管显示,数据段定义 DATA SEGMENT VAL DB 47531 ;待显示的数值,带小数点 DISP EQU 6000H ;第一个数的显示端口地址 TAB DB 0FCH,60H,0DAH,0F2H,66H;04DB 0B6H,03EH,0E0H,0FEH,0E6H;59 TAB1 DB 0FDH,61H,0D

39、BH,0F3H,67H;0.4.DB 0B7H,03FH,0E1H,0FFH,0E7H;5.9. DATA ENDS,七段共阴LED数码管显示,堆栈段定义 STACK SEGMENT PARA STACK STACKDW 80 DUP(?) STACK ENDS 代码段定义 CODE SEGMENT ASSUME CS:CDOE,SS:STACK,DS:DATA STAB:MOV AX,DATAMOV DS,AX ;标准写法LEA SI,VAL ;SI指向测试结果首址CLD ;DF = 0,自动增量LODS BYTE PTR VAL ;取第一个数至AL中AND AL,0FH ;转换成十进制数,

40、七段共阴LED数码管显示,LEA BX,TAB ;表首址TAB XLAT TAB ;查表 MOV DX,DISP ;DX为显示端口地址 OUT DX,AL ;第一个端口 INC DX ;下一个端口地址 LODS BYTE PTR VAL ;取带小数点的第二个数 AND AL,0FH LEA BX,TAB1 ;指向TAB1 XLAT TAB1 OUT DX,AL ;至第二个端口 INC DX INC SI ;小数点已送显,七段共阴LED数码管显示,MOV CX,3 ;余下3个数未转换LEA BX,TAB ;不带小数点 AGN:LODS BYTE PTR VALAND AL,0FHXLAT TAB

41、OUT DX,ALINC DXLOOP AGNMOV AH,4CH ;完毕,返回DOSINT 21H CODE ENDSEND STAB,在解决某些实际问题时,解决问题的方法随着某些条件的不同而不同,将这种在不同条件下处理过程的操作编写出的程序称为分支程序。程序中所产生的分支是由条件转移指令来完成的。汇编语言提供了多种条件转移指令,可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段,对问题进行处理。采用分支结构设计的程序,结构清晰、 易于阅读及调试。下面是一个采用分支结构设计的程序例子,要求从键盘上输入字符,若为AZ,则将其转换为对应的ASCII码并显示;若为0,则结束输入。,条件程

42、序设计(分支结构程序设计),首先使用程序流程图将解决问题的思路描述出来,如图所示。 程序如下: abc1: MOV AH, 01H; 置键盘输入并回显INT 21H ;系统功能调用CMP AL, 0 ; 输入字符与0比较JE abc2 ; 为零结束 CMP AL, A ; 判断是否小于大写字母AJL abc1 ; 小于大写字母A返回重新输入 CMP AL, Z ; 判断是否大于大写字母ZJG abc1 ; 大于大写字母Z返回重新输入MOV DL, AL ; 将AL内容送DL,作为输入参数MOV AH, 02 ; 置显示输出INT 21H ; 将AZ的字符从显示器输出abc2:MOV AH, 4

43、CH ; 带返回码结束INT 21HINT 21H ,条件程序设计,在汇编语言程序设计中,常常要使用多分支结构。多分支结构相当于一个多路开关,在程序设计中通常是根据某寄存器或某单元的内容进行程序转移。 在设计多分支转移程序时,如果分支太多,则平均转移速度太慢。如果用转移地址表实现多分支转移,则可以提高平均转移速度。多分支结构如图 所示。 ,条件程序设计,条件程序设计,实现表达式,波形图,条件程序设计,流程图,条件程序设计,数据段定义DATA SEGMENTX DB -3Y DB ?DATA ENDS堆栈段定义 STACK SEGMENT PARA STACKDW 100 DUP(?) STAC

44、K ENDS 代码段定义CODE SEGMENTASSUME CS:CODE; DS:DATAMAIN PROC NEARPUSH DSXOR AX, AXPUSH AXMOV AX, DATAMOV DS, AX ; 标准写法,条件程序设计,MOV AL, XCMP AL, 0JGE BIGER ; X 大于等于 0 转 BIGERMOV AL, 0FFH ; -1的补码为FFHMOV Y, AL ; Y = -1JMP NEXT BIGER: JE EQUL ; X 等于 0 转 EQULMOV AL, 1MOV Y, AL ; Y = 1JMP NEXTEQUL: MOV Y, AL ;

45、 Y = 0NEXT: RETMAIN ENDP ; 结束过程CODE ENDS ; 结束代码段END MAIN ; 结束汇编,子程序设计,子程序的概念 如果在一个程序中的多个地方、或多个程序中的多个地方用到了同一段程序,那么可以将这段程序抽取出来,存放在某一存储区域,每当需要执行这段程序时,就调用指令转到这段程序去,执行完毕,再返回原来的程序。把抽取出来的这段程序叫做子程序或过程,调用它的程序称为主程序或调用程序 子程序允许嵌套和递归,子程序的调用过程 记录断点:为了返回到调用程序的合适地方,转子调用必须保留返回调用程序的下一条指令的地址(返回地址)-又叫断点 保护现场:保存有关寄存器的内容

46、,子程序返回主程序之前,恢复这些寄存器的内容 参数传递的方法 通过寄存器传递参数:最常用的方法,适合于参数较少的情况 通过参数表传递:适合参数较多的情况 用堆栈传递:适合参数较多,且子程序有嵌套、递归的情况,子程序设计 调用指令 格式:CALL 目的地址 功能: 段内直接近调用 PUSH (IP) (IP)(IP)+16位的二进制数 段内间接近调用 PUSH (IP) (IP) (EA),段间直接远调用 PUSH (CS) PUSH (IP) (IP) 目标地址中指定的偏移地址 (CS) 目标地址指定的段地址 段间间接远调用 PUSH (CS) PUSH (IP) (IP) (EA) (CS)

47、 (EA + 2),返回指令 RET 段内近返回 (IP) POP () 段间远返回 (IP) POP() (CS) POP(),如何进行子程序的设计与连接 适合编成子程序的程序 一段程序在整个任务中被多次使用 一段程序在多个任务中被多次使用 子程序的特点 节省存储空间 增大了时间开销,子程序的组成 BTOD PROC FAR ( NEAR )RET BTOD ENDP,子程序的参数传送 如过程和调用程序在同一源文件中,则过程可直接访问模块中的变量 通过寄存器传送 通过参数表传送 通过对栈传送,例:主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组中的所有元素,把和

48、(不考虑溢出)送到指定的存储单元中去(例018),SSEG SEGMENT PARA STACK stackdw 100h dup(0) SSEG ENDS DSEG SEGMENT ary dw 1,2,3,4,5,6,7,8 count dw 8 sum dw ? DSEG ENDS CSEG SEGMENT assume cs:CSEG, ds:DSEG, es:ESEG, ss:SSEG MAIN PROC FAR mov ax, dsegmov ds, axmov ax,esegmov es, axxor ax, axcall near ptr proaddmov ax, 4c00h int 21h,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报