第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt

上传人:laozhun 文档编号:2383688 上传时间:2023-02-16 格式:PPT 页数:55 大小:308KB
返回 下载 相关 举报
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt_第1页
第1页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt_第2页
第2页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt_第3页
第3页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt_第4页
第4页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt》由会员分享,可在线阅读,更多相关《第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt(55页珍藏版)》请在三一办公上搜索。

1、GLUT_C 2013-08 J.CB,1,3.3.程序的基本结构,最基本的程序结构:顺序结构、分支结构、循环结构。,子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。,GLUT_C 2013-08 J.CB,2,3.3.1 简单程序设计,例:编写程序将字变量W中的无符号数W=65525除以8,将商保存在字变量QOUT中,将余数保存在字节变量REMA中。算法分析:可以使用除法指令,也可以使用右移三位实现除以8的运算。65525 0FFF5H 1111 1111 1111 0101B,(1)右移3位,移出的三位就是余数,剩余的就是商。余数的保留:可以选择两种方法,GLUT_

2、C 2013-08 J.CB,3,GLUT_C 2013-08 J.CB,4,使用伪指令定义W、QOUT、REMA三个内存单元,W、QOUT为16位,REMA为8位。,这里的结束是结束应用程序,返回操作系统。可以使用INT 21H的 4CH号功能调用返回操作系统 MOV AH,4CH INT 21H,GLUT_C 2013-08 J.CB,5,DATA SEGMENT DATAWDW 65525QOUTDW?REMADB?DATA ENDSCODESEGMENT CODEASSUME CS:CODE,DS:DATASTART:MOVAX,DATA;取数据段开始地址MOVDS,AX;数据段开始地

3、址送数据段基址寄存器MOVAX,W;从存储器取出DS:WAXMOVBL,0;余数寄存器清0SARAX,1;算术右移1位,符号不变,W最低位进入CRCRBL,1;带进位循环右移1位,C进入BL最高位SARAX,1;算术右移1位,符号不变,W次低位进入CRCRBL,1;带进位循环右移1位SARAX,1;算术右移1位,符号不变,W次低位进入CRCRBL,1;带进位循环右移1位,余数在BL高3位MOVCL,5,数据段结束,代码段开始,数据段开始,GLUT_C 2013-08 J.CB,6,SARBL,CL;余数右移5位,将其移到BL低3位MOVQOUT,AX;保存商MOVREMA,BL;保存余数MOV

4、AH,4CHINT21HCODE ENDSEND,本程序是返回操作系统,代码段结束,汇编源程序结束,GLUT_C 2013-08 J.CB,7,还有就是:W直接取低3位作为余数然后W右移3位得到商,开始,定义W、QOUT、REMA,AXW,REMA 7REMA REMA AND AL,AX右移3位QOUT AX,开始,AX右移3位:MOV CL,3SAR AX,CL注意:如果是带符号数,就要用算术右移SAR,不要用逻辑右移SHR对于无符号数,则可用SAR或SHR这里选用SAR,GLUT_C 2013-08 J.CB,8,MOVAX,W;从变量W取数据MOV REMA,7;余数变量REMAP赋值

5、00000111BANDREMA,AL;余数是AL的 最低3位,MOV CL,3;SARAX,CL;算术右移3位,符号不变,AX中得到商MOVQOUT,AX;保存商MOVAH,4CHINT21H该程序结果相同,但程序代码简单了,执行速度也快了,GLUT_C 2013-08 J.CB,9,(2)使用除法指令DIV src注意:对于8086处理器为了商是字数据,被除数32位:DXAX(DX0,AXW)除数16位 BX8DIV BX 商在AX,余数在DX,对于本次运算,余数为字节数据,实际上只有DL有效,.DATAW DW 65525QOUT DW?REMA DB?.CODEMOVAX,DATAMO

6、VDS,AXMOV DX,0MOV AX,WMOV BX,8DIV BXMOV QOUT,AXMOV REMA,DLMOVAH,4CHINT 21HEND,如果是带符号数,应该使用符号扩展指令CWD和带符号除法指令IDIV由于题目指定是无符号数,这里可以将高16位扩展为0,用DIV除法指令,GLUT_C 2013-08 J.CB,10,例 将AX中的3位BCD数转换为二进制数存入字节变量SB中(AX中的数大于0,小于255),每位十进制用一个8421编码(自然二进制编码)表示(即每一位十进制数都是用二进制表示)十进制数的展开表达式,3位BCD码,GLUT_C 2013-08 J.CB,11,主

7、要部分程序流程图,AL=AL+AH,AL=AL*CH,AHBL,AL=百位*10既执行AL=AL*CH,AL=BL and 0FHAL=AL+BL,因百位*10不会大于255,AH=0,可以使用AH右移4位,高位补0得到十位数,ALSB,保留各位十位到BL,取百位到ALALAH,CH 10,CL=4,AH=BL,AH右移4位得到十位,由于题目给出不大于255,因此最后一次乘10加个位也只是一个字节相加,GLUT_C 2013-08 J.CB,12,M0V CH,10MOV CL,4MOV BL,AL;暂存十位和个位到BL,MOV AL,AH;百位存入AL中MUL CH;百位10AXMOV AH

8、,BLSHR AH,CL;取十位ADD AL,AH;百位10+十位ALMUL CH;(百位10+十位)10 AXAND BL,0FH;取个位ADD AL,BL;(百位10+十位)10+个位AL;约定结果不大于255MOV SB,AL;ALSB,如果没有明确结果不大于255,则需要考虑16位结果,GLUT_C 2013-08 J.CB,13,0999的BCD数转换为二进制,主要部分程序流程图,AL取百位,AX百位*10,AH取十位,百位*10+十位AL=AL+AH,AX=AL*10,BL=BL and 0FHAX=AX+BX,因百位*10不会大于255,AH=0,可以使用AH右移4位,高位补0得

9、到十位数,AXSB,SB应该是字操作数(16位),BH要清0,AX为000999之间的BCD数,GLUT_C 2013-08 J.CB,14,M0V CH,10MOV CL,4MOV BL,AL;暂存十位和个位到BL,MOV AL,AH;百位存入AL中MUL CH;百位10AXMOV AH,BLSHR AH,CL;取十位ADD AL,AH;百位10+十位ALMUL CH;(百位10+十位)10 AXAND BL,0FH;取个位MOV BX,0;BH=0,ADD AX,BX;(百位10+十位)10+个位SB;最后结果为16位数,不能简单+低8位MOV SB,AX;AXSB,GLUT_C 2013

10、-08 J.CB,15,简单程序设计例,下面再看几个补充的例题。例:将存储器单元DAT1中保存的一个组合BCD数转换成两个对应ASCII码值,并存入DAT2开始的两个单元,低位在前,高位在后。,GLUT_C 2013-08 J.CB,16,BCD码转换成ASCII码数据:非压缩BCD数据在高半字节+3.例如数字55:0000 0101 0011 0101,得到的结果是相同的。都是在高半字节加3。,GLUT_C 2013-08 J.CB,17,该问题算法就很简单:从DAT1取出BCD数据,先将高4位清“0”,与30H相加或进行逻辑或,存入DAT2,再取出数据,将数据逻辑右移4位(高位BCD数移到

11、低4位,高4位变“0”,再与30H相加(或进行逻辑或),存入DAT2+1单元。程序流程图:,GLUT_C 2013-08 J.CB,18,程序流程图,程序代码,DATA SEGMENT DAT1 DB 34H;待转换的数DAT2 DB?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTARA:MOV AX,DATA MOV DS,AX;送段地址 LEA SI,DAT1 LEA DI,DAT2 MOV AL,SI AND AL,0FH ADD AL,30H MOV DI,AL MOV AL,SI,显示:MOV DL,ALMOV AH,02HINT 21

12、H,GLUT_C 2013-08 J.CB,19,MOV CL,4 SHR AL,CL ORL AL,30H MOV DI+1,AL MOV AH,4CH INT 21H CODE ENDS END START,如果要送到屏幕显示,则将转换结果先送DL,02送AH,调用DOS功能。送ASCII字符显示的系统调用:功能AH=02H,需要显示的字符ASCII码DL,执行 INT 21H,显示:MOV DL,ALMOV AH,02HINT 21H,AH=4CH功能调用。功能是结束本程序,返回DOS,GLUT_C 2013-08 J.CB,20,再看一个顺序程序:编写一个计算Z=(x2-3y)/2的程

13、序,x,y为单字节正整数,Z用2字节保存。这是一个算术运算程序,算法设计:首先计算 X2=X*X,暂存该结果,其次计算 3*y,第三步计算 X2-3*y第四步计算(x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。依据该算法,可以画出程序流程框图。,GLUT_C 2013-08 J.CB,21,X2的计算,可以分解为,3*Y的计算,可以分解为,GLUT_C 2013-08 J.CB,22,;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE,DS:DATA EXPRE PRO

14、C FAR;过程定义,远过程START:PUSH DS;DS:00保存的是一条返回 SUB AX,AX;DOS 指令。PUSH AX;这里,将返回DOS的地址;压入堆栈 MOV AX,DATA,操作系统会自动在DS:00处安排一条返回操作系统的指令,故子程序开始处向堆栈中压入 DS:00执行RET指令,则就是转到DS:00返回DOS,GLUT_C 2013-08 J.CB,23,MOV DS,AX;数据段首地址(基地址)MOV AL,X;取变量X MOV BL,ALMUL BL;X*X=X2MOV BX,AX MOV AL,Y;取变量YMOV AH,0;正整数,高字节直接扩展0 MOV CX,

15、AXADD AX,CX;2YADD AX,CX;3YXCHG AX,BX SUB AX,BX;X2-3YSHR AX,1;右移一位/2MOV Z,AXRET;将DS:00弹出到CS:IP EXPRE ENDP;过程定义结束 CODE ENDSEND START,RET 指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。,GLUT_C 2013-08 J.CB,24,;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE,DS:DATA MOV AX,DATAMOV DS,AXMOV

16、 AL,XMOV BL,AL,可以使用常规返回DOS方法 INT 21H的4CH功能调用,GLUT_C 2013-08 J.CB,25,MUL BL;X*X=X2MOV BX,AX MOV AL,Y;YMOV AH,0 MOV CX,AXADD AX,CX;2YADD AX,CX;3YXCHG AX,BX SUB AX,BX;X2-3YSHR AX,1;右移一位/2MOV Z,AXMOV AH,4CHINT 21HEXPRE ENDP;过程定义结束 CODE ENDSEND START,用INT 21 的4CH号功能调用返回DOS。,GLUT_C 2013-08 J.CB,26,例 BCD加法

17、程序,例如:已知字变量W1、W2分别存放两个非压缩的BCD数,编写程序求两数之和,并将结果存入SUM字变量中。注意:W!,W2为2为字变量(2字节)压缩BCD数,0099,它们的和则可能为3位BCD数,故SUM应该定义3个字节(用DB定义三个字节)。计算机内部只有二进制运算指令,对于BCD数运算,是十进制数,用二进制运算指令运算,需要进行调整。加法、减法、乘法在运算后进行调整除法在运算前先进行调整。只有字节运算才能进行调整 非压缩BCD数加法调整 AAA(压缩BCD数加法用DAA),GLUT_C 2013-08 J.CB,27,压缩BCD加法后,用DAA调整非压缩BCD加法后,用AAA调整压缩

18、BCD减法后,用DAS调整非压缩BCD加法后,用AAS调整压缩BCD加法后,用AAM调整(压缩的BCD乘法,不能调整)除法指令前用AAD调整(存放在AX中的两位非压缩BCD数),将SUM+2清0,然后进行带进位的循环左移,就可将CY移进SUM+2最低位,其余位=0,GLUT_C 2013-08 J.CB,28,例如:0809+0607=01 05 06,程序段如下:,DATA SEGMENT W1 DW 0809HW2 DW 06078HSUM DB 3 DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DAT

19、A MOV DS,AX;MOV AL,BYTE PTR W1;取第一个数,AL09H ADD AL,BYTE PTR W2;AL09H+07=10h,AF=1 AAA;AL06H,产生CF=1 MOV SUM,AL;保存个位,进位信号在CF MOV AL,BYTE PTR W1+1;AL08H,GLUT_C 2013-08 J.CB,29,ADC AL,BYTE PTR W2+1;AL0FH,CF=0 AAA;AL05H,CF=1 MOV SUM+1,AL;存百位和千位 MOV SUM+2,0;处理向百位的进位,先将SUM+2 RCL UM+2,1;清0,然后用带进位循环左移指;令将进位位移到

20、SUM+2最低位实际上,在SUM定义时,已经初始化为0,程序中可以不清0 定义的变量W1,W2,SUM在汇编语言源程序中可以直接使用,汇编程序在对源程序进行汇编时,可以识别是从变量所存放的存储器中取出数据实际上就是汇编程直接寻址指令 MOV AL,W1,为了书写简单,我们直接写成 MOV AL,W1.,GLUT_C 2013-08 J.CB,30,以上例子,有一些只给出了实现所要求功能的核心部分分代码,没有给出段定义的完整部分。有一些则给出了包含段定义的完整代码;段定义的格式是相似的,可以参照教材上的例子和前面的段定义例子编写。教材上还有一些顺序程序的例子,由于时间关系,就不一一列举了。,GL

21、UT_C 2013-08 J.CB,31,顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。,GLUT_C 2013-08 J.CB,32,3.3.2 分支程序的设计,就是利用CPU的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。,GLUT_C 2013-08 J.CB,33,二分支结构,分支结构,判断,B,N,Y,ABC1,ABC2,GLUT_C 2013-08 J.CB,34,多分支结构,GLUT_C 2013-08 J.CB,35,也可以按照条件编码实现多分枝转移,例如段内间接转移指令JMP REG

22、转移到CS:AXJMP WORD PTR MEM转移到CS:MEM,K是一个不小于2的整数。,GLUT_C 2013-08 J.CB,36,我们还是通过实例来讨论。例:内存单元M中有一个16位的带符号数,求它的绝对值,并将结果放回原处。算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用NEG指令)。有了算法,可以画出程序流程图。,GLUT_C 2013-08 J.CB,37,转移目的指令给出标号(符号地址),N_DATA,负数,该标号为了阅读程序方便,判断数据的符号,在X86中就是判断SF标志位,数据传送指令不改变标志位

23、,因此用一条逻辑运算指令ORL Ax,AX,它不改变AX的值,但设置标志位SF,GLUT_C 2013-08 J.CB,38,DATA SEGMENT M DW 789AH;可以任意输入一个数 DATA ENDSCODE SEGMENT ASSUME CS:CODE2,DS:DATA2START:MOV AX,DATA MOV DS,AX LEA SI,M;MOV SI,OFFSET M MOV AX,SI ORL AX,AX;AND AX,AX JNS DONE;符号为SF=0转移到DONEN_DATA:NEG AX;负数,利用NEG指令求负DONE:MOV SI,AX MOV AH,4CH

24、 INT 21H CODE ENDS END,GLUT_C 2013-08 J.CB,39,多分支程序,对分支程序,可以由这种2分支程序构成。,GLUT_C 2013-08 J.CB,40,计算函数的程序,x是十六位长度字数据,算法分析:取出数据X,判断它的符号,首先判断是否=0,如果不是,则是负数,Y=-1,如果是,还须再次判断是否等于0。程序流程框图为:,GLUT_C 2013-08 J.CB,41,GLUT_C 2013-08 J.CB,42,DATA SEGMENT X DW-8 Y DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE3,DS:DATA3ST

25、ART:MOV AX,DATA3;设置段基址 MOV DS,AXLEA SI,X;取偏移地址MOV AX,SIAND AX,AX,GLUT_C 2013-08 J.CB,43,JNS LP1;SF=0,转到LP1LP0:MOV Y,0FFH;=0,继续判断,;=0转到LP3LP2:MOV Y,01H;X0时,y=1LJMP END1LP3:MOV Y,00H;X=0时,Y=0END1:MOV AH,4CH;返回操作系统INT 21H CODE ENDSEND START,GLUT_C 2013-08 J.CB,44,教材上有一个例子,,算法分析:取出数据X,Y,异或,判断符号,SF=1,表明符

26、号异号Z=0;SF=0,表明符号相同,判断是否X0,是,Z=1,否Z=-1。,GLUT_C 2013-08 J.CB,45,多分支的另一种实现方法,除了用二分支指令实现多分支外,还可以用以下指令实现:JMP REG;JMP WORD PTR MEM例如,我们要依据AL中的低4位数据(015)不同,分别转移到对应的分支去执行,每个分支约定占用200字节空间。这类指令应用方法如下:,GLUT_C 2013-08 J.CB,46,ANLAL,0FHMOV BL,100MULBLMOVAX,FUN0;JMPAXFUN0:.ORG FUN0+100FUN1:;FUN1-FUN0=100;可以用定位伪指令

27、确定每个;分支相距的距离ORG FUN14+100;只要保证这段空间能存下FUN15:;这段代码。,也可以是一个转移表,利用远转移指令转到各处理程序,这样各功能分值的距离就比较小,而且相距的字节数也相同。,GLUT_C 2013-08 J.CB,47,例3.9 从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。DATA SEGMENTIBUF DB 3,0,3 DUP(0)SBDB 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOV DX,OFFSET IBUF;键入2位十六进制数MOV AH,10I

28、NT 21HMOV AX,WORD PTR IBUF+2;键入字符从+2单元开始,取出送AXSUB AX,3030H;字符变为十六进制数CMP AL,0AHJB LNSUB7;09,ASCII-30H就是它对应的HEX值SUB AL,7;AF,ASCII-37H就是它对应的HEX值,GLUT_C 2013-08 J.CB,48,LNSUB7:CMP AH,0AHJB LNSUB7SUB AH,7HNSUB7:MOV CL,4;将AX中的数拼合成一个字节SHL AL,CLOR AL,AHMOV SB,ALMOV AH,4CHINT 21HCODE ENDSEND,GLUT_C 2013-08 J

29、.CB,49,例3.10 某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支;另一种是跳转表法,直接实现多分支.,GLUT_C 2013-08 J.CB,50,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:128127DATASEGMENTINPUT DB Input(07):$DATA ENDSCODE SEGMENTMOVAX,DATAMOVDS,AX MOV DX,OFFSET INPUT;显示提示符 MOV AH,9;09号功

30、能是显示字符串,$是字符串结束符 INT 21H;MOV AH,1;等待键入一个字符到AL,INT 21H CMP AL,0;为0字符则转P0 JE P0 CMP AL,1;为1字符则转P1 JE P1,GLUT_C 2013-08 J.CB,51,CMP AL,2JE P2 CMP AL,3JE P3 CMP AL,4 JE P4CMP AL,5JE P5CMP AL,6JE P6CMP AL,7JE P7JMP DOWN;不是07则退出程序,GLUT_C 2013-08 J.CB,52,P0:MOV DL,0;键入0则执行P0程序规定的功能 JMP EXITP1:MOV DL,1;键入1则

31、执行P1程序规定的功能 JMP EXIT P7:MOV DL,7;键入7则执行P7程序规定的功能 JMP EXITEXIT:MOV AH,4CH;分支程序一定要注意汇合到结束处 INT 21HCODE ENDSEND,转移到汇集点,汇集点,所有分支在执行完各自的功能后,都无条件转移到汇集点,转移到汇集点,转移到汇集点,GLUT_C 2013-08 J.CB,53,方法二:跳转表法 利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处)在数据区造一地址表,存放不同的分支入口地址;设表的首地址为PTAB,每一个入口地址占一个字单元。P0的入口地址=PTAB,Pi的入口地址PTA

32、B2i若将2iBX,则 JMP PTAB BX 可转到Pi入口处,GLUT_C 2013-08 J.CB,54,INPUT DB INPUT(07):$PTAB DW P0,P1,P2,P3,P4,P5,P6,P7;定义地址表 LEA DX,INPUT;显示提示 MOV AH,9 INT 21H MOV AH,1;等待键入07的数字 INT 21H CMP AL,0;检查输入数据,不是07则退出 JB EXIT CMP AL,7 JA EXIT AND AX,07H;0-7,最低3位有用 ADD AX,AX;i2BX MOV BX,AX JMP PTABBX;(PTAB2i)PiIPEXIT:RET,AH=09H功能是显示字符串,字符串以$字符结束,字符串开始地址由DX指定,GLUT_C 2013-08 J.CB,55,P0:MOV DL,0;键入0则显示0以替代P0程序 JMP DOWNP1:MOV DL,1;键入1则显示1以替代P1程序 JMP DOWN P7:MOV DL,7 DOWN:MOV AH,2 INT 21H JMP EXIT,键入的ASC码为无符号数,所以,用JB、JA等指令而不能用JG、JL等.,汇集点,所有分支在执行完各自的功能后,都无条件转移到汇集点,无条件转移返回指令地址,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号