欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    汇编语言第5章汇编语言程序设计基本技术.ppt

    • 资源ID:6475909       资源大小:396.32KB        全文页数:91页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    汇编语言第5章汇编语言程序设计基本技术.ppt

    第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 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,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(?)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 顺序程序设计,NAMEEXAMPLE5-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单元 MOV AH,4CH INT 21H CODEENDS END START,5.2分支程序设计,在实际应用中,往往希望程序能够对自身执行情况进行自动判断,根据判断的结果控制程序选择不同的程序段执行,这时可以使用分支结构的程序来实现。在80 x86系列微机中,转移指令是一组可以在程序执行过程中,根据不同情况进行程序转移的控制类指令,是实现分支程序设计的基础。所以要编写分支程序,必须先学习各种转移指令。,转移指令,1无条件转移指令无条件转移指令的功能是使程序无条件地转移到指定的目标地址处。无条件转移指令执行后,程序将从目标地址处的指令开始继续执行。(1)段内直接转移格式:JMP SHORT|NEAR PTR 标号说明:该标号与当前无条件转移指令处于同一个代码段中。格式中的SHORT运算符表明指令代码中的操作数是8位偏移量,用补码表示。取值范围为-128+127,目标地址与当前无条件转移指令的距离在-128+127字节范围内,叫做短转移。而NEAR PTR运算符表明指令代码中的操作数是16位偏移量,用补码表示。取值范围为-32768+32767。目标地址与当前无条件转移指令的距离在-32768+32767字节范围内,叫做近转移。SHORT和NEAR PTR都可以省略不写。由汇编程序在汇编过程中自行计算得出是8位偏移量或16位偏移量。功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改为标号的偏移地址,CS的内容不变。,转移指令,功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改为标号的偏移地址,CS的内容不变。【例5-4】无条件段内直接转移示例CODESEGMENTJMPSHORT LAB1LAB1:MOVAH,20HCODEENDS上例中,JMP指令与LAB1标号在同一个代码段中,且两者距离在+127字节之内,属于段内直接短转移。,转移指令,(2)段内间接转移格式:JMP存储单元地址说明:该存储单元与当前无条件转移指令处于同一个代码段中。功能:转移到指定的存储单元地址所在处的代码执行。具体操作:将IP的内容修改为存储单元的偏移地址,CS的内容不变。【例5-5】无条件段内间接转移示例CODESEGMENTJMPWORD PTRBXCODEENDS上例中,JMP指令与WORD PTRBX所指的单元在同一个代码段中,属于段内间接转移。需修改IP的值。,转移指令,(3)段间直接转移格式:JMP FAR PTR 标号说明:该标号与当前无条件转移指令处于不同的代码段。功能:转移到标号指定的代码处执行。具体操作:将IP的内容修改为标号的偏移地址,将CS的内容修改为标号所在段的段地址。【例5-6】无条件段内间接转移示例CODE1SEGMENTJMPSHORT LAB1CODE1ENDSCODE2SEGMENTLAB1:ADDAL,1CODE2ENDS上例中,JMP指令与LAB1分别在代码段CODE1、CODE2中,属于段内间接转移,需同时修改IP和CS的值。,转移指令,(4)段间间接转移格式:JMP DWORD PTR存储单元地址功能:转移到指定的存储单元地址所在处的代码执行。具体操作:将IP的内容修改为存储单元的偏移地址,将CS的内容修改为存储单元地址所在段的段地址。【例5-7】无条件段间间接转移示例CODE SEGMENTJMPDWORD PTRBXCODE ENDS上例中,JMP指令与WORD PTRBX所指的单元不在同一个代码段中,属于段间间接转移,需同时修改IP和CS的值。,转移指令,2条件转移指令条件转移指令以某些标志位或标志位的逻辑运算为依据,满足条件,程序转移至指定目标;不满足条件,程序顺序执行。需要注意的是,条件转移的目标地址在-128+127字节的范围之内。条件转移指令的一般格式如下:JXX 目标地址其中XX由13个字母组成,表示转移条件。如果条件成立,则程序转移到指定的目标地址,否则顺序向下执行。条件转移指令将前面的指令已设置的标志位状态作为条件。,转移指令,(1)检测单个标志位实现转移的条件转移指令。这组指令是根据一个标志位的状态来决定是否转移。,转移指令,【例5-8】检测单个标志位CF的条件转移指令示例设AH=40HSHLAH,1;AH左移1位,最高位移入CFJNCLAB2;CF=1,顺序执行LAB1处的指令,否则转向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,;则顺序执行LAB1处的指令;否则转向LAB2LAB1:LAB2:,双分支结构程序设计,双分支结构有两种典型结构,一种结构是根据某一条件成立与否选择两个程序段之一执行;另一种结构是根据某一条件成立与否确定是否执行某个程序段。两种典型双分支结构分别如图5-5(a)、(b)所示。,双分支结构程序设计,双分支结构程序设计比较简单,在8086/8088汇编语言中,编写分支程序一般利用比较指令或其他能够对标志寄存器中的标志位状态有影响的指令,根据运算结果置有关标志位的状态,再利用条件转移指令检查标志位的状态,鉴别某种条件是否成立或者某种情况是否出现,以决定所要执行的分支。,双分支结构程序设计,【例5-11】编写程序,实现字符比较,若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,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内容传送到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,多分支结构程序设计,多分支程序有两个以上的分支。多分支结构要求考查多个条件,当某个条件成立时,执行其对应分支中的程序段。多分支结构的程序设计比较复杂,常用的实现方法有:条件转移法、地址表法和转移表法。其结构如图所示。,多分支结构程序设计,1条件转移法使用一个条件转移指令可以实现一个双分支,使用多个条件转移指令可以实现多分支。条件转移法就是使用多个条件转移指令来实现多分支结构的方法。一般适用于分支数较少的情况。【例5-13】设X单元中存有一个8位有符号整数,计算符号函数SNG(X)的值,结果送Y单元。计算符号函数SNG(X)的值,可以对X和0进行比较,再利用JGE指令根据X0是否成立,实现一个双分支,在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 EXIT 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的位数。检测时,为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,多分支结构程序设计,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中的字符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*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,AX;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送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位的,只能使用段内短转移格式。循环控制指令都隐含使用CX作为循环计数器。在循环之前,将循环次数送入CX,在循环过程中,对CX进行递减的逆向计数。,循环控制指令,1LOOP指令格式:LOOP 目标地址功能:首先进行循环次数计数,即执行(CX)1CX。然后判断循环是否结束,若(CX)0,则转向目标地址继续执行循环体;否则循环结束,顺序执行下一条指令。2LOOPE/LOOPZ指令格式:LOOPE/LOOPZ 目标地址功能:首先进行循环次数计数,即执行(CX)1CX。然后判断循环是否结束,若(CX)0 且 ZF=1,则转向目标地址继续执行循环体;否则循环结束,顺序执行下一条指令。3LOOPNE/LOOPNZ指令格式:LOOPE/LOOPZ 目标地址功能:首先进行循环次数计数,即执行(CX)1CX。然后判断循环是否结束,若(CX)0且ZF=0,则转向目标地址继续执行循环体;否则循环结束,顺序执行下一条指令。,串操作指令,所谓串,指的是存储器中一序列字节或字单元。指令系统提供的串操作指令可以用来对这一序列字节或字单元的内容进行某种操作。串操作指令有其独有的寻址方式。源操作数地址由DS:SI表示,目的操作数地址由ES:DI表示。这里的DS也可以由其它段寄存器代替,但ES不能由其它段寄存器代替。每次执行串操作指令除了对操作数进行相应的操作外,同时自动修改变址寄存器SI和DI的内容,使它们指向下一个字节或字单元。修改变址寄存器的规则是:如果方向标志位DF=0,则根据串的类型是字节串还是字串,将变址寄存器分别加1或加2;如果方向标志位DF=1,则对于字节串或字串,变址寄存器分别减1或减2。为便于对串中多个单元进行操作,指令系统还提供了重复前缀,重复次数由CX的内容确定。,串操作指令,1重复前缀(1)重复前缀REP格式:REP 串操作指令功能:重复执行串操作指令,直到(CX)=0为止。其执行过程如图5-12所示。,串操作指令,(2)零条件重复前缀REPZ/REPE格式:REPZ/REPE 串操作指令功能:重复执行串操作指令,直到(CX)=0或者ZF=0为止。其执行过程如图5-13所示。,串操作指令,(3)非零条件重复前缀REPNZ/REPNE格式:REPNZ/REPNE串操作指令功能:重复执行串操作指令,直到(CX)=0或者ZF=1为止。其执行过程如图5-14所示。,串操作指令,2串操作指令(1)串传送指令MOVS格式:串传送指令MOVS的格式有显式和隐式两种。显式:MOV 目的操作数,源操作数隐式:MOVB/MOVW功能:将DS:SI所指的字节或字单元内容传送至ES:DI 所指的字节或字单元,同时根据DF的内容修改变址寄存器SI和DI的内容。其中显式格式中虽然有目的操作数和源操作数,但它们只是提供给汇编程序类型检查用,并不改变寻址方式,隐式格式如用MOVB,则传送字节数据,如用MOVW,则传送字数据。对标志位的影响:无,串操作指令,【例5-16】已知在数据段从STR1单元开始存放了一个字符串,编写程序实现将字符串传送到从STR2单元开始的数据区中。要求用串操作指令实现。NAMEEXAMPLE5-16DATA SEGMENTSTR1 DB This is an example program.CNTEQU$-STR1STR2 DB CNT DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化DS MOV ES,AX;初始化ES MOV CX,CNT;字符串长度送CX LEASI,STR1;SI指向源串起始单元 LEADI,STR2;DI指向目的串起始单元 CLD;DF清0 REP MOVSB;重复执行串传送指令MOVSB,次数由CX内容确定 MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,串操作指令,(2)取串指令LODS格式:取串指令LODS的格式有显式和隐式两种。显式:LODS 源操作数隐式:LODSB/LODSW功能:将DS:SI所指的字节或字单元内容传送至寄存器AL或AX,同时根据DF的内容修改变址寄存器SI的内容。其中显式格式中虽然有源操作数,但它只是提供给汇编程序类型检查用,并不改变寻址方式,隐式格式如用LODSB,则传送字节数据至AL,如用LODSW,则传送字数据至AX。对标志位的影响:无LODS指令一般不和重复前缀配合使用。例如:STDLODSW在上例中,执行一次LODSW指令相当于执行下面三条指令:MOVAX,WORD PTR SIDEC SIDECSI,串操作指令,(3)存串指令STOS格式:存串指令STOS的格式有显式和隐式两种。显式:STOS 目的操作数隐式:STOSB/STOSW功能:将寄存器AL或AX的内容传送至ES:DI所指的字节或字单元,同时根据DF的内容修改变址寄存器DI的内容。其中显式格式中虽然有目的操作数,但它只是提供给汇编程序类型检查用,并不改变寻址方式,隐式格式如用STOSB,则将AL的内容传送字节单元,如用STOSW,则将AX的内容传送至字单元。对标志位的影响:无STOS指令和重复前缀配合使用,可以将数据区中某一存储区中放入相同的内容。,串操作指令,【例5-17】编写程序实现将存储器中从BUF单元开始的50个字节单元内容置为全1(0FFH)。要求使用串操作指令实现。NAMEEXAMPLE5-17DATA SEGMENTBUF DB 50 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化DS MOV ES,AX;初始化ES MOV CX,50;字符串长度送CX LEADI,BUF;DI指向目的串起始单元 CLD;DF清0 MOVAL,0FFH;数值全1(0FFH)送ALREP MOVSB;重复执行存串指令STOS,次数由CX内容确定 MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,串操作指令,(4)串比较指令CMPS格式:串比较指令CMPS的格式有显式和隐式两种。显式:CMPS 目的操作数,源操作数隐式:CMPSB/CMPSW功能:用DS:SI所指的字节或字单元内容减去ES:DI 所指的字节或字单元内容,并且根据指令执行结果设置标志位,然后根据DF的内容修改变址寄存器SI和DI的内容。对标志位的影响:ZF、SF、CF、OF、AF和PF。【例5-18】已知在数据段中有两个字符串STR1和STR2,编写程序实现两个字符串的比较,若两字符串相等,则将“Y”送RESULT单元,否则,将“N”送RESULT单元。要求使用串操作指令实现。,串操作指令,DATA SEGMENTSTR1 DB This is an example program.CNT EQU$-STR1STR2 DBThis is not an example program.RESULT DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化DS MOV ES,AX;初始化ES MOV CX,CNT;字符串长度送CX LEASI,STR1;SI指向源串起始单元 LEADI,STR2;DI指向目的串起始单元 CLD;DF清0 MOVRESULT,Y;将Y送RESULT单元 REPZ CMPSB;重复执行串比较指令CMPS JZNEXT;字符串相等,转NEXT MOVRESULT,N;字符串不相等,将N送RESULT单元NEXT:MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,串操作指令,(5)串扫描指令SCAS格式:串扫描指令SCAS的格式有显式和隐式两种。显式:SCAS 目的操作数隐式:SCASB/SCASW功能:用累加器AL或AX的内容减去ES:DI 所指的字节或字单元内容,并且根据指令执行结果设置标志位,然后根据DF的内容修改变址寄存器DI的内容。对标志位的影响:ZF、SF、CF、OF、AF和PF。【例5-19】已知在数据段中有字符串STR1,编写程序实现若STR1中存在字符Z,则将“Y”送RESULT单元,否则,将“N”送RESULT单元。要求使用串操作指令实现。,串操作指令,DATA SEGMENTSTR1 DB ASAFDDSDGZDFGHFHFCNT EQU$-STR1RESULT DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV ES,AX;初始化ES MOV CX,CNT;字符串长度送CX LEADI,STR1;SI指向串起始单元 MOVAL,Z;搜索对象Z送AL CLD;DF清0 MOVRESULT,Y;将Y送RESULT单元REPNZ SCASB;重复执行串扫描指令SCAS JZNEXT;字符串中存在字符Z,转NEXT MOVRESULT,N;字符串中不存在字符Z,将N送RESULT单元NEXT:MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,循环程序结构,循环程序有两种基本的结构形式:“先循环后判断”和“先判断后循环”。两种结构形式最大的不同之处就是:“先循环后判断”形式至少要执行一次循环;而“先判断后循环”形式能够实现循环次数为零的循环。如图所示。,循环程序结构,循环序无论采用哪种结构形式,其程序结构通常都包括循环初始化部分、循环体部分和循环控制部分。(1)循环初始化部分:设置循环参数的初始值。包括循环次数的初始值、地址指针的初始值和其它循环参数的初始值等。循环初始化部分在整个循环程序中只执行一遍,但是它决定了循环的起始点。(2)循环体部分:这是循环工作的主体部分。循环体中的语句序列主要实现需要重复执行的操作和运算,以及对循环参数的修改。循环参数主要是地址指针、循环计数器和其它循环参数。这些参数通常要按照某种规律进行修改,如1、2、。(3)循环控制部分:判断循环条件是否成立,循环条件成立,转移到目标地址重复执行循环体,否则循环结束,顺序执行下一条语句。,循环控制方法,循环的控制方法很多,比较常用的方法有:计数控制和条件控制。1用计数控制循环用计数控制循环的使用条件是循环程序初始化时,必须能够确定循环的次数,可以是一个常量或有确定值的变量或表达式,也可以是前面运算或操作的结果。用计数控制循环一般使用CX作为循环计数器,每循环一次,CX计数一次,直到计数器达到预定值,循环结束。用计数控制循环又分正计数法和倒计数法。正计数法先将循环计数器清0,每循环一次,CX加1,然后将CX的内容与预定循环次数进行比较,若CX的内容达到预定循环次数,循环结束,否则,转移到循环体的开始处继续执行循环;倒计数法先将循环计数器置为预定循环次数,每循环一次,CX减1,然后检查CX的内容是否为0,若CX的内容为0,循环结束,否则,转移到循环体的开始处继续执行循环。,循环控制方法,(1)正计数法程序设计举例【例5-21】已知BUF单元开始存放一个字节型数据块,编写程序统计数据块中正数和负数的个数,用正计数法控制循环。分析:要实现用正计数法控制循环统计数据块中正数和负数的个数。首先将循环计数器CX清0;取数据块中的第一个值,对该值和 0进行比较,若其值大于等于0,转到一个分支,将正数个数加1;否则,将负数个数加1。每次比较并执行完相应分支之后,将循环计数器CX加1,比较循环计数器CX的内容和数据块长度,若CX小于数据块长度,则转循环其始位置,取数据块中的下一个数据,继续比较。否则,循环结束。,循环控制方法,DATASEGMENTBUFDB-12,125,3,-48,64,20,-31;数据块COUNTEQU$-BUF;COUNT为数据块的长度PLUSDB?;存放正数个数开始0BL、0DLMINUSDB?;存放负数个数DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV BL,0;暂存负数个数 MOV DL,0;暂存正数个数 MOV SI,OFFSET BUF;BUF单元偏移地址送SI MOV CX,0;循环计数器CX清0 LOOP1:MOV AL,SI;数据块中的一个值送AL CMP AL,0;比较(AL)和0的大小 JGE NEXT0;若(AL)0,NEXT0 INC BL;否则,BL中负数个数加1 JMP NEXT1;无条件跳转到NEXT1NEXT0:INC DL;DL中的正数个数加1NEXT1:INCSI;SI加1,指示下一个数据 INC CX;循环计数器CX加1 CMP CX,COUNT;比较(CX)和COUNT JL LOOP1;(CX)COUNT,转LOOP1 MOV MINUS,BL;负数个数送MINUS单元 MOV PLUS,DL;正数个数送PLUS单元 MOV AH,4CH INT 21H CODE ENDS END START,循环控制方法,(2)倒计数法程序设计举例【例5-22】编写程序将BUF单元开始的50个字节存储单元全部清0,用倒计数法控制循环。分析:用倒计数法控制循环实现将BUF单元开始的50个字节存储单元全部清0,将BUF单元偏移地址送SI,将循环计数器CX置为存储单元个数50,每次循环将将SI指示的1字节数据清0,SI个内容加1,指示下一个字节,循环计数器CX的内容减1,循环计数器内容CX不等于0,继续循环,否则,结束循环。,循环控制方法,DATASEGMENT BUF DB50 DUP(?);50个字节存储单元DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV CX,50;循环次数50送CXLOOP1:MOV BYTE PTR SI,0 INC SI LOOP LOOP1;(CX)0,转LOOP1 MOV AH,4CH INT 21HCODEENDS END START,循环控制方法,2按条件控制循环有许多问题虽然需要编制循环程序来求解。但是其循环次数事先无法确定,不过其循环次数与问题中的某些条件有关,这些条件在程序中是可以检测到的,这时可以采用条件控制循环。【例5-23】编制程序产生500以内的裴波纳契数列,并将数列的个数存放在LEN字节单元中。用条件控制法实现。结束开始OFFSET FIBODI0CL0AX,1BX(AX)+(BX)AX(CL)+1CL(AX)(DI)(AX)500?YN交换(AX)、(BX)(DI)+1DI存结果:(CL)LEN图5-18 例5-23程序流程图分析:要实现产生500以内的裴波纳契数列,无法预先知道循环的次数,但是可以确定循环结束的条件,即当某次循环所产生的裴波纳契数大于或等于500时,结束循环。否则,继续执行循环。,循环控制方法,DATASEGMENTFIBODB50H DUP(0);存放数列数据LEN DB?;存放数列数据个数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDI,OFFSET FIBOXORCL,CL;置数列数据个数为0MOVAX,0MOVBX,1LOP:CMPAX,500JAELEN1ADDAX,BX;产生一个数列数据XCHGAX,BXINCCL;数列数据个数计数ADDDI,TYPEFIBOJMPLOPLEN1:MOVLEN,CL;存回数列数据个数MOVAH,4CHINT21HCODEENDSENDSTART,多重循环程序设计,循环结构按照循环层次可以分为单重循环和多重循环,单重循环结构能够解决比较简单的问题,但是实际问题往往很复杂,使用单重循环可能无法解决,此时就要采用多重循环结构。所谓多重循环,指循环体内还有循环,也就是循环嵌套。对于多重循环结构,内、外循环体不能交叉。转移指令只能从循环结构内转出或可在同层循环内转移。,多重循环程序设计,【例5-24】设在以GRADE为首址的字节单元中依次存放着某个班级50名学生的五门成绩,现要统计每门课程的平均成绩,并将其存放在AVEBUF开始的字节单元。分析:该问题需要采用双重循环结构实现,外循环控制课程门数,内循环计算五门课程的总分。,多重循环程序设计,DATASEGMENTGRADE DB 84,92,78,49,85,83,72,78,85,95AVEBUFDB50 DUP(?)DATAENDS CODESEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOVDS,AX MOV BX,OFFSET GRADE MOV DI,OFFSET AVEBUF MOV SI,BXMOVCX,5;外循环计数LOP1:MOVBX,SISUBBX,5 PUSHCX MOVAL,0 MOVCX,50;内循环计数,LOP2:ADDBX,5 LOOPLOP2 MOVAH,0 MOVDL,50 DIVDL;求平均分 MOVDI,AL;存回平均分 INCSI INCDI POPCX LOOPLOP1 MOV AH,4CH INT 21HCODEENDS END START,5.4子程序设计,如果一个程序的不同位置上多次需要使用某一给定功能的指令序列,通常可以将这一指令序列,再加上一些必要的语句构成一个独立的程序段。在程序的某个位置上,如需执行这一指令序列时,就用调用指令转到这个程序段,待执行完毕后,再返回到原来的程序,继续执行。这个可以被程序调用的程序段称为子程序,也叫过程。而调用它的程序称为主程序或调用程序。从调用程序的某个位置转移到子程序称为子程序调用,而子程序执行完毕,重新回到原来调用程序的位置,称为子程序返回。在主程序中调用指令的下一

    注意事项

    本文(汇编语言第5章汇编语言程序设计基本技术.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开