第3章常用伪指令与汇编语言程序设计顺序程序与分支程序.ppt
《第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位,移出的三位就是余数,剩余的就是商。 余数的保留:可以选择两种方法,
2、GLUT_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 DATA WDW 65525 QOUTDW? REMADB? DATA ENDS CODESEGMENT CODE ASSUME CS:CODE, DS:DATA START:MOVAX,DATA;取数据段开始地址
3、MOVDS,AX;数据段开始地址送数据段基址寄存器 MOVAX,W;从存储器取出DS:WAX MOVBL,0;余数寄存器清0 SARAX,1;算术右移1位,符号不变,W最低位进入C RCRBL,1;带进位循环右移1位,C进入BL最高位 SARAX,1;算术右移1位,符号不变,W次低位进入C RCRBL,1;带进位循环右移1位 SARAX,1;算术右移1位,符号不变,W次低位进入C RCRBL,1;带进位循环右移1位,余数在BL高3位 MOVCL,5,数据段结束,代码段开始,数据段开始,GLUT_C 2013-08 J.CB,6,SARBL,CL;余数右移5位,将其移到BL低3位 MOVQOUT
4、,AX;保存商 MOVREMA,BL;保存余数 MOVAH, 4CH INT21H CODE ENDS END,本程序是返回操作系统,代码段结束,汇编源程序结束,GLUT_C 2013-08 J.CB,7,还有就是: W直接取低3位作为余数 然后W右移3位得到商,开始,定义W、QOUT、REMA,AXW ,REMA 7 REMA REMA AND AL,AX右移3位 QOUT AX,开始,AX右移3位: MOV CL ,3 SAR AX , CL 注意:如果是带符号数,就要用算术右移SAR,不要用逻辑右移SHR 对于无符号数,则可用SAR或SHR 这里选用SAR,GLUT_C 2013-08
5、J.CB,8, MOVAX,W;从变量W取数据 MOV REMA, 7;余数变量REMAP赋值00000111B ANDREMA,AL;余数是AL的 最低3位, MOV CL,3; SARAX, CL;算术右移3位,符号不变,AX中得到商 MOVQOUT,AX;保存商 MOVAH, 4CH INT21H 该程序结果相同,但程序代码简单了,执行速度也快了,GLUT_C 2013-08 J.CB,9,(2) 使用除法指令 DIV src 注意:对于8086处理器 为了商是字数据, 被除数32位:DXAX(DX0,AXW) 除数16位 BX8 DIV BX 商在AX, 余数在DX,对于本次运算,余数
6、为字节数据,实际上只有DL有效,.DATA W DW 65525 QOUT DW ? REMA DB ? .CODE MOVAX, DATA MOVDS, AX MOV DX,0 MOV AX,W MOV BX,8 DIV BX MOV QOUT, AX MOV REMA, DL MOVAH, 4CH INT 21H END,如果是带符号数,应该使用符号扩展指令CWD和带符号除法指令IDIV 由于题目指定是无符号数,这里可以将高16位扩展为0,用DIV除法指令,GLUT_C 2013-08 J.CB,10,例 将AX中的3位BCD数转换为二进制数存入字节变量SB中(AX中的数大于0,小于255
7、),每位十进制用一个8421编码(自然二进制编码)表示(即每一位十进制数都是用二进制表示) 十进制数的展开表达式,3位BCD码,GLUT_C 2013-08 J.CB,11,主要部分程序流程图,AL=AL+AH,AL=AL*CH,AHBL,AL=百位*10 既执行AL=AL*CH,AL=BL and 0FH AL=AL+BL,因百位*10不会大于255,AH=0,可以使用 AH右移4位,高位补0得到十位数,ALSB,保留各位十位到BL,取百位到AL ALAH,CH 10,CL=4,AH=BL,AH右移4位得到十位,由于题目给出不大于255,因此最后一次乘10加个位也只是一个字节相加,GLUT_
8、C 2013-08 J.CB,12,M0V CH,10 MOV CL,4 MOV BL,AL ;暂存十位和个位到BL, MOV AL,AH ; 百位存入AL中 MUL CH ;百位10AX MOV AH,BL SHR AH,CL ;取十位 ADD AL,AH ;百位10 + 十位AL MUL CH ;(百位10 + 十位)10 AX AND BL,0FH ;取个位 ADD AL,BL ;(百位10 + 十位)10 +个位AL ;约定结果不大于255 MOV SB,AL ; ALSB, 如果没有明确结果不大于255,则需要考虑16位结果,GLUT_C 2013-08 J.CB,13,0999的B
9、CD数转换为二进制,主要部分程序流程图,AL取百位,AX百位*10,AH取十位,百位*10+十位 AL=AL+AH,AX=AL*10,BL=BL and 0FH AX=AX+BX,因百位*10不会大于255,AH=0,可以使用 AH右移4位,高位补0得到十位数,AXSB,SB应该是字操作数(16位),BH要清0,AX为000999之间的BCD数,GLUT_C 2013-08 J.CB,14,M0V CH,10 MOV CL,4 MOV BL,AL ;暂存十位和个位到BL, MOV AL,AH ; 百位存入AL中 MUL CH ;百位10AX MOV AH,BL SHR AH,CL ;取十位 A
10、DD AL,AH ;百位10 + 十位AL MUL CH ;(百位10 + 十位)10 AX AND BL,0FH ;取个位 MOV BX,0 ; BH=0, ADD AX,BX ;(百位10 + 十位)10 +个位SB ;最后结果为16位数,不能简单+低8位 MOV SB,AX ;AXSB,GLUT_C 2013-08 J.CB,15,简单程序设计例,下面再看几个补充的例题。 例 :将存储器单元DAT1中保存的一个组合BCD数转换成两个对应ASCII码值,并存入DAT2开始的两个单元,低位在前,高位在后。,GLUT_C 2013-08 J.CB,16,BCD码转换成ASCII码数据: 非压缩
11、BCD数据在高半字节+3.例如数字5 5:0000 0101 0011 0101,得到的结果是相同的。都是在高半字节加3。,GLUT_C 2013-08 J.CB,17,该问题算法就很简单: 从DAT1取出BCD数据,先将高4位清“0”,与30H相加或进行逻辑或,存入DAT2,再取出数据,将数据逻辑右移4位(高位BCD数移到低4位,高4位变“0”,再与30H相加(或进行逻辑或),存入DAT2+1单元。 程序流程图:,GLUT_C 2013-08 J.CB,18,程序流程图,程序代码,DATA SEGMENT DAT1 DB 34H;待转换的数 DAT2 DB ?,? DATA ENDS COD
12、E SEGMENT ASSUME CS:CODE, DS:DATA STARA: 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,AL MOV AH,02H INT 21H,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,如果要送到屏幕显示,则将转换
13、结果先送DL,02送AH,调用DOS功能。 送ASCII字符显示的系统调用: 功能AH=02H, 需要显示的字符ASCII码DL , 执行 INT 21H,显示: MOV DL,AL MOV AH,02H INT 21H,AH=4CH功能调用。功能是结束本程序,返回DOS,GLUT_C 2013-08 J.CB,20,再看一个顺序程序: 编写一个计算Z=(x2-3y)/2的程序,x,y为单字节正整数,Z用2字节保存。 这是一个算术运算程序,算法设计: 首先计算 X2=X*X, 暂存该结果, 其次计算 3*y, 第三步计算 X2-3*y 第四步计算 (x2-3y)/2。该步使用算术右移实现除2运
14、算,比用除法指令执行速度快。 依据该算法,可以画出程序流程框图。,GLUT_C 2013-08 J.CB,21,X2的计算, 可以分解为,3*Y的计算, 可以分解为,GLUT_C 2013-08 J.CB,22,;数据段定义 DATA SEGMENT XDB 25 YDB 32 ZDW? DATA ENDS ;代码段开始 CODE SEGMENT ASSUME CS:CODE, DS:DATA EXPRE PROC FAR ;过程定义,远过程 START: PUSH DS ;DS:00保存的是一条返回 SUB AX,AX ;DOS 指令。 PUSH AX ;这里,将返回DOS的地址 ;压入堆栈
15、 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,AL MUL BL;X*X=X2 MOV BX,AX MOV AL , Y;取变量Y MOV AH,0;正整数,高字节直接扩展0 MOV CX,AX ADD AX ,CX;2Y ADD AX, CX;3Y XCHG AX, BX SUB AX ,BX ;X2-3Y SHR AX ,1; 右移一
16、位 /2 MOV Z , AX RET;将DS:00弹出到CS:IP EXPRE ENDP ;过程定义结束 CODE ENDS END START,RET 指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。,GLUT_C 2013-08 J.CB,24,;数据段定义 DATA SEGMENT XDB 25 YDB 32 ZDW? DATA ENDS ;代码段开始 CODE SEGMENT ASSUME CS:CODE, DS:DATA MOV AX , DATA MOV DS , AX MOV AL , X MOV BL , AL,可以使用常规返回DOS方法 INT 21H的
17、4CH功能调用,GLUT_C 2013-08 J.CB,25,MUL BL;X*X=X2 MOV BX , AX MOV AL , Y;Y MOV AH , 0 MOV CX , AX ADD AX , CX;2Y ADD AX , CX;3Y XCHG AX , BX SUB AX , BX ;X2-3Y SHR AX ,1; 右移一位 /2 MOV Z , AX MOV AH , 4CH INT 21H EXPRE ENDP ;过程定义结束 CODE ENDS END START,用INT 21 的4CH号功能调用返回DOS。,GLUT_C 2013-08 J.CB,26,例 BCD加法程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 指令 汇编语言 程序设计 顺序 程序 分支
链接地址:https://www.31doc.com/p-11772852.html