资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,4,章 基本汇编语言程序设计,教学重点,综合应用第,2,章硬指令和第,3,章伪指令,第,4,章从程序结构角度展开程序设计,重点掌握:,分支结构程序设计,循环结构程序设计,子程序结构程序设计,2,汇编语言程序设计的基本方法,程序设计的解题基本步骤如下,:,分析问题,寻找解决问题的思路、方法、算法,描述算法,编写程序实现算法,设计测试数据和预期计算结果,上机调试程序,3,汇编语言程序设计的基本方法,程序的几种基本结构,程序的基本结构有三种:,顺序结构、分支结构、循环结构,顺序结构:,按语句的书写顺序依次执行。,1,循环结构:,由条件是否成立,确定是否重复执行某段程序。,3,分支结构:,根据不同的条件判断结果,执行不同的程序段,实现程序分支。,2,4,4.1,顺序程序设计,顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构,例,4.1,计算,例,4.2,移位,例题 代码转换,5,.model small,.stack,.data,X,dw,5,Y,dw,6,Z,dw,7,W,dw,?,.code,.startup,mov,ax,X,add ax,Y,add ax,Z,mov,W,ax,.exit 0,end,例,4.1,:,设有,3,个字变量,X,、,Y,和,Z,,初值分别为,5,、,6,和,7,,试求出三者之和,并存入字变量,W,中。,分析,:,(1),在数据段中定义,4,个变量,X,、,Y,、,Z,和,W,,并按要求初始化;,定义数据,(2),代码段主体依次相加,3,个变量,最后将结果存入,W,中。,功能实现,6,例,4.2,:设有一个,64,位的数据,要求将它整个算术左移,8,位,分析:,为保证数据各位正确移位,,64,位数据的,8,个字节应从高字节开始、依右而左依次左移,8,位(一个字节),采用字节传送指令。,12,34,56,78,87,65,43,21,00,qvar0,qvar1,qvar2,qvar3,qvar4,qvar5,qvar6,qvar7,64,位数据左移,8,位,7,例,4.2,1/2,.data,qvar,dq,1234567887654321h,.code,mov,al,byte,ptr,qvar6,mov,byte,ptr,qvar7,al,mov,al,byte,ptr,qvar5,mov,byte,ptr,qvar6,al,mov,al,byte,ptr,qvar4,mov,byte,ptr,qvar5,al,mov,al,byte,ptr,qvar3,mov,byte,ptr,qvar4,al,8,例,4.2,2/2,mov,al,byte,ptr,qvar2,mov,byte,ptr,qvar3,al,mov,al,byte,ptr,qvar1,mov,byte,ptr,qvar2,al,mov,al,byte,ptr,qvar0,mov,byte,ptr,qvar1,al,mov,byte,ptr,qvar0,0,12,34,56,78,87,65,43,21,h,34,56,78,87,65,43,21,00,h,移位后,9,例题 代码转换,1/2,;查表法,实现一位,16,进制数转换为,ASCII,码显示,.model small,.stack,.data,ASCIIdb 30h,31h,32h,33h,34h,35h,db 36h,37h,38h,39h,;0,9,的,ASCII,码,db 41h,42h,43h,44h,45h,46h,;A,F,的,ASCII,码,hexdb 0bh,;,任意设定了一个待转换的一位,16,进制数,10,例题 代码转换,2/2,.code,.startup,mov,bx,offset,ASCII,;BX,指向,ASCII,码表,mov,al,hex,;AL,取得一位,16,进制数,正是,ASCII,码表中位移,and al,0fh,;,只有低,4,位是有效的,高,4,位清,0,xlat,;,换码:,ALDS:BX,AL,mov,dl,al,;,入口参数:,DLAL,mov,ah,2,;02,号,DOS,功能调用,int,21h,;,显示一个,ASCII,码字符,.exit 0,end,11,4.2,分支程序设计,分支程序根据条件是真或假决定执行与否,判断的条件是各种指令,如,CMP,、,TEST,等执行后形成的状态标志,转移指令,Jcc,和,JMP,可以实现分支控制;还可以采用,MASM 6.x,提供的条件控制伪指令实现,单分支:求绝对值等,双分支:例,4.3,等,多分支:例,4.4,等,12,单分支程序设计,条件成立跳转,否则顺序执行分支语句体;,注意选择正确的条件转移指令和转移目标地址,13,例题 求绝对值,;计算,AX,的绝对值,cmp,ax,0,jns,nonneg,;,分支条件:,AX0,neg,ax,;,条件不满足,求补,nonneg,:,mov,result,ax,;,条件满足,;计算,AX,的绝对值,cmp,ax,0,jl,yesneg,;,分支条件:,AX,0,jmp,nonneg,yesneg,:,neg,ax,;,条件不满足,求补,nonneg,:,mov,result,ax,;,条件满足,Good,Bad,14,例题 无符号数除以,2,;将,AX,中存放的无符号数除以,2,,如果是奇数,则加,1,后除以,2,test ax,01h,;,测试,AX,最低位,jz,even,;,最低位为,0,:,AX,为偶数,add ax,1,;,最低位为,1,:,AX,为奇数,需要加,1,even:,rcr,ax,1,;AXAX,2,;,如果采用,SHR,指令,则不能处理,AX,FFFFH,的特殊情况,15,双分支程序设计,条件成立跳转执行第,2,个分支语句体,否则顺序执行第,1,个分支语句体。,注意第,1,个分支体后一定要有一个,JMP,指令跳到第,2,个分支体后,16,例题 显示,BX,最高位,-,方法,1,shl,bx,1,;BX,最高位移入,CF,jc,one,;CF,1,,即最高位为,1,,转移,mov,dl,0,;CF,0,,即最高位为,0,,,DL,0,jmp,two,;,一定要跳过另一个分支体,one:,mov,dl,1,;DL,1,two:,mov,ah,2,int,21h,;,显示,17,例题 显示,BX,最高位,-,方法,2,shl,bx,1,;BX,最高位移入,CF,jnc,one,;CF,0,,即最高位为,0,,转移,mov,dl,1,;CF,1,,即最高位为,1,,,DL,1,jmp,two,;,一定要跳过另一个分支体,one:,mov,dl,0,;DL,0,two:,mov,ah,2,int,21h,;,显示,18,例题 显示,BX,最高位,-,方法,3,mov,dl,0,;DL,0,shl,bx,1,;BX,最高位移入,CF,jnc,two,;CF,0,,最高位为,0,,转移,mov,dl,1,;CF,1,,最高位为,1,,,DL,1,two:,mov,ah,2,int,21h,;,显示,双分支程序可以改为单分支程序,基本思想:,先默认执行一个分支!,19,例,4.3,判断有无实根,1/2,.startup,mov,al,_b,imul,al,mov,bx,ax,;BX,中为,b,2,分析:,二元一次方程有根的条件是:,b,2,4ac0,。依据题意,首先计算出,b,2,和,4ac,,然后比较两者大小,根据比较结果分别给,tag,赋不同的值。,20,例,4.3,判断有无实根,2/2,mov,al,_a,imul,_c,mov,cx,4,imul,cx,;AX,中为,4ac,(,DX,无有效数据),cmp,bx,ax,;,比较二者大小,jge,yes,;,条件满足?,mov,tag,0,;,第一分支体:条件不满足,,tag0,jmp,done,;,跳过第二个分支体,yes:,mov,tag,1,;,第二分支体:条件满足,,tag1,done:.exit 0,21,;,寄存器,AL,中是字母,Y,或,y,,则令,AH,0,;,;,否则令,AH,1,;,采用中断,从键盘输入一个字符,cmp,al,Y,;AL,是大写,Y,否?,jz,next,;,是,转移,cmp,al,y,;AL,是小写,y,否?,jz,next,;,是,转移,mov,ah,-1,;,不是,Y,或,y,,则,AH,1,,结束,jmp,done,;,一定要跳过另一个分支体,next:,mov,ah,0,;,是,Y,或,y,,则,AH,0,,结束,done:.,例题 单分支和双分支,22,多分支程序设计,多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如:,or,ah,ah,;,等效于,cmp,ah,0,jz,function0,;ah,0,,,转向,function0,dec,ah,;,等效于,cmp,ah,1,jz,function1,;ah,1,,,转向,function1,dec,ah,;,等效于,cmp,ah,2,jz,function2,;ah,2,,,转向,function2,图示,23,多分支结构,AH=0,function0,Y,N,AH=1,function1,Y,N,AH=2,function2,Y,N,24,地址表形成多分支,需要在数据段事先安排一个按顺序排列的,转移地址表,输入的数字作为偏移量。因为只有,2,个字节,16,位偏移地址,所以偏移量需要乘,2,关键是要理解,间接寻址方式,JMP,指令,例,4-4,程序根据键盘输入,1-8,数字转向,8,个不同的处理程序段。,DEMO4-4,动画,25,地址表形成多分支,分析:,在数据段定义一个存储区,顺序存放,8,个处理程序段的,起始地址,。由于所有程序都在一个代码段,所以,用字定义伪指令,DW,存入偏移地址即可。,另外,为了具有良好的交互性,程序首先提示输入数字,然后判断是否为,1 8,。不是有效数字,则重新提示;是有效数字,则形成表中的正确偏移,并按地址表跳转。,地址表,分支,1,地址,分支,2,地址,.,table,dw,disp1,disp2,disp3,disp4,.,26,.data,msg,db Input number(18):,0dh,0ah,$,msg1db Chapter 1:.,0dh,0ah,$,msg2db Chapter 2:.,0dh,0ah,$,.,msg8db Chapter 8:.,0dh,0ah,$,table,dw,disp1,disp2,disp3,disp4,dw,disp5,disp6,disp7,disp8,;,取得各个标号的偏移地址,例,4.4,数据段,1/3,此处等同于,offset disp1,27,start1:,mov,dx,offset,msg,;,提示输入数字,mov,ah,9,int,21h,mov,ah,1;,等待按键,int,21h,cmp,al,1,;,数字,8,?,ja,start1,and ax,000fh,;,将,ASCII,码转换成数字,例,4.4,代码段,2/3,28,dec,ax,shl,ax,1,;,等效于,add,ax,ax,mov,bx,ax,jmp,table,bx,;,(段内)间接转移:,IP,table+bx,start2:,mov,ah,9,int,21h,.exit 0,disp1:,mov,dx,offset,msg1,;,处理程序,1,jmp,start2,.,例,4.4,代码段,3/3,可以改为,call,tablebx,对应修改为,ret,DEMO 4-4,29,4.3,循环程序设计,循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体,循环指令和转移指令可以实现循环控制;
展开阅读全文