收藏 分销(赏)

第3章 汇编语言程序设计初步.pdf

上传人:曲**** 文档编号:4901588 上传时间:2024-10-18 格式:PDF 页数:99 大小:6.48MB 下载积分:15 金币
下载 相关
第3章 汇编语言程序设计初步.pdf_第1页
第1页 / 共99页
第3章 汇编语言程序设计初步.pdf_第2页
第2页 / 共99页


点击查看更多>>
资源描述
第3章汇编语言程序设计初步第3章汇编语言程序设计初步3.1 系统功能调用3.2 汇编语言源程序的设计的基本步骤源3.3 分支结构的汇编语言源程序的编写源3.4 循环结构的汇编语言源程序的编写原版教学配套课件第3章汇编语言程序设计初步3.1系统功能i3.1.1系统功能调用概述31.2基本I/O调用返回本章首页06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.1.1系统功能调用概述我们在编制汇编源程序时,常常要与外部设 备发生关系,如希望能从键盘输入字符或在显示 器上显示出程序运行的结果,但由于计算机机种 的不同、外部设备型号的差异,控制它们工作的 程序也会有差异。如果每次都需要根据自己的工 作环境来设计“控制这些外设工作 的程序”,则必 须要先弄清楚与之有关的设二电路、接口等各方面的情况,是一件既复杂,效率又低的事情,并且没有通用性。如果把这些控制过程预先编写成一个一个子 06/16/2013原版教学配套课件第3章汇编语言程序设计初步程序,作为操作系统的一部分事先放在系统盘上,用户在需要时只要按规定的格式设置好参数,直接 调用这些子程序即可。美国MICROSOFT公司为 我们提供的磁盘操作系统(DOS)就具有这种功 能,称为“利用操作系统的标准功能调用(简称系 统功能调用)”,编号从062H(3.0版),主要分 为设备管理(如键盘、显示器、打印机、磁盘等的 管理)、文件管理、目录管理及其他功能调用4大 类。06/16/2013原版教学配套课件第3章汇编语言程序设计初步系统功能调用的基本方法采用一条软中断指令INT n o所谓中断,是 指当计算机正在执行正常的程序时,计算机系统 中的某个部分突然出现某些异常情况或特殊请求,CPU这时就中止(暂停)它正在执行的程序,而转去执行申请中断的那个设备或事件的中断服 务程序,执行完这个服务程序后,再自动返回到 程序断点执行原来中断了的正常程序。这个过程 或这种功能就叫做中断。软中断是以指令方式产生的中断,n是中断 类型号,不同的n将转入不同的中断处理程序。系统功能调用是21号软中断。06/16/2013原版教学配套课件第3章汇编语言程序设计初步常用的系统功能调用表:功能入口参数出口参数01H键盘输入字符无他嘴入字符02H显示输出DL=输出字符无08H键盘输入字符(无回显)无心输入字符09H显示(打印)字符串DS:DX啜冲区首址无OAH微冲的键盘输入(字符串)DS:DX啜冲区首址无05H打印机输出DL榔翎无OBH检查键盘输入状态无AWO无输入,FF有输入25H置中断向量DS:DX=入口地址,心中断类型言无35H取邨晌量心中断类型号ES:BX=?口地址4CH中止当前程序返回调用程序AL嘲回码无4DH取返回码无止返回码表3-1最常用的系统功能调用表原版教学配套课件第3章汇编语言程序设计初步系统功能调用的步骤:1)将调用参数装入指定的寄存器。2)如需要功能调用号(即欲调用的子程序编 号),把它装入寄存器AH。3)如需要子功能调用号,把它装入AL。4)按中断号调用DOS(发出中断指令:INT21H)o5)检查返回参数是否正确。06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.1.2基本I/O调用1.01H号调用功能:从标准输入设备上(通常为键盘)读取 字符,并在标准输出设备上(通常为显示器)回显O格式:MOV AH 01HINT 21H说明:输入字符的ASCII码送入AL中,如果读 到的字符是Ctrl+C或Ctrl+Break,则结束程序。2.02H号调用功能:通过标准输出设备(多为显示器)输出 字符。原版教学配套课件第3章汇编语言程序设计初步格式:MOV DL,X;X为要输出显示的ASCII字符代码)MOV AH,02HINT 21H说明:DL寄存器中的内容等于要输出字符的ASCH码,在 显示输出时检查到的字符是Ctrl+C或Ctrl+Break键的,则结束 程序。3.09H号调用功能:在标准输出上(通常为显示器)显示一个字符串。字符串要以字符“$”为结束标志。格式:MOV AH 09HINT 21H说明:要输出显示的字符串的首地址送到DS、DX两个寄存器中,其中段地址送DS寄存器,06/16/2013原版教学配套课件第3章汇编语言程序设计初步偏移地址送DX寄存器。4.OAH号调用功能:从标准输入设备上(通常为键盘)读 一个字符串,存入内存,直到按回车键为止。格式:MOV AH,OAHINT 21H说明:此项操作,要求事先定义一个输入缓 冲区,它的缓冲区首地址送到DS、DX两个寄存 器中,其中段地址送DS寄存器,偏移地址送DX 寄存器。06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-1】在显示器上显示字符串Welcome to TianHe college!DATAS SEGMENT;/数据段定义开始STRING DB Welcome to TianHe college!1,OAH,ODH,$;/定义字符串,OAH,ODH表示显示字符串后,光标可自动 回车换行,字符串必须以$结束。DATAS ENDS;/数据段定义结束CODES SEGMENT;/代码段定义开始ASSUME CS:CODES,DS:DATAS,SS:STACKS;/说明段和段寄存器之间的关系START:MOV AX,DATAS;/将数据段的段地址送寄存器AXMOV DS,AX;/将AX内容送DS寄存器,即初始化DSLEA DX,STRING;/将STRING的偏移地址送DX寄存器06/16/2013原版教学配套课件第3章汇编语言程序设计初步MOV AH,9;/字符串显示子功能,9号系统功能调用INT 21H;/系统调用MOV AH,4CH;/返回DOSINT 21H;/系统调用CODES ENDS;/代码段定义结束END START【例3-2】从键盘输入字符串,把它放到缓冲区中存储起来DATA SEGMENTMAXLEN DB 100;/定义缓冲区的最大容量ACLEN DB?;/定义实际读入的字符数STRING DB 100 DUP(?);/定义接收字符串空间DATA ENDS06/16/2013原版教学配套课件第3章汇编语言程序设计初步CODE SEGMENTMOV AX,DATAMOV DS,AX;/数据段初始化LEA DX,MAXLEN;/送MAXLEN的偏移地址到寄存器DX MOV AH,10;/io号系统功能调用 INT 21H;/系统调用CODE ENDS运行程序时,若从键盘输入“Thank you!”(共计10个字),则输入缓 冲区MAXLEN各单元的内容如图3-1MAXLEN10010ha,nyU丁所示。图3-1存储空间分配示意06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.2汇编语言源程序的设计的基本步骤3.2.1 源程序的基本框架3.2.2 汇编语言源程序设计的基本步骤3.2.3 顺序结构的汇编语言源程序的编写返回本章首页06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.2.1源程序的基本框架一个汇编语言源程序由两大部分组成的。其中主 要部分就是指令,位于代码段内,代码段可以有好几 个。其他部分是为指令服务的,包括数据的准备,存 储区域的划分和地址的标注。其他部分由数据段、堆 栈段和扩展段组成。也各可以有好几个。段之间的顺 序可以随意安排。但通常是其他部分(数据段、堆栈 段和扩展段等)在前,代码段在后。虽然可以定义多 个段,但由于段首址存放在CPU的寄存器中,所以可 以同时使用6个段:代码段(CS、数据段(DS、堆栈段 SS 和3个扩展段(ES、FS和GS。扩展 段其实也是数据段,只是段地址在寄存器ES、FS和 GS中。程序通过修改段寄存器的值实现段的切换。06/16/2013原版教学配套课件第3章汇编语言程序设计初步一个程序至少包含一个代码段和END指令。其他段的 设置由程序的具体功能需要而定。程序较小时,可以 不设置堆栈段。操作系统在装载不含堆栈段的程序时,会指定一个段作为堆栈段使用。这样,程序连接时,LINK会产生一条警告信息:WARNING:NO STACK SEGMENT但不会影响程序的运行,可以忽略它。程序中的段名可以是唯一的,也可以与其它段同 名。在同一模块中,如果有两个段同名,则后者被认 为是前段的后续,这样,它们就属同一段。当同一模 块出现两个同名段时,则后者的可选项属性要么与前 者相同,要么不写其属性而选用前者的段属性。06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-4】段寄存器与段的对应方法1:用一个段寄存器对应两个数据段DATA1 SEGMENT bl DB 10hDATA1 ENDSDATA2 SEGMENT bl DB 23hDATA2 ENDS CODEI SEGMENT;/定义第一个数据段;/定义变量DATAL字节变量;/第一个数据段结束;/定义第二个数据段;/定义变量DATA2,字节变量;/第二个数据段结束;/定义第一个代码段ASSUME CS:CODE1,DS:DATA1;/指定段寄存器START:MOV AX,DATA1;/指令开始,MOV DS,AX;/把数据段DATAI的段首址赋给段寄存器DS原版教学配套课件第3章汇编语言程序设计初步MOV BL,bl;/引用DS来访问DATA1中的变量blASSUME DS:DATA2;/说明DS与DATA2建立联系MOV AX,DATA2;MOV DS,AX;/把数据段DATA2的段值赋给段寄存器DS./实现段的切换MOV AL,b2;/引用DS来访问DATA2中的变量b2CODEI ENDS;/代码段CODEI结束END START;/程序结束在方法1中,因为只使用一个段寄存器DS来对应两个数 据段,所以,需要切换DS的对应关系。但我们也可以用段 寄存器DS和ES来分别对应段DATA1和DATA2,这样,方 法1就可变成方法2。06/16/2013原版 教学配 套课件第3章汇编语言程序设计初步方法2:用两个段寄存器对应两个数据段DATA1 SEGMENTbl DB 10hDATA1 ENDS DATA2 SEGMENT b2 DB 23hDATA2 ENDS CODEI SEGMENT;/定义第一个数据段;/定义变量DATAL字节变量;/第一个数据段结束;/定义第二个数据段;/定义变量DATA2,字节变量/第二个数据段结束;/定义第一个代码段ASSUME CS:CODE1,DS:DATA1,ES:DATA2;/指定段寄存器START:MOV AX,DATA1;/指令开始,MOV DS,AX;/把数据段DATA1的段首址赋给段寄存器DSMOV AX,DATA2MOV ES,AX;/把数据段DATA2的段首址赋给段寄存器ES06/16/2013原版教学配套课件第3章汇编语言程序设计初步MOV BL,bl;/引用DS来访问DATA1中的变量blMOV AL,b2;/引用ES来访问DATA2中的变量b2CODEI ENDSEND START;/代码段CODEI结束;/程序结束我们还可以用“段组”来简化段寄存器的使用,把段 DATA1和DATA2组成一个数据段。所以,把方法2再改写成 方法3的形式。方法3:用一个段组组成两个数据段GSEG GROUP DATA1,DATA2;/定义段组DATA1 SEGMENT;/定义第一个数据段原版教学配套课件第3章汇编语言程序设计初步bl DB 10hDATA1 ENDSDATA2 SEGMENTb2 DB 23hDATA2 ENDSCODEI SEGMENT;/定义变量DATAL字节变量;/第一个数据段结束;/定义第二个数据段;/定义变量DATA2,字节变量;/第二个数据段结束;/定义第一个代码段ASSUME CS:CODE15 DS:GSEGSTART:MOV AX,GSEG;/指令开始,MOV DS,AX;/把段组GSEG的段值赋给段寄存器DSMOV BL,bl;/引用DS来访问DATAl中的变量blMOV AL,b2;/引用DS来访问DATA2中的变量b2.06/16/2013原版教学配套课件第3章汇编语言程序设计初步CODEI ENDS;/代码段CODEI结束END START;/程序结束定义段组后,段组内各段所定义的标号和变量,除了 与定义它们的段起始点相关外,还与段组的起始点相关。规定如下:如果在ASSUME伪指令中说明段组与段寄存器相对应,那么,有关标号或变量的偏移量就相对于段组起点计算9如果在ASSUME伪指令中说明段组内的某段与段寄存 器相对应,那么,有关标号或变量的偏移量就相对于该段 的起点。所以,在使用段组后,程序员要谨慎使用ASSUME伪 指令,并保证段寄存器的值与段组或段相一致。原版 教学配 套课件第3章汇编语言程序设计初步3.2.2汇编语言源程序设计的基本步骤1.汇编语言源程序的主要基本结构:顺序结构 分支结构 循环结构2.好程序的要求一个好的程序,首先应该能正常运行,实现预定的功 能。还应该满足:结构简明,明白易懂,调试方便,修改容易。执行速度快(程序执行时间短,程序语句行数尽量 少)。占用内存空间少。06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.基本步骤分析问题,从中抽象出恰当的数学模型。确定解决问题的合理算法。画出程序流程图,根据算法,细化并找出解决问 题的思路和具体方法。确定汇编语言程序的基本框架:各个存储段的定 义,存储空间的分配,寄存器的配置,指针和计数 器的选择。根据程序流程图确定程序的基本结构,并编写程 序。06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.2.3顺序结构的汇编语言源程序的编写顺序结构是最简单的程序结构,没有分支,没有循环,程序的执行顺序就是指令的编写顺序,所以,又称直线程序。因此,安排指令的先后 次序就显得至关重要。另外,在编程序时,还要 妥善保存已得到的处理结果,为后面的进一步处 理直接提供前面的处理结果,从而避免不必要的 重复操作。06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例35】两个64位无符号数相加分析问题:在8086/8088CPU中,只有8位或16位运算 指令,没有32位和64位以上的运算指令。确定算法:要进行64位的加法运算,可以确定算法:利用16位加法指令分别相加4次来实现。画程序流程图:本问题简单,无需画程序流程图。确定汇编语言程序的基本框架:可见,汇编语言程序 的基本框架至少要两个段:数据段和代码段。数据段中 至少定义3个变量:两个加数Nl、N2,还有一个和数 SUM,都是DW类型。和数SUM尚属未知,故应定义一 个5个字长(比64位字长富余一点)的缓冲区。因为要加 4次,需要一个计数器或指针,可选寄存器BX充当。编写程序,可以想得到,需要MOV、ADD、ADC和 INC等指令。具体程序如下:o6/16/2O13原版 教学配 套课件第3章汇编语言程序设计初步DATA SEGMENT;/定义数据段N1 DW 1234H,5678H,9ABCH,ODEFOH;/定义字变 量N1N2 DW 1971H,0313H,1968H,1123H;/定义字变量N2SUM DW 5DUP(?);/定义缓冲区SUMDATA1 END;/数据段结束CODE SEGMENT;/定义第一个代码段ASSUME CS:CODE,DS:DATA;/指定段寄存器MAIN PROC NEARSTART:MOV AX,DATA;/指令开始,MOV DS,AX;/把数据段的段首址赋给段寄存器DSLEA BX,N1;/将NI的偏移地址送BXMOV AX,BX;/引用DS来访问DATA中的变量Nd的最低位原版 教学配 套课件第3章汇编语言程序设计初步ADD AX,BX+8;/最低位字相加,因两个数偏移地址相差8个字节MOV BX+16,AX;/存最低位和。BX+16指示SUM的偏移地址 此句也可以写为:MOV SUM,AXINC BXINC BX;/指针指向下一个字MOV AX,BX;/引用DS来访问DATA中的变量N1的次低位ADC AX,BX+8;/次低位字相加,因两个数偏移地址相差8个字节MOV BX+16,AX;/存次低位和。BX+16指示SUM+1的偏移 地址,此句也可以写为:MOV SUM+1,AXINC BXINC BX;/指针指向下一个字MOV AX,BX;/引用DS来访问DATA中的变量N1的次高位ADC AX,BX+8;/次高位字相加,因两个数偏移地址相差8个字节06/16/2013原版教学配套课件第3章汇编语言程序设计初步MOV BX+16,AXINC BX INC BX MOV AX,BX ADC AX,BX+8 MOV BX+16,AXMOV AX,0 ADC AX,0MOV BX+18,AXMOV AH,4CH INT 21H MAIN ENDP CODE ENDS END START;/存次高位和。BX+16指示SUM+2的偏移 地址,此句也可以写为:MOV SUM+2,AX;/指针指向下一个字;/引用DS来访问DAT A中的变量N1的最高位;/最高位字相加,因两个数偏移地址相差8个字节;/存最高位和。BX+16指示SUM+3的偏移 地址,此句也可以写为:MOV SUM+3,AX;/对AX清零;/计算进位;/存进位位;/此句也可写成:MOV AX,4C00H;/代码段CODE1结束;/程序结束06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-6】两个32位无符号数乘法程序分析问题:在8086/8088CPU中,只有8位或16位运算指令,没有32位以上的乘法运算指令。确定算法:要进行32位的乘法运算,可以确定算法:利用16 位乘法指令做4次乘法,然后把部分积相加来实现。每次的积的 低位送AX,高位送DX。如图3-2所示。画程序流程图:程序流程图如图3-3所示。确定汇编语言程序的基本框架:可见,汇编语言程序的基本 框架至少要两个段:数据段和代码段。数据段中至少定义3个变 量:两个乘数,还有一个积数,都是DW类型。积数尚属未知,故应定义一个4个字长(积的字长应该是乘数字长的两倍)的 缓冲区。因为要乘4次,需要一个计数器或指针,可选寄存器 BX充当。另外,本程序为了教学的需要,不采用MOV AH,4CHINT 21H06/16/2013原版教学配套课件第3章汇编语言程序设计初步来返回DOS。而改用“先将程序 段前缀的起始地址及数据段DS 段首址和偏移地址AX存入堆栈,再用指令RET返回DOS的方 法。所以,又定义了 100个字节 的堆栈段。同时堆栈段又为保 存最后的进位位提供了条件。编写程序,可以想得到,需要MOV、MUL、ADD、ADC PUSH PUSHF和RET 等指令。具体程序如下:B0 x 0BBxD牖应BxD傩应AxD褊也AxD雕应CxB嬉欣CxB制随一AxC的高位AxC制随8.秒4的植酊懒源帆14雌林撇+於艇1 酬2龄如瑞镯羽标翅06/16/2013原版教学套课件第3章汇编语言程序设计初步NUME 32bit MULTIPLY;程序名“32位乘法”DATA SEGMENT;数据段定义开始 MULNUM DW OOOOH,OFFFFH,OOOOH,OFFFFH,4DUP(?);DATA ENDS;数据段定义结束 STACK SEGMENT PARA STACK STACK;堆栈段定义开始DB 100DUP(?);堆栈段长度为100字节STACK ENDS;堆栈段定义结束CODE SEGMENT;代码段开始 ASSUME CS:CODE,DS:DATA,SS:STACK;指定段寄存器 START PROC FAR;原版 教学配 套课件图3-3程序流程图06/16/2013第3章汇编语言程序设计初步BEGIN:PUSH DS;将DS中包含的程序段前缀压栈保存MOV AX,0;将o送AX,即设置AX的初值为oPUSH AX;将DS中AX的偏移地址压栈,这三句即保存返回至 DOS的段值和IP值。MOV AX,DATAMOV DS,AX;将数据段首地址送DSLEA BX,MULNUM;将MULNUM的偏移地址送BX,定义 了地址指针MULNUM32:MOV AX,BX;被乘数的低 16位B-AXMOV SI,BX+4;乘数的低 16位D-siMUL SI;BXD,部分积1的低位送AX,部分积1的 高位送DX,MOV BX+8,AX;保存部分积1的低位MOV BX+OAH,DX;保存部分积1的高位MOV AX,BX+2;被乘数的高16位A-皿6W3原版 教学配 套课件第3章汇编语言程序设计初步MUL SI;AXD,部分积2的低位送AX,部分积2的高 位送DXADD AX,BX+OAH;部分积1的高位+部分积2的低位ADC DX,0;加入部分积1的低位的进位MOV BX+OAH,AX;保存部分积1的高位+部分积2的低位MOV BX+OCH,DX;保存部分积2的高位MOV AX,BX;被乘数的低16位Bf AXMOV DI,BX+6;乘数的高16位c-DIMUL DI;BXC,部分积3的低位送AX,部分积3的高位送DXADD AX,BX+OAH;部分积1的高位+部分积2的低位+部分 积3的低位ADC DX,BX+0CH;部分积2的高位+部分积3的高位+进位MOV BX+OAH,AX;保存部分积1的高位+部分积2的低位卜部分积3的低位06/16/2013原版教学配套课件第3章汇编语言程序设计初步MOV BX+OCH,DX;保存部分积2的高位+部分积3的高位+进位PUSHF;将标志寄存器压栈,保存“部分积2的高位+部分积3的高位+进位”的进位位MOV AX,BX+2;被乘数的高 16位A-AXMUL DI;AXC,部分积4的低位送AX,部分积4的高位送DXPOPF;弹出堆栈保存的“部分积2的高位+部分积3的高位+进位”ADC AX,BX+0CH;部分积4的低位+部分积2的高位+部分积3的高位+进位ADC DX,0;部分积4的高位+进位MOV BX+0CH,AX;保存“部分积4的低位+部分积2的高位+部分积3的高位+进位”+进位MOV BX+0EH,DX;保存部分积4的高位+进位RETSTART ENDPCODE ENDS 06/16/2013END BEGIN原版 教学配 套课件第3章汇编语言程序设计初步3.3分支结构的汇编语言源程序的编写111 UJ111UJ3.3.1 条件转移指令3.3.2 汇编语言分支结构程序的编写返回本章首页06/16/2013原版教学配套课件第3章汇编语言程序设计初步3.3.1 条件转移指令在汇编语言程序设计中,常利用条件转移指令 需现嘉麟藕嚓螺魁条跳翻需 是标志寄存器的代号P、s、Z、,表示条件”,条件满足,则转移。例如JZ,表示结果为0,则转 移;如果“条件”是否定应 就在已构成的两个字母间 加字母N,例如JNZ,表示结果不为0,则转移。位的。有一个条件转移指令JCXZ,构成方法较特 殊,它的转移条件是寄存器CX的内容为0,而不是标 志寄存器的某位的标志。所有的条件转移指令都不影响标志位。06/16/2013原版教学配套课件第3章汇编语言程序设计初步现将所有的条件转移指令列举如下:(1)根据单个标志的设置情况的转移指令。共五种10条:1 JZ(或JE;上一步的结果为零(或相等)则转移。格式:JE(或JZ 标号测试条件:ZF=12 JNZ(或JNE;上一步的结果不为零(或不相等)则转 移。格式:JNZ(或JNE 标号测试条件:ZF=03 JS;上一步的结果为负,则转移。格式:JS标号测试条件:SF=14 JNS;上一步的结果为正,则转移。06/16/2013原版 教学配 套课件第3章汇编语言程序设计初步格式:JNS标号测试条件:SF=O5 JO;上一步的结果为溢出,则转移。格式:JO标号测试条件:OF=16 JNO;上一步的结果不为溢出,则转移。格式:JNO标号测试条件:OF=07 JP(或JPE;上一步的结果的奇偶标志位为1,则转移。格式:JP标号测试条件:PF=18 JNP(或JPO;上一步的结果的奇偶标志位为0,则转 移。格式:JNP(或JPO 标号测试条件:PF=0 06/16/20129 JC;上一步有进舞借传 期转移。第3章汇编语言程序设计初步格式:JC标号测试条件:CF=110)JNC;上一步无进位或无借位,则转移。格式:JNC标号测试条件:CF=0(2)比较两个无符号数,并根据比较结果的高低转移。1)JA JNBE(或JNBE)高于,即不低于或等于,则转移。格式:JA(或JNBE)标号测试条件:CF=0且ZF=02)JNA(或JBE)不高于,即低于或等于,即则转移。格式:JBE(或JNA)标号测试条件:CF=0或ZF=13)JB(或JNAE,JC)低于,即不高于或等于,或进位为1则转移格式:JB(或JNAE,JC)标号 06/16/2013原版 教学配 套课件第3章汇编语言程序设计初步测试条件:CF=14 JNB(或JAE,JNC 不低于,或高于或等于,或进位为0 则转移 格式:同上 测试条件:CF=O(3)比较两个带符号数,并根据比较的结果的大小转移。1)JL(或LNGE)小于,或者不大于且等于,则转移。格式:JL(或JNGE)标号测试条件:SF异或OF=12)JNL(或JGE)不小于,即或者大于或者等于则转移。格式:JNL(或JGE)标号测试条件:SF异或OF=03)JLE(或JNG)小于或等于,即不大于则转移。格式:JLE(或JNG)标号测试条件:(SF异或OF)或ZF=1。小6心原版 教学配 套课件第3章汇编语言程序设计初步4 JNLE(或JG 不小于或等于,即大于则转移。格式:JNLE(或JG 标号测试条件:(SF异或OF 或ZF=0(4)测试CX的值为0则转移指令格式:JCXZ标号测试条件:(CX)=006/16/2013原版教学配套课件第3章汇编语言程序设计初步3.3.2汇编语言分支结构程序的编写在设计分支程序时必须注意以下几点:(1)正确选择分支形成的判定条件和相应的条 件转移指令。(2)对每个分支程序的入口,一定要给出标 号,标明不同分支的转向地址。必须保证每条分支 都有完整的结果。(3)在检查和调试时必须对所有的分支进行,因为某几条分支正确,不足以说明整 个程序是正确的。06/16/2013原版教学配套课件第3章汇编语言程序设计初步分支结构程序的分类:简单的二分支结构程序多分支结构程序06/16/2013原版教学配套课件第3章汇编语言程序设计初步1.简单的二分支结构设计举例【例37】把a,b两个8位数中较大 的数赋值给max。分析问题:这是典型的二分支结 构。确定分支 的条件是ab吗?确定算法:采用比较转移指令,在汇编语言中用AL来保存中间结果。因为读取 寄存器比读取存储器要快,并且,汇编语言指令不允许两个操作数都 为存储单元。画程序流程图:画程序流程图,见图3-5。图3-5例3-7程序流程图06/16/2013原版教学配套课件第3章汇编语言程序设计初步确定汇编语言程序的基本框架:可见,该汇编语言程序的 基本框架至少要两个段:数据段和代码段。数据段中至少定 义3个变量:两个数a、b,还有一个最大数max,都是8位数,应选DB类型,但考虑到执行CMP指令实际上是作减法,可能有借位的情况,故选DW类型。max尚属未知,故应定义 一个字长的缓冲区。还要用到寄存器AL。编写程序,可以想得到,需要MOV、CMP等指令。最后要 返回DOS。具体程序如下:DATA SEGMENTa DW?b DW?max DW?DATA EDNSCODE SEGMENTASSUME CS:原版 教学配 套课件;/定义数据段;/定义字变量a;/定义字变量b;/定义字变量max;/数据段定义结束CODE,DS:DATA06/16/2013第3章汇编语言程序设计初步START:MOV AX,DATAMOV DS,AXMOV AL,aCMP AL,bJA EXIT MOV AL,bEXIT:MOV max,ALMOV AH,4CHINT 21HCODE ENDS END START;/比较a和b,产生分支;/如果ab,则跳转到EXIT语句,否则,执行卜列语句;/送b到寄存器;/送(AL)到存储单元max*9;/返回DOS;/代码段结束;/程序结束06/16/2013第3章汇编语言程序设计初步2.多分支结构程序设计多分支结构程序设计比较复杂 一些。关键是怎样根据条件对 多分支进行判断,确定不同分 支程序转移的入口地址。方法 有:(1)逻辑分解流程图法根据逻辑分解流程图,按 照判别条件的先后,逐个进行 判断和转移。设分支条件为 XI,X2,,XN,则逻辑 分解流程图为36所示。图3-6逻辑分解流程图06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-8 试编写执行符号函数:弋?v n.的程序 Y=0 当X=0;(-128X127)-1 当X0;分析问题:由题意可知,这是多分支结构。本题有三个分支:x0、X=0和xo。按照逻辑分解的方法,可以先将其归并为 两个条件:X20和X 0|N(AL)o时,将 1 送入ALEQUL:MOV YY,AL;/无论结果如何,都将(AL)送入YY单元HLT;/暂停(2)跳转地址表法如果各分支的判定结果可以用一个寄存器的不同 的有序的值来表示,则可将各分支程序的入口地址与 寄存器的不同的有序的值一一对应,列入一张表中,此表称为跳转地址表。06/16/2013原版教学配套课件第3章汇编语言程序设计初步如图38所示。各分支程序的入口地址的计算公式是:各分支程序的入口 地址=寄存器的值X2 十跳转地址表首地址这种利用跳转地址 表实现多分支程序的转 移的方法,称为跳转地 址表法。),0BRTAB(昭子程庠%人口地址低8位(岫于程庠段人口地址商8值(R子桃R?人口地址低8口(汕子程岸R2AnMM8ft 0(汕子程片及人口地址低8位(Q子程声氏人口地址商8 G图3-8分支程序入口地址表06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-9】根据AL中的被置位的情况来控制转移到8个分支程 序R1R8中的一个(在中断响应时,通过软件查询,从而转到 相应的中断服务程序入口就类似于这种情况)o如果AL中为00000001 如果AL中为00000010 如果AL中为00000100 如果AL中为00001000 如果AL中为00010000 如果AL中为00100000 如果AL中为01000000 如果AL中为10000000则转至R1 则转至R2 则转至R3 则转至R4 则转至R5 则转至R6 则转至R7 则转至R8实现上述要求的程序框图如图3-9所示。我们可以把8 个子程序的入口地址编成如图3-8所示的分支程序入口地址 表。根据流程图可以写出如下程序:06/16/2013原版教学配套课件第3章汇编语言程序设计初步 分析问题:由题意可知,要求根据某种条件实现8个分支程 序 确定算法:采用跳转地址表法(见图3-8分支程序入口地址 表),结合条件转移指令来实现。画程序流程图:见图3-9。确定汇编语言程序的基本框架:可见,该汇编语言程序的基 本框架要三个段:数据段、堆栈段和代码段。数据段中创建分 支程序入口地址表,应选DW类型,使用寄存器BX定位。编写程序,可以想得到,需要MOV、JMP、JC、INC、LEA和PUSH等指令。最后要返回DOS。未想到的,在编写过 程中根据需要随时添加,如RCR指令等。具体程序如下:NAME BRANCHPROGDATA SEGMENT06/16/2013原版教学配套课件子程序R.第3章汇编语言程序设计初步 BRTAB DW R11;/开始创建分支程序入口地址表。第一步创建分 支程序R1入口地址的IP值DW R12;/创建分支程序R1入口地址的码段值DW R21;/仿DW R11,下同 DW R22;/仿DW R12,下同 DW R31 DW R32 DW R41 DW R42 DW R51 DW R52 DW R61 DW R62 DW R71 DW R72 DW R81DW R82 图3-9分支程序转移流程图子程序七原版教学配套课件第3章汇编语言程序设计初步DATA ENDSSTACK SEGMENT PARA STACK STACKDB 100 DUP(?);/定义一个100个字节的堆栈空间TOP EQU$-STACK;/栈顶的地址为程序的当前地址与堆栈首地址的差。STACK ENDSCODE SEGHENTSTART PROC FARASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:PUSH DS;/将数据段首址压栈 MOV AX,0;/将寄存器AX清零 PUSH AX;/使程序能返回DOS MOV AX,DATA MOV DS,AX;/将DATA段首址(即分支程序入口地址表)送 寄存器DS 06/16/2013原版教学配套课件第3章汇编语言程序设计初步MOV AX,STACK;MOV SS,AX;/将堆栈段首址送寄存器ssMOV AX,TOPMOV SP,AX;/将堆栈段栈顶地址送堆栈指针寄存器SPLEA BX,BRTAB;/设跳转表的地址指针GTBIT:RCR AL,1JC GETADINC BXINC BXINC BXINC BXJMP GTBIT;/通过进位循环右移;/在循环右移过程中顺序检查AL中各位的状态/BX自动加1/BX自动加1,移到下一分支/BX自动加1/BX自动加1,完成寄存器的值义2GETAD:JMP DWORD PTRBX START ENDPCODE ENDS END BEGIN;/段间间接转移06/16/2013原版教学配套课件第3章汇编语言程序设计初步(3)跳转指令表法跳转指令表法的思路与跳转地址表法基本相同,不同的只是它是在代码段中把转移到各个分支程 序段的跳转指令放在一个表中,该表就称为“跳转 指令表”。表内跳转转移指令的地址的计算公式:表内跳转指令表的地址=(编号X2+跳转 指令表的首地址=编号X22+跳转指 令表的首地址06/16/2013原版教学配套课件第3章汇编语言程序设计初步【例3-10 由键盘输入一个数N,当N为不同值时应作不同处理当 N=1时,显示信息(DSPLAY);N=2时。传送信息(TRAN);N=3时。处理信息(PROC1);N=4时,打印信息(PRTN);N=5时。结束程序(EXIT).相应的处理为一独立的程序段,它们的入口地址分别为 DSPLAY,TRAN,PROC 1,PRIN,EXITo 当这些程序处理 结束时仍返回读入N。只有当N=5时程序才结束。试利用跳转指令表的分支程序实现这些要求。06/16/2013原版教学配套课件第3章汇编语言程序设计初步分析问题:由题意可知,这是一个五分支程序。它们的入口 地址分别为DISPLAY,TRAN,PROCI,PRIN,EXITo当这些程序 处理结束时仍返回读入N。只有当N=5时程序才结束.确定算法:构建跳转指令表,采用通过执行跳转指令表中相 应的跳转指令,就可以转移到不同的分支。画程序流程图:略。确定汇编语言程序的基本框架:可见,该汇编语言程序的基 本框架至少要两个段:堆栈段和代码段。堆栈段中定义一个256 个字的缓冲区,当然是DW类型,再定义一个字类型的栈顶,用 栈顶指针SP定位。采用寄存器AL,AX存数字,寄存器BX存跳转 指令的地址。编写程序,可以想得到,需要MOV、JMP、LEA、SUB、ADD、CMP和JB、JA、CBW等指令。最后要返回DOS。未想到的,在编 写过程中根据需要随时添加,如SHL指令等。为了简化程序,每 段处理程序除了 EXIT以外仅给出了一条转移指令表示当某项处 理完成后返回AGAIN继续从键盘读入一个字符直到输入字符为3二5 原版教学配套课件第3章汇编语言程序设计初步为止。例中存放转移指令的表JADT2在代码段中。具体程序如下:STACK SEGMENT STACKDW 256 DUP(?);/在
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服