汇编语言第5章汇编语言程序设计基本技术.ppt
《汇编语言第5章汇编语言程序设计基本技术.ppt》由会员分享,可在线阅读,更多相关《汇编语言第5章汇编语言程序设计基本技术.ppt(91页珍藏版)》请在三一办公上搜索。
1、第5章 汇编语言程序设计基本技术,5.1 顺序程序设计,顺序结构是最基本的程序结构。顺序结构程序在设计上比较简单,它按指令书写的先后次序执行一系列操作,程序流程中无分支、无循环,这种程序也称为直线程序。,5.1 顺序程序设计,【例5-1】对于三个8位无符号数81H、52H和15H,编写R=81H*52H+15H的程序。分析:可以在数据段中定义一个字节型变量,依次存放三个8位无符号数81H、52H和15H,前两个无符号数的乘积为16位数,因此第三个数在与其相加之前要扩展成16位数。程序流程图如图所示。,5.1 顺序程序设计,DATA SEGMENTNUM DB 81H,52H,15HRESULT
2、 DW?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEA SI,NUM;将NUM偏移地址装入SI LEA DI,RESULT;将RESULT偏移地址装入DI MOV AL,SI;将第一个数存入AL MOV BL,SI+1;将第二个数存入BL MUL BL;两数相乘,结果存入AX MOV BL,SI+2;将第三个数存入AL MOV BH,0;将BH清0ADD AX,BX;前两个数的乘积与第三个数;相加 MOV DI,AX;存回结果 MOV AH,4CH INT 21HCODE ENDSEND START
3、,5.1 顺序程序设计,【例5-2】以BUF为首址的10个字节单元中按顺序存放着09的平方值表。查表求X单元中数(在09之间)的平方值并送回Y单元。开始平方值表的首地址装入BX结束查表求X的平方值X的平方值送回Y单元分析:09的平方值按顺序存放在连续的内存单元中,即被组织成平方值表,可以采用查表指令来实现程序功能。程序流程比较简单,流程图如图所示。,5.1 顺序程序设计,NAMEEXAMPLE5-2DATA SEGMENTBUF DB 0,1,4,9,16,25,36,49,64,81X DB 6YDB?DATA ENDSSTACKSEGMENT STACK STACK DB 100 DUP(
4、?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX LEA BX,BUF;将平方值表的首地址装入BX XLAT;查表求X的平方值 MOV Y,AL;将X的平方值送回Y单元 MOV AH,4CH INT 21H CODE ENDS END START,5.1 顺序程序设计,【例5-3】把存储单元NUM1和NUM2中的两个压缩BCD数相加,结果存入存储单元SUM。分析:把存储单元NUM1和NUM2中的两个压缩BCD数相加,流程图如图所示。,5.1 顺序程序设计,NAMEEXAMPLE
5、5-3DATA SEGMENTNUM1 DB 34HNUM2 DB 52HSUM DB 2 DUP(?)DATA ENDSCODESEGMENT ASSUMECS:CODE.DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,NUM1;将NUM1单元的内容存入AL ADD AL,NUM2;将NUM2单元的内容加到AL上 DAA;将AL中的加和调整为压缩BCD码MOV SUM,AL;将AL的内容存入SUM单元 LAHF;将FLAG低字节送入AH AND AH,01H;将相加后产生的进位放在AH中 MOV SUM+1,AH;将相加后产生的进位存入SUM+1单元 MO
6、V AH,4CH INT 21H CODEENDS END START,5.2分支程序设计,在实际应用中,往往希望程序能够对自身执行情况进行自动判断,根据判断的结果控制程序选择不同的程序段执行,这时可以使用分支结构的程序来实现。在80 x86系列微机中,转移指令是一组可以在程序执行过程中,根据不同情况进行程序转移的控制类指令,是实现分支程序设计的基础。所以要编写分支程序,必须先学习各种转移指令。,转移指令,1无条件转移指令无条件转移指令的功能是使程序无条件地转移到指定的目标地址处。无条件转移指令执行后,程序将从目标地址处的指令开始继续执行。(1)段内直接转移格式:JMP SHORT|NEAR
7、PTR 标号说明:该标号与当前无条件转移指令处于同一个代码段中。格式中的SHORT运算符表明指令代码中的操作数是8位偏移量,用补码表示。取值范围为-128+127,目标地址与当前无条件转移指令的距离在-128+127字节范围内,叫做短转移。而NEAR PTR运算符表明指令代码中的操作数是16位偏移量,用补码表示。取值范围为-32768+32767。目标地址与当前无条件转移指令的距离在-32768+32767字节范围内,叫做近转移。SHORT和NEAR PTR都可以省略不写。由汇编程序在汇编过程中自行计算得出是8位偏移量或16位偏移量。功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改
8、为标号的偏移地址,CS的内容不变。,转移指令,功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改为标号的偏移地址,CS的内容不变。【例5-4】无条件段内直接转移示例CODESEGMENTJMPSHORT LAB1LAB1:MOVAH,20HCODEENDS上例中,JMP指令与LAB1标号在同一个代码段中,且两者距离在+127字节之内,属于段内直接短转移。,转移指令,(2)段内间接转移格式:JMP存储单元地址说明:该存储单元与当前无条件转移指令处于同一个代码段中。功能:转移到指定的存储单元地址所在处的代码执行。具体操作:将IP的内容修改为存储单元的偏移地址,CS的内容不变。【例5-5】
9、无条件段内间接转移示例CODESEGMENTJMPWORD PTRBXCODEENDS上例中,JMP指令与WORD PTRBX所指的单元在同一个代码段中,属于段内间接转移。需修改IP的值。,转移指令,(3)段间直接转移格式:JMP FAR PTR 标号说明:该标号与当前无条件转移指令处于不同的代码段。功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改为标号的偏移地址,将CS的内容修改为标号所在段的段地址。【例5-6】无条件段内间接转移示例CODE1SEGMENTJMPSHORT LAB1CODE1ENDSCODE2SEGMENTLAB1:ADDAL,1CODE2ENDS上例中,JMP
10、指令与LAB1分别在代码段CODE1、CODE2中,属于段内间接转移,需同时修改IP和CS的值。,转移指令,(4)段间间接转移格式:JMP DWORD PTR存储单元地址功能:转移到指定的存储单元地址所在处的代码执行。具体操作:将IP的内容修改为存储单元的偏移地址,将CS的内容修改为存储单元地址所在段的段地址。【例5-7】无条件段间间接转移示例CODE SEGMENTJMPDWORD PTRBXCODE ENDS上例中,JMP指令与WORD PTRBX所指的单元不在同一个代码段中,属于段间间接转移,需同时修改IP和CS的值。,转移指令,2条件转移指令条件转移指令以某些标志位或标志位的逻辑运算为
11、依据,满足条件,程序转移至指定目标;不满足条件,程序顺序执行。需要注意的是,条件转移的目标地址在-128+127字节的范围之内。条件转移指令的一般格式如下:JXX 目标地址其中XX由13个字母组成,表示转移条件。如果条件成立,则程序转移到指定的目标地址,否则顺序向下执行。条件转移指令将前面的指令已设置的标志位状态作为条件。,转移指令,(1)检测单个标志位实现转移的条件转移指令。这组指令是根据一个标志位的状态来决定是否转移。,转移指令,【例5-8】检测单个标志位CF的条件转移指令示例设AH=40HSHLAH,1;AH左移1位,最高位移入CFJNCLAB2;CF=1,顺序执行LAB1处的指令,否则
12、转向LAB2LAB1:LAB2:,转移指令,(2)根据两个无符号数的比较结果实现转移的条件转移指令。,转移指令,【例5-9】根据两个无符号数的比较结果实现转移的条件转移指令示例设AH=88HCMPAH,80H;AH的内容与80H比较JBLAB2;若AH中的无符号数低于80H,则顺序;执行LAB1处的指令,否则转向LAB2LAB1:LAB2:,转移指令,(3)根据两个有符号数的比较结果实现转移的条件转移指令。,转移指令,【例5-10】根据两个有符号数的比较结果实现转移的条件转移指令示例设AH=88HCMP AH,80H;AH的内容与80H比较JLLAB2;若AH中的有符号数低于有符号数80H,;
13、则顺序执行LAB1处的指令;否则转向LAB2LAB1:LAB2:,双分支结构程序设计,双分支结构有两种典型结构,一种结构是根据某一条件成立与否选择两个程序段之一执行;另一种结构是根据某一条件成立与否确定是否执行某个程序段。两种典型双分支结构分别如图5-5(a)、(b)所示。,双分支结构程序设计,双分支结构程序设计比较简单,在8086/8088汇编语言中,编写分支程序一般利用比较指令或其他能够对标志寄存器中的标志位状态有影响的指令,根据运算结果置有关标志位的状态,再利用条件转移指令检查标志位的状态,鉴别某种条件是否成立或者某种情况是否出现,以决定所要执行的分支。,双分支结构程序设计,【例5-11
14、】编写程序,实现字符比较,若CH1、CH2两单元存放的字符相同时,在RESULT单元存字符“Y”;否则在RESULT单元存字符“N”。分析:要实现字符比较,可以先置结果为“Y”,利用比较指令CMP两个字符进行比较,之后,再利用JE指令控制当ZF=0(即两个字符不同)时,置结果为“N”。程序流程图如图所示。,双分支结构程序设计,DATA SEGMENTCHR1 DB ACHR2 DB BRESULT DB?DATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOVAL,CHR1;将字符A送AL MOV BL,
15、CHR2;将字符B送BLMOVRESULT,Y;将Y送RESULT单元 CMP AL,BL;比较AL和BL中的字符 JE NEXT;若字符相同,转NEXT MOVRESULT,N;若不同,将N送RESULT单元NEXT:MOV AH,4CH INT 21HCODE ENDS END START,双分支结构程序设计,【例5-12】设字节存储单元NUM1和NUM2中各有一无符号数,编写程序将其中较大者送回NUM1单元。分析:要找到两个无符号数中的较大数,可以在比较之后用JNZ指令考查标志位CF的状态,若CF=0,则表明NUM1中原来的数较大,可直接结束处理;否则,NUM2中的数较大,将NUM2内容
16、传送到NUM1之后结束处理。程序流程图如图所示。,双分支结构程序设计,DATA SEGMENTNUM1 DB 0A9H NUM2 DB 0B3HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOV DS,AX MOV AL,NUM1;(NUM1)AL CMPAL,NUM2;比较(AL)与(NUM2)JNC NEXT;CF=0,转移到NEXT处 XCHG AL,NUM2;交换(AL)与(NUM2)MOV NUM1,AL;将(AL)NUM1NEXT:MOV AH,4CH INT 21HCODE ENDS END START,
17、多分支结构程序设计,多分支程序有两个以上的分支。多分支结构要求考查多个条件,当某个条件成立时,执行其对应分支中的程序段。多分支结构的程序设计比较复杂,常用的实现方法有:条件转移法、地址表法和转移表法。其结构如图所示。,多分支结构程序设计,1条件转移法使用一个条件转移指令可以实现一个双分支,使用多个条件转移指令可以实现多分支。条件转移法就是使用多个条件转移指令来实现多分支结构的方法。一般适用于分支数较少的情况。【例5-13】设X单元中存有一个8位有符号整数,计算符号函数SNG(X)的值,结果送Y单元。计算符号函数SNG(X)的值,可以对X和0进行比较,再利用JGE指令根据X0是否成立,实现一个双
18、分支,在X0不成立(即X0)的分支中,令Y=-1;在X0成立的分支中,再利用JG指令实现一个双分支,若X0成立,令Y=1;若X=0成立,令Y=0。流程图如图所示。,多分支结构程序设计,DATA SEGMENTX DB 0B9HY DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX CMP X,0;比较X与0 JGE NEXT1;若X0时,转NEXT1 MOVY,-1;若X0时,则1Y JMP EXITNEXT1:JGNEXT2;若X0时,转NEXT2 MOVY,0;若X=0时,则0YJMP EX
19、IT NEXT2:MOV Y,1;若X0时,则1YEXIT:MOV AH,4CH INT 21HCODE ENDS END START,多分支结构程序设计,2地址表法利用地址表法实现多分支程序设计的思想是,在数据段中利用DW指令将n个分支入口处的偏移地址按照顺序放在一段连续的存储区中,构成地址表。设地址表的首地址为BASE,则第i个分支的入口处的偏移地址为:表地址=i*2+BASE当程序需要转向第i个分支时,只需将2*i送BX,并执行指令JMP BASEBX即可实现。,多分支结构程序设计,【例5-14】设NUM单元中存放一个字节数据,用地址表法编写程序实现从低到高逐位检测该数据,找出第一个非0
20、的位数。检测时,为0则继续检测,为1则转移到对应的处理程序段显示相应的位数。NAMEEXAMPLE5-14DATA SEGMENTNUM DB 78HADTAB DW AD0,AD1,AD 2,AD3,AD4,AD5,AD6,AD7;各分支程序段入口地址形成地址表DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,NUM;字节数据存入寄存器AL MOV DL,?CMP AL,0;检测字节数据是否为0 JZ DISP;若数据为0,转DISP MOV BX,0;将寄存器BX初始化为0,多分支结
21、构程序设计,AGAIN:SHR AL,1;AL内的数据右移1位,最低位移入CF JC NEXT;若CF=1,转NEXT INC BX;BX加1 JMP AGAIN;转AGAINNEXT:SHL BX,1;BX的内容乘2 JMP ADTABBX;计算分支程序段的入口地址,并跳转AD0:MOV DL,0;第一个非0的位数是0,送入DLJMP DISP;转DISPAD1:MOV DL,1;第一个非0的位数是1,送入DL JMP DISP;转DISP AD7:MOV DL,7;第一个非0的位数是7,送入DLDISP:MOV AH,2;将系统调用子程序编号2送AH INT 21H;2号功能调用,显示DL
22、中的字符MOV AH,4CH INT 21HCODE ENDS END START,多分支结构程序设计,3转移表法利用转移表法实现多分支程序设计的思想是,在代码段中把转移到n个分支程序段的转移指令JMP SHORT BRi(i=0,1,2,3,n-1)依次存放在一起,形成转移表。转移表首地址用标号BASE表示,把各转移指令在表中的位置,即离BASE的偏移量作为转移条件,偏移量加上表首地址BASE作为转移地址,转到表的相应位置,执行相应的无条件转移指令。以段内短转移为例,一条段内短转移指令占两个字节,则用于转向第i个分支的段内短转移指令JMP SHORT BRi在代码段中的偏移地址为:表地址=i
23、*2+BASE当程序需要转向第i个分支时,只需将i*2+BASE送BX,并执行指令JMP BX即可实现JMP SHORT BRi指令,进而转向BRi分支。,多分支结构程序设计,多分支结构程序设计,【例5-15】根据输入值(04)的不同,执行不同的操作,用转移表法编写程序。NAMEEXAMPLE5-15CODE SEGMENT ASSUME CS:CODESTART:LEA BX,TAB;转移表TAB的偏移地址装入BX MOV AH,1 INT 21H;从键盘输入一个字符,其ASCII码送AL,SUB AL,30H;将AL中的字符04转换成数字04 MOV AH,0;将AH清0 ADD AX,A
24、X;AX的内容乘以2 ADD BX,AX;计算应执行的转移指令的表地址,结果存BX JMP BX;无条件跳转到BX指示的表地址,多分支结构程序设计,TAB:JMP SHORT MODE0;转移表 JMP SHORT MODE1 JMP SHORT MODE2 JMP SHORT MODE3 JMP SHORT MODE4 MODE0:MOV DL,30H;将字符0的ASCII码30H送DL JMP EXIT;无条件跳转到EXITMODE1:MOV DL,31H;将字符1的ASCII码31H送DL JMPEXIT;无条件跳转到EXITMODE2:MOV DL,32H;将字符2的ASCII码32H
25、送DL JMP EXIT;无条件跳转到EXITMODE3:MOV DL,33H;将字符3的ASCII码33H送DL JMP EXIT;无条件跳转到EXITMODE4:MOV DL,34H;将字符4的ASCII码34H送DLEXIT:MOV AH,2 INT 21H;DOS功能调用,显示DL中的字符 MOV AH,4CH INT 21HCODE ENDS END START,5.3循环程序设计,循环控制指令循环控制指令可以控制程序中的语句序列循环执行。对于80 x86系列,所有循环指令的循环入口地址都只能在当前IP值的-128+127范围之内,即位移量只能是8位的,只能使用段内短转移格式。循环控
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 基本 技术
链接地址:https://www.31ppt.com/p-6475909.html