第7章 汇编语言程序设计 (版本)_第1页
第7章 汇编语言程序设计 (版本)_第2页
第7章 汇编语言程序设计 (版本)_第3页
第7章 汇编语言程序设计 (版本)_第4页
第7章 汇编语言程序设计 (版本)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、2022-4-121/41第7章 汇编语言程序设计7.1程序设计步骤程序设计步骤7.2简单程序简单程序7.3分支程序分支程序7.4循环程序循环程序7.5子程序子程序习题习题7.1 程序设计步骤2022-4-122/41 汇编语言程序设计步骤:汇编语言程序设计步骤: (1)(1)分析问题分析问题:已知条件、要解决的问题、功能:已知条件、要解决的问题、功能/ /性能要求等。性能要求等。 (2)(2)建立数学模型建立数学模型:把问题数学化、公式化,便于计算机处理。:把问题数学化、公式化,便于计算机处理。 (3)(3)确定算法确定算法:简单、速度快、精度高、代码量小、编程容易。:简单、速度快、精度高、

2、代码量小、编程容易。 (4)(4)绘制程序流程图绘制程序流程图:用箭头、框图、菱形图等表示程序结构。:用箭头、框图、菱形图等表示程序结构。 (5)(5)内存空间分配:为程序或数据分配内存空间内存空间分配:为程序或数据分配内存空间。 (6)(6)编制程序与静态检查编制程序与静态检查:程序结构层次简单、清楚、易懂。:程序结构层次简单、清楚、易懂。 (7)(7)程序调试程序调试:利用调试软件:利用调试软件DEBUGDEBUG进行调试。进行调试。2022-4-123/41汇编语言程序设计的特点:汇编语言程序设计的特点: (1)(1)算法要分解至算法要分解至指令级指令级;高级语言为;高级语言为语句级语句

3、级。 (2)(2)要详细考虑要详细考虑内存空间分配内存空间分配问题:问题: 任何一个变量、一条指令都要明确其存储位置任何一个变量、一条指令都要明确其存储位置7.2 简单程序 这种程序的形式最简单,计算机执行程序的方式是这种程序的形式最简单,计算机执行程序的方式是“从头到从头到尾尾”, ,逐条执行指令语句,直到程序结束。逐条执行指令语句,直到程序结束。 这类简单程序不用这类简单程序不用按上述按上述7 7个步骤,可直接对给出的题目写出助记符程序清单。个步骤,可直接对给出的题目写出助记符程序清单。 【例7.1】用数据运算指令,对两个16位数做加法运算。这两个数从地址10050H开始连续存放,低位在小

4、地址一端,结果放在这两个数之后。 (1) 分析题目:它是一个16位数相加的问题。在用加法指令时,必须要考虑低8位和低8位相加后产生的进位问题。2022-4-124/412022-4-125/41(2) 根据86系列指令系统,可以直接对累加器AX做字操作,但在低位相加后,会影响标志寄存器的进位CF, 所以,要用带进位的加法指令。(3) 绘制程序流程图,如右图所示。简单程序框图简单程序框图(双字节相加双字节相加)2022-4-126/41(4) 内存空间分配:被加数、加数及和在内存的空间分配见下表内存地址内存地址内内 容容10050H被加数低被加数低8位位10051H被加数高被加数高8位位1005

5、2H加数低加数低8位位10053H加数高加数高8位位10054H和的低和的低8位位10055H和的高和的高8位位双字节相加时的内存分配双字节相加时的内存分配2022-4-127/4150H51H52H53H54H55H12H34HA1HBDHAX 00H 10H50H51H52H53H54H55HAX 12H 34HAX B3H F1HDIA1HBDH+=内存地址内存地址存储内容存储内容MOV AX,1000HMOV DS,AX MOV SI,50H MOV DI,52H MOV BX,54HSIDIBX50H51H52H53H54H55H12H34HA1HBDHB3HF1HBX B3H F1

6、H低位在前,高位在后低位在前,高位在后CLC XOR AX,AX MOV AX,SI ADC AX,DI MOV BX,AX HLT设设SI=3412H DI=BDA1H内存分配示意内存分配示意程序详细注释见下页程序详细注释见下页 2022-4-128/41(5) 编制的程序如下:MOVMOVAXAX,1000H1000HMOVMOVDSDS,AXAX ; DSDS1000H1000HMOVMOVSISI,50H50H ; 被加数指针被加数指针SISI50H50HMOVMOVDIDI,52H52H ; 加数指针加数指针DIDI52H52HMOVMOVBXBX,54H54H ; 和的指针和的指针

7、BXBX54H54HCLCCLC ; 清清CFCFXORXORAXAX,AXAX ; 清清AX AX 异或异或MOVMOVAXAX,SISI ; 取一个字到取一个字到AXAXADCADCAXAX,DIDI ; AXAX+AXAX+DIDI+CF+CFMOVMOVBXBX,AXAX ; 存一个字到存一个字到BXBXHLTHLT ; 暂停暂停 问题:该程序能否简化?如何简化?问题:该程序能否简化?如何简化?2022-4-129/41 简化的程序:简化的程序:MOVAX,1000HMOVDS,AX ; DS1000HMOVAX,50H ; 取被加数到取被加数到AXADCAX,52H ; AX被加数被

8、加数+加数加数MOV54H,AX ; 存和数到存和数到54HHLT ; 暂停暂停2022-4-1210/41 【例7.2】将内存(10050)单元的内容(7AH)拆成两段,每段4位,并将它们分别存入内存(10051)和(10052)单元。即(10050)单元中的低4位放入(10051)的低4位,(10050)单元中的高4位放入(10052)的低4位,而(10051)和(10052)的高4位均为零。 (1) 分析题目:这个题目提出的任务在十六进制显示及二、十进制计算中常遇到的. 现在假设内存(10050)中放着7AH,则题目要求就是把7AH拆成07H和0AH两部分,并把0AH放在(10051)单

9、元,07H放在(10052)单元。2022-4-1211/41 在拆字时,想取得一个数的前4位和后4位可以用移位指令的方法,也可以用逻辑“与”一个0F0H(二进制为11110000)和逻辑“与”一个0FH(二进制为00001111)的办法。 (2) 根据指令系统中含有的指令,先取出该数用逻辑指令与上一个 0FH,得到低4位,存入内存。再取出该数用移位指令逻辑右移SHR4次,取得高4位,存入内存即可。2022-4-1212/41(3) 绘制程序流程图,如图所示。(4) 内存空间分配:把7AH拆成07H和0AH两部分,它们在内存空间的分配情况见下页表。拆拆字字程程序序框框图图2022-4-1213

10、/41内存分配示意图内存分配示意图10050H7AH7HAH0H10051H0H10052H拆开拆开AH7AHAH7AHAH7AHAH7H内存地址内存地址内容内容10050H7AH10051H0AH10052H07H拆字程序的内存分配拆字程序的内存分配2022-4-1214/41(5)编制的程序如下:MOV AX,1000HMOV AX,1000HMOV DS,AX MOV DS,AX ;DS=1000HDS=1000HMOV SI,50H MOV SI,50H ;需拆字节的指针;需拆字节的指针SI=50HSI=50HMOV AL,SI MOV AL,SI ;取一个字节到;取一个字节到ALAL

11、中中AND AL,0FH AND AL,0FH ;把;把ALAL的前的前4 4位清位清0 0MOV SI+1,AL MOV SI+1,AL ;把得到的后;把得到的后4 4位放到位放到(10051)(10051)单元单元MOV AL,SI MOV AL,SI ;再取出需拆字节放到;再取出需拆字节放到ALAL中中MOV CL,4 MOV CL,4 SHR AL,CL SHR AL,CL ;逻辑右移四次,前;逻辑右移四次,前4 4位补位补0 0MOV SI+2,AL MOV SI+2,AL ;放入;放入(10052)(10052)单元单元2022-4-1215/41编程计算编程计算 1+2+3+4。

12、 MOV AX ,0 ADD AX ,1 ADD AX ,2 ADD AX ,3 ADD AX ,4初始化初始化: AX 0开始开始 AX AX+1 AX AX+2结束结束 AX AX+3 AX AX+4分析分析:需要有一个暂存空间存放累加和,需要有一个暂存空间存放累加和,初值设置为初值设置为0,之后依次累加。,之后依次累加。2022-4-1216/41练习:练习: 将数据1A2BH,1200H,339AH,1200H分别存入相邻的内存单元中,然后将前三个数相加并减去第四个数,最后将结果传递到相近的内存单元中。7.3 分支程序2022-4-1217/41 分支程序是利用分支程序是利用条件转移指

13、令条件转移指令实现实现程序执行次序改变程序执行次序改变的一种程的一种程序结构形式,即当程序执行到某一指令后,根据某个条件是否序结构形式,即当程序执行到某一指令后,根据某个条件是否满足,分别执行不同的指令序列满足,分别执行不同的指令序列。 一般来说,分支程序经常是先用一般来说,分支程序经常是先用比较指令比较指令或或数据操作数据操作及及位检测位检测指令指令等来等来改变改变标志寄存器各个标志寄存器各个标志位标志位。然后用条件转移指令进。然后用条件转移指令进行分支。行分支。 分支程序执行完后可以立即结束,也可以转到公共点结束。分支程序执行完后可以立即结束,也可以转到公共点结束。 分支程序可以分支程序可

14、以再分支再分支。 程序框图:在绘制程序流程图时,需用菱形判断框程序框图:在绘制程序流程图时,需用菱形判断框, ,表示判定条表示判定条件。在绘制好流程图编写助记符程序时,建议先按上下流程线件。在绘制好流程图编写助记符程序时,建议先按上下流程线写写, ,写完上下流程线上的各框环节后,再写分支部分里的框框。写完上下流程线上的各框环节后,再写分支部分里的框框。2022-4-1218/41 【例7.3】求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。 (1) 分析题目:此题目中,AX累加器和BX寄存器中的数是不知道的。对两个不知大小的数相减并求绝对值,显然应该先解决哪

15、一个值稍大些,然后再用大数减小数的方法,才可求得绝对值。2022-4-1219/41(2) 根据指令系统中的比较指令,编出判断大小的环节,即可解决问题,下图即为该例题的程序流程图。求求绝绝对对值值程程序序流流程程图图JC=Jump if Carry 当运算产生进位标志时,即CF=1时,跳转到目标程序处。(3) 根据流程图编制程序如下:CLC ; 清除CFSUBAX,BXJCAA ; CF转AA去执行(即AXBX时转移MOVDI,2800H ; 结果指针DI2800HMOVDI,AX ; 结果送到2800H和2801H单元HLT ; 暂停AA:SUB BX,AX ; BXBX-AXMOVDI,2

16、800HMOVDI,BXHLTSUB BX, AX2022-4-1220/41 问题问题: 这段程序有无错误?这段程序有无错误? 如果有错,如何改正?如果有错,如何改正?CMPAX,BXSUBAX,BX2022-4-1221/41 【例7.4】 编一个程序,从外设71H号中取一个数M,判断其值是否在10和20之间,即10M20。如果M20H,则送0FFH给外设73H;如果M10,则送00H给外设73H;如果10M20,则送88H给外设73H。 (1) 分析题目:根据题意,这是一个需要两次判断M大小的问题。先判M是否大于10,再判M是否大于20。2022-4-1222/41(2) 根据解决问题的

17、思路,先画出程序流程图,如图。 从图的程序流程图看,两个分支都要“回归”原程序。判断判断M的两分支流程图的两分支流程图2022-4-1223/41 (3) 编制的程序如下:STARTSTART:ININALAL,71H71H ; 将将71H71H端口的字节读入端口的字节读入ALALCLCCLC ; 清除清除CFCFCMPCMP ALAL, 1010; 将将ALAL的内容和的内容和1010相比较相比较JCJCLP1LP1 ; 小于小于1010转转LP1LP1CMPCMP ALAL, 2020 ; 将将ALAL的内容和的内容和2020相比较相比较JCJCLP2LP2 ; 10AL10AL2020转

18、转LP2LP2MOV MOV BL BL , 0FFH0FFH; 将将0FFH0FFH送入送入BLBL寄存器寄存器LP3LP3:OUTOUT73H73H,BLBL ; 将将0FFH0FFH输出到输出到73H73H端口端口HLTHLT ; 暂停暂停LP1LP1: MOV MOV BLBL, 0000 JMPJMPLP3LP3LP2LP2: MOV MOV BLBL, 88H88H JMPJMPLP3LP3问题问题:这段程序有无错误?这段程序有无错误? 如果有错,如何改正?如果有错,如何改正?MOV BL, ALBLBLALALALAL;无条件转移STARTSTART:ININALAL,71H71

19、H ; 将将71H71H端口的字节读入端口的字节读入ALAL MOV BL, AL MOV BL, AL CLCCLC ; 清除清除CFCFCMPCMP BLBL, 1010 ; 将将BLBL的内容和的内容和1010相比较相比较JCJCLP1LP1 ; 小于小于1010转转LP1LP1CMPCMP BLBL, 2020 ; 将将BLBL的内容和的内容和2020相比较相比较 JCJCLP2LP2 ; 10BL10BL2020转转LP2LP2 MOV MOV AL AL , 0FFH0FFH ; 将将0FFH0FFH送入送入ALAL寄存器寄存器LP3LP3: OUTOUT73H73H,ALAL ;

20、 将将0FFH0FFH输出到输出到73H73H端口端口 HLTHLT ; 暂停暂停LP1LP1: MOV MOV ALAL, 0000 JMPJMPLP3LP3LP2LP2: MOV MOV ALAL, 88H88H JMPJMPLP3LP32022-4-1224/412022-4-1225/41编一程序段,完成符号函数:编一程序段,完成符号函数:1X0 ( -128X127)Y=0X=0-1X0 假设假设 X的值存放在的值存放在DATA1中,中, Y的值存放在的值存放在DATA2中。中。练习练习2022-4-1226/41练习题程序如下:练习题程序如下:START:MOV AL,DATA1

21、AND AL,AL JGE BIGR MOV AL,0FFH MOV DATA2,AL ;X0,-1送送DATA2 HLTBIGR: JE EQUL MOV AL,1 MOV DATA2,AL ;X0,+1送送DATA2 HLTEQUL: MOV DATA2,AL ;X=0,0送送DATA2 HLT2022-4-1227/41读程序,问:本段程序的执行结果是什么读程序,问:本段程序的执行结果是什么?BEGIN:INAL,5FH TESTAL,80H JZBRCH1 MOVAH,0 JMPSTOPBRCH1:MOVAH,0FFHSTOP: HLT;将将5FH端口的字节读入端口的字节读入AL;如果

22、如果AL的最高位为的最高位为1,则,则ZF=0,否则,否则ZF=1;当结果为零当结果为零(即即ZF=1)时,跳转至时,跳转至BRCH1;将立即数零送将立即数零送AH;无条件转移至无条件转移至STOP;将将0FFH送送AH;暂停暂停当当AL的最高位为的最高位为1时,时,AH=0;当当AL的最高位为的最高位为0时,时,AH=0FFH。2022-4-1228/41 双分支程序设计双分支程序设计 实现双分支程序设计要完成以下几项工作:实现双分支程序设计要完成以下几项工作:1 1 产生条件:主要用产生条件:主要用“比较比较”、“测试测试”等指令产生条等指令产生条件;件;2 2 测试条件、定向转移:用条件

23、转移指令完成;测试条件、定向转移:用条件转移指令完成;3 3 设置执行标志设置执行标志( (标号标号) ):给执行程序段定义地址标号。:给执行程序段定义地址标号。7.4 循环程序2022-4-1229/41循环程序是循环程序是强制强制CPUCPU重复执行某一指令序列重复执行某一指令序列( (程序段程序段) )的一种程序的一种程序结构形式。结构形式。循环结构程序循环结构程序缩短了程序的长度、减少了占用的内存空间缩短了程序的长度、减少了占用的内存空间。循环程序循环程序并不简化程序执行过程并不简化程序执行过程,相反,由于增加了一些循环,相反,由于增加了一些循环控制等环节,控制等环节,总的程序执行语句

24、和时间会有所增加总的程序执行语句和时间会有所增加。循环程序一般由循环程序一般由4 4部分组成:部分组成:初始化、循环体、循环控制和循环初始化、循环体、循环控制和循环结束处理结束处理。循环程序分为循环程序分为单循环单循环和和多重循环多重循环, ,两重以上循环称为多重循环。两重以上循环称为多重循环。内外循环不能交叉。内外循环不能交叉。2022-4-1230/417.4 7.4 循环程序循环程序循环程序各部分的内容循环程序各部分的内容(1)初始化初始化建立建立循环次数计数器循环次数计数器,设定设定变量和存放数据的变量和存放数据的内存地址指针内存地址指针(常用间常用间址方式址方式)的的初值初值等。等。

25、(2) 循环体循环体实现程序实现程序功能功能的、被的、被重重复执行复执行的指令序列。的指令序列。(3) 循环控制循环控制修改修改变量变量和地址和地址指针指针,为下一次循环做准备;为下一次循环做准备;修改循环修改循环计数器计数器或者判或者判断断循环条件循环条件是否满足,是否满足,满足则继续循环,否则满足则继续循环,否则结束循环。结束循环。(4) 结束处理结束处理它主要用来分析和存放它主要用来分析和存放程序的结果。程序的结果。2022-4-1231/41循环控制方式有多种,如循环控制方式有多种,如计数控制计数控制、条件控制条件控制等。计数控制事等。计数控制事先已知循环次数,每次循环加或减计数,通过

26、对循环次数的判先已知循环次数,每次循环加或减计数,通过对循环次数的判定来达到控制循环的目的;条件控制事先不知循环次数,通过定来达到控制循环的目的;条件控制事先不知循环次数,通过判定某种条件的真假来达到控制循环的目的。判定某种条件的真假来达到控制循环的目的。不管哪一种控制循环方式,最终都是要达到控制循环的目的。不管哪一种控制循环方式,最终都是要达到控制循环的目的。若考虑不周,会造成死循环若考虑不周,会造成死循环,对这一点要注意。,对这一点要注意。 循环可以用跳转语句实现循环可以用跳转语句实现, 如如JMP, JZ等等; 也可以用专用循环控制也可以用专用循环控制语句实现语句实现, 如如LOOP、L

27、OOPE/LOOPZ、LOOPNE/LOOPNZ。 【例7.5】求两个多字节数之和。这两个数在10050H地址开始的内存单元中,连续存放,低位在小地址一端,结果放在这两个数之后。设这两个多字节数均为8个字节长。 程序流程图如右图所示。2022-4-1232/41 (1) 分析题目:这是一个重复累加内存单元中数的问题,因此可以用循环程序形式解决。因为86系列指令系统可以16位处理,所以,循环次数是4次。2022-4-1233/4112574341存储器存储器SI10050DI10058+BX100605598单击单击2022-4-1234/41(3) 编制的程序如下:STARTSTART: MO

28、VMOVAXAX,1000H1000HMOVMOVDSDS,AXAX ; DSDS1000H1000HMOVMOVSISI,50H50H; 第一个数指针第一个数指针SISI50H50HMOVMOVDIDI,58H58H; 第二个数指针第二个数指针DIDI58H58HMOVMOVBXBX,60H 60H ; 结果指针结果指针BXBX60H60HMOVMOVCXCX,4 4 ; 循环次数循环次数CXCX4 4CLCCLC ; 清进位清进位CFCF0 0AAAA: MOVMOVAX,AX,SISI; 取一个字到取一个字到AXAX下页续下页续2022-4-1235/41 ADCADCAXAX,DIDI

29、; AXAX+AXAX+DIDI+CF+CF MOVMOVBXBX,AXAX ; 存一个字到存一个字到BXBX PUSHFPUSHF ; 保护进位保护进位CFCFADDADDSISI,2 2 ; 修改第一个数的地址指针修改第一个数的地址指针SISI+2SISI+2ADDADDDIDI,2 2 ; 修改第二个数的地址指针修改第二个数的地址指针DIDI+2DIDI+2ADDADDBXBX,2 2 ; 修改结果指针修改结果指针BXBX+2BXBX+2POPFPOPF ; 恢复标志寄存器恢复标志寄存器LOOPLOOPAAAA ; CXCX-1CXCX-1,若,若CX0CX0转转AAAAHLTHLT ;

30、 CXCX0 0,暂停,暂停结束结束2022-4-1236/41 【例7.6】要求设计一个软件延时程序,延时时间约1ms左右。 (1) 分析题目: 此题是想让计算机做一些无用的操作,来拖延时间。从指令手册中查得各条指令所需的时间节拍,但一般一条指令执行时间只有几个时钟周期,亦即只有几个微秒,为了能用较少的指令来编较长时间的延时,采用循环程序结构.2022-4-1237/41 (2) 程序流程图如图所示。延时的时间主要取决于循环体及循环次数。PUSHF和POPF指令分别为10和8个时钟节拍,LOOP BX指令为3.4个时钟节拍,即此循环体需要用10+8+3.421.4拍,而每个时钟节拍是根据此系

31、统的晶振频率而定的。假设此系统用的是8MHz的晶振,则每个时钟节拍需要0.125s,因此可以根据下列公式算出循环次数: X延时时间/一次循环时间1ms/21.40.125s374次 换算成十六进制数为176H。2022-4-1238/41延时延时1ms的程序流程图的程序流程图延时延时1ms的程序流程图的程序流程图2022-4-1239/41(3) 编制的程序如下:STARTSTART:MOVMOVCXCX,176H176H ;初始化,设定循环次数;初始化,设定循环次数CXCX374374LP1LP1: PUSHFPUSHF ; 循环体循环体 POPFPOPF LOOPLOOPLP1LP1 ;

32、CXCX-1CXCX-1,若,若CX0CX0转转 HLTHLT ; 暂停暂停 对于上例,如果想再延长1000倍时间(即延时1s),可以采用双循环的方法,如图所示的程序流程图。对应的程序如下: 2022-4-1240/41 MOVMOVBXBX,3E8H3E8H; BX1000BX1000LP2LP2: MOVCXMOVCX,176H176HLP1LP1: PUSHFPUSHF POPFPOPF延时延时1ms1ms程序段程序段 LOOP LP1LOOP LP1 DECDECBXBX ; BXBX-1BXBX-1 JNZJNZLP2LP2 ; ZFZF0 0时,转至时,转至LP2LP2,即,即BX

33、0BX0时转时转 HLTHLT ; 暂停暂停 此程序中内循环是1ms时间,而在外循环中的两条控制指令DEC和JNZ所对应的时钟节拍分别为2个和4个 ,一共只需0.75s,与1ms比较极短,所以在外循环里忽略不计了,外循环的循环初值仍设为1000次,对应的十六进制为3E8H。例 设AX寄存器中有一个16位二进制数,编一程序,统计AX中1的个数,统计结果送CX中。该程序可用固定次数循环和条件判断两种方法实现。该程序可用固定次数循环和条件判断两种方法实现。条件判断法编制程序如下:条件判断法编制程序如下:STARTSTART:MOV CXMOV CX,0 0LOOPLOOP: SUBSUBAXAX,0

34、 0 JZ JZSTPSTP SAL SALAXAX,1 1 JNC JNCNODNOD INC INCCXCXNODNOD: JMPJMPLOOPLOOPSTPSTP: HLTHLT2022-4-1241/41固定次数循环法,循环次数为固定次数循环法,循环次数为16次,程序如下:次,程序如下:其中其中:CX中存放循环次数,中存放循环次数,BX中存放中存放“”的个数的个数 MOV CX, 16 MOV BX, 0 AA: SHL AX,1 JC YY JMP PP YY: INC BX PP: LOOP AA HLT 例: 计算S=1+2+3+100的和值并将其存入数据段2000H单元.202

35、2-4-1242/41程序如下:程序如下: MOV CX, 0064H MOV AL, 0 MOV BL, 1AA: ADD AL,BL INC BL LOOP AA MOV 2000H,AL HLT例: 读程序, (1) 本程序实现什么功能? (2) 结果在哪里?2022-4-1243/41START: INAL,20HMOVBL,ALINAL,30HMOVCL,ALMOVAX,0ADLOP: ADDAL,BL ADCAH,0 DECCL JNZADLOP HLT;将将20H端口端口 的字节读入的字节读入AL; AL中的中的8位字节送位字节送 BL;将将30H端口端口 的字节读入的字节读入A

36、L; AL中的中的8位字节送位字节送 CL; 立即数立即数0送送 AX; AL与与BL的内容相加,结果放的内容相加,结果放AL; AH的内容与立即数的内容与立即数0以及以及CF相加相加; CL内容减内容减1,结果放,结果放CL; 当结果不为零时,执行当结果不为零时,执行ADLOP; 暂停暂停20H与与30H端口的内容端口的内容相乘,结果放在相乘,结果放在AX中中44 7.5 7.5 子程序和库子程序和库为了程序共享或模块化设计的需要,为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程可以把一段公共语句序列设计成子程序或宏指令的形式。序或宏指令的形式。45 当把一段可共享的语句序列

37、组织成子程序后,一旦需要实现该功能,就由调用程序调用之,当子程序执行结束后再返回到主程序继续执行。7.5.1 7.5.1 子程序的定义子程序的定义 主程序主程序 子程序子程序 主子程序关系示意图主子程序关系示意图46定义子程序的一般格式在汇编语言中用过程定义伪指令定义子程序。过程名PROC 【类型】过程名ENDP477.5.1 子程序的定义子程序的定义u “子程序名”必须是一个合法的标识符,并前后二者要一致;uPROC和ENDP必须是成对出现的关键字,表示子程序定义开始和结束;u子程序的类型有近(NEAR)、远(FAR)之分,其缺省的类型是近类型;uNEAR类型的子程序只能被与其同段的程序所调

38、用,FAR类型的子程序可被不同段的程序所调用;u子程序至少要有一条返回指令。返回指令是子程序的出口语句,但它不一定是子程序的最后一条语句;u子程序名有三个属性:段值、偏移量和类型。其段值和偏移量对应于子程序的入口地址,其类型就是该子程序的类型。48 调用子程序指令格式如下:CALL 子程序名子程序名/Reg/Mem子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移。7.2 子程序的调用和返回指令子

39、程序的调用和返回指令49如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作。例如: CALL DISPLAY;DISPLAY是子程序名 CALL BX;BX的内容是子程序的偏移量 CALL WORD1;WORD1是内存字变量,其值是子程序的偏移量501 1子程序调用指令子程序调用指令 CALLCALL格式:格式:CALL DSTCALL DST功能:功能:调用子程序。调用子程序。执行时先把返回地址压

40、入堆栈,再形成子程序执行时先把返回地址压入堆栈,再形成子程序入口地址,最后把控制权交给子程序。入口地址,最后把控制权交给子程序。说明:其中说明:其中DSTDST为子程序名或子程序入口地址,其为子程序名或子程序入口地址,其目标地址的形成与目标地址的形成与JMPJMP指令类似指令类似, ,可以有段内直接可以有段内直接间接调用、段间直接间接调用之分间接调用、段间直接间接调用之分, ,只是不能使只是不能使用段内直接寻址方式的用段内直接寻址方式的SHORTSHORT格式。格式。51 段内调用段内调用这类调用指令实现同一段内的子程序调用这类调用指令实现同一段内的子程序调用, ,它它只改变只改变IPIP值,

41、不改变值,不改变CSCS值。值。执行操作:执行操作: 把返回地址(把返回地址(CALLCALL之后的那条指令地址的之后的那条指令地址的偏移量部分偏移量部分( (当前当前IPIP值值) ))压入堆栈。)压入堆栈。根据与转移地址有关的寻址方式形成子程序根据与转移地址有关的寻址方式形成子程序入口地址的入口地址的IPIP值。值。把控制无条件转向子程序,即执行把控制无条件转向子程序,即执行CS:IPCS:IP处处的指令。的指令。52 段内直接调用:段内直接调用: 格式:格式:CALL PROCEDURECALL PROCEDURE 或:或: CALL NEAR PTR PROCEDURE CALL NE

42、AR PTR PROCEDURE 功能:功能:调用调用PROCEDUREPROCEDURE子程序。执行时先把返回地子程序。执行时先把返回地址压入堆栈址压入堆栈, ,再使再使IPIP(IP)(IP)disp16disp16,最后把控制权,最后把控制权交给子程序。交给子程序。 说明:说明:这种指令使用与转移地址有关的寻址方式这种指令使用与转移地址有关的寻址方式中的段内直接寻址方式。中的段内直接寻址方式。 例例1.1. 设子程序设子程序A A与与CALLCALL指令在同一段内,则调用指令在同一段内,则调用A A子程序的指令是:子程序的指令是: CALL A CALL A 或或: CALL NEAR

43、PTR A: CALL NEAR PTR A53 段内间接调用:段内间接调用:格式:格式:CALL REGCALL REGM M功能:功能:调用子程序。执行时先把返回地调用子程序。执行时先把返回地址压入堆栈,再把指令指定的址压入堆栈,再把指令指定的1616位通用寄存位通用寄存器或内存单元的内容送给器或内存单元的内容送给IPIP,最后把控制权,最后把控制权交给子程序。交给子程序。 说明:说明:这种指令使用与转移地址有关的寻这种指令使用与转移地址有关的寻址方式中的段内间接寻址方式,指令指定的址方式中的段内间接寻址方式,指令指定的通用寄存器或内存单元中存放段内偏移量。通用寄存器或内存单元中存放段内偏

44、移量。54 段间调用段间调用 这类调用指令可以实现段间调用(这类调用指令可以实现段间调用(FARFAR型调用)型调用), ,执行时即要改变执行时即要改变IPIP值,值,也要改变也要改变CSCS值。值。55 段间直接调用:段间直接调用:格式:格式:CALL FAR PTR PROCEDURECALL FAR PTR PROCEDURE 功能:功能:调用调用PROCEDUREPROCEDURE子程序。执行时先子程序。执行时先把返回地址把返回地址( (当前当前IPIP值和当前值和当前CSCS值值) )压入堆栈压入堆栈,再把指令中的偏移量部分送给再把指令中的偏移量部分送给IPIP,段基址部分,段基址部

45、分送给送给CSCS,最后把控制权交给子程序。,最后把控制权交给子程序。说明:说明:这种指令使用与转移地址有关的寻这种指令使用与转移地址有关的寻址方式中的段间直接寻址方式。址方式中的段间直接寻址方式。例例3.3. 设子程序设子程序B B与与CALLCALL指令不在同一段内指令不在同一段内, ,则段间直接调用则段间直接调用B B子程序的指令是:子程序的指令是:CALL FAR PTR B CALL FAR PTR B 56 段间间接调用:段间间接调用:格式:格式:CALL MCALL M功能:功能:调用子程序。执行时先把返回地调用子程序。执行时先把返回地址址( (当前当前IPIP值和当前值和当前C

46、SCS值值) )压入堆栈,再把压入堆栈,再把M M的的低字送给低字送给IPIP,高字送给,高字送给CSCS, ,最后把控制权交给最后把控制权交给子程序。子程序。说明:说明:这种指令使用与转移地址有关的这种指令使用与转移地址有关的寻址方式中的段间间接寻址方式,其中寻址方式中的段间间接寻址方式,其中M M 为为内存的双字长地址指针,低字部分为内存的双字长地址指针,低字部分为1616位的位的偏移量,高字部分为段基址。偏移量,高字部分为段基址。57例例4.4. 对于例对于例3 3,若子程序,若子程序B B的入口地址的入口地址( (偏偏移量和段基址移量和段基址) )放在变量放在变量VARVAR中中, ,

47、即可通过即可通过VARVAR实实现段间间接调用。如下所示:现段间间接调用。如下所示:CALL DWORD PTR VARCALL DWORD PTR VAR; ;从从VARVAR变量中得到子程序变量中得到子程序B B的入口地址实现调用的入口地址实现调用变量变量VARVAR的地址也可以通过寄存器间接寻的地址也可以通过寄存器间接寻址方式、基址变址寻址方式等存储器操作数寻址方式、基址变址寻址方式等存储器操作数寻址方式得到。址方式得到。例例. . CALL DWORD PTR 8BXDI CALL DWORD PTR 8BXDI 58 当子程序执行完时,需要返回到调用它的程序之中。为了实现此功能,指令系统提供了一条专用的子程序返回指令。其格式如下:RET/RETN/RETF Imm 子程序的返回在功能上是子程序调用的逆操作。为了与子程序的远、近调用相对应,子程序的返回也分:远返回和近返回。7.5.2 返回指令返回指令59 如果返回指令后面带有立即数(其值通常为偶数),则表示在得到返回地址之后,SP还要增加的偏移量,它不是类似于高级语言中子程序的返回值。例如:RET;可能是近返回,也可能是远返回RETN;近返回指令RETF;远返回

温馨提示

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

评论

0/150

提交评论