汇编语言程序设计(4)

上传人:tia****nde 文档编号:67704156 上传时间:2019-01-08 格式:PPT 页数:22 大小:355.31KB
返回 下载 相关 举报
汇编语言程序设计(4)_第1页
第1页 / 共22页
汇编语言程序设计(4)_第2页
第2页 / 共22页
汇编语言程序设计(4)_第3页
第3页 / 共22页
汇编语言程序设计(4)_第4页
第4页 / 共22页
汇编语言程序设计(4)_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《汇编语言程序设计(4)》由会员分享,可在线阅读,更多相关《汇编语言程序设计(4)(22页珍藏版)》请在金锄头文库上搜索。

1、第5章 汇编语言程序设计,教学目标:掌握常用程序设计方法和保护方式下的编程、模块化程序设计以及汇编语言和C语言的混合编程。 教学重点:循环程序设计 教学难点:循环程序设计,5.1顺序程序设计,C.Bohm在1966年就提出:每个程序都由三种基本结构组成: 顺序结构:按先后顺序执行的语句体; 选择结构:根据条件选择两个或若干个分支之一来执行的语句结构; 重复结构:满足条件重复执行某个语句体的语句结构。 这三种控制结构的一个共同点就是:每种结构只有一个入口和一个出口。 顺序结构是程序设计中最简单最基本的结构,在顺序结构中程序的执行流程按各条指令存储的先后顺序依次进行,不产生分支和转移。 5.2分支

2、程序设计 分支程序有单路分支、两路分支和多路分支,如下图所示,它们相当于高级语言中IF-THEN、IF-THEN-ELSE和CASE语句。,1. 用转移指令实现分支,分支程序判断标志位的状态是否满足条件来实现流程的分支。 因此,在一条对FL状态标志位产生影响的指令后面,用判断标志位状态的条件转移指令都可能使程序产生分支。 无条件转移指令也使程序产生分支,为使程序流程清晰,无条件转移指令应尽量少用,多用将破坏程序的结构。 编程举例:对ASCII字符串加偶校验 计算机系统中常用一个字节的七位(D6D0)表示 ASCII字符,余下的最高位(D7)用作奇偶校验(parity check)位。所谓的奇(

3、或偶)校验,就是对奇偶校验位(D7)赋“1”或“0”以使每字节8bit中“1”的总数为奇(或偶)数个;通过检查数据的奇偶性来判断其在传送、存储过程中是否正确。 设从STRING单元开始存放一个ASCII字符串,已知字符串以ASCII码24H(字符“$“)结束,请编程对该字符串加偶校验。 具体作法是:取出一个字符,判断其是否为$,若是则结束;否则先将D7位置“1”,再判奇偶标志PF,若PF=1(偶)则将已加偶校验的数送回原单元,若PF=0(奇)则说明原数中“1”的个数已为偶数,所以原单元的内容不变;重复以上操作,直到结束。按照以上算法(请读者画出流程图)编制程序如下。,DATA SEGMENT

4、STRING DB 36H, 57H,73H,56H,29H,96H,3EH,7FH,30H DB 20 DUP(?) DB This is a computor,24H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,STRING MOV DL,24H ; 结束标志送DL AGAIN: MOV AL,BX CMP AL,DL ; 与结束标志比较 JZ DONE ; AL为结束标志转结束 OR AL,80H ; 把AL的D7值1 JNP NEXT ; PF=0(为奇)则转移至NE

5、XT MOV BX,AL ; 为偶则送回已加校验的字符 NEXT: INC BX ; 指向下一单元 JMP AGAIN ; 继续 DONE: MOV AH,4CH INT 21H CODE ENDS END START,2. 用MASM 6.x条件控制伪指令实现分支,MASM 6.x引入了IF条件控制伪指令,类似于高级语言的分支语句功能。在汇编时,该伪指令语句自动展开,生成比较和条件转移指令序列,实现程序流程分支,简化了分支结构的编程。 条件控制伪指令语句格式如下(尖括号内是必选项,方括号内是可选项) : .IF 分支体1 ;条件1为真(非0),执行分支体1 .ELSEIF 分支体2 ;条件1

6、为假,条件2为真,执行分支体2 .ELSE 分支体3 ;条件1和条件2都为假,执行分支体3 .ENDIF,2. 用MASM 6.x条件控制伪指令实现分支(续),条件表达式中的变量,用DB、DW、DD定义的一律作为无符号数; 若比较的是带符号数,则应该用SBYTE、SWORD、SDWORD伪指令定义之。 采用寄存器数、存储器数或常数作比较时,也默认为无符号数; 若要作为有符号数,必须用SBYTE PTR或SWORD PTR等操作符改变其原来的属性。 若比较中有一个数是带符号数,则条件表达式强制另一个数也为带符号数。 例:下面程序段比较b2-4ac,若0转ADDRESSR去求两个不相等的实根,若=

7、0转ADDRESSE去求单实根,若AX LEA BX,ADDRESSR .ELSEIF SWORD PTR DX=AX LEA BX,ADDRESSE .ELSE LEA BX,ADDRESSM ENDIF JMP BX ;转到响应的入口求根 ,5.3 循环程序设计,凡重复执行的系列操作均可用循环程序来实现。 循环程序一般由四个部分组成: 初始化部分:为循环做准备工作,如设置计数器及地址指针初值等。 循环体:这部分是重复执行的指令序列,须精心设计。 循环修改部分:修改地址指针及计数器或条件等,为下一次循环操作 做准备。 循环控制部分:判断是否继续循环。 循环程序的基本结构有两种,如下图(左)所

8、示。 结构(a)的循环控制部分在循环体之后,所以循环体至少被执行一次, 结构(b)的循环控制在循环体的前面,所以循环体有可能一次都不被执行。不管哪种结构,一般都不能用转移指令直接进入循环体内,但允许在循环体内用转移指令转到循环体外。 对于循环程序设计,一般多采用两种控制方式 计数控制:要求循环次数已知,控制方法是给计数器一个初值,然后每 循环一次计数器减1,直到循环计数器的值达到零后退出循环; 条件控制(如结束标志控制),在这种方式中循环的次数通常未知,条 件满足(如循环结束标志出现),退出循环。 复杂算法常用多重循环实现。多重循环是一层套一层的循环嵌套,外层包含内层,各层之间不得交叉,而且不

9、允许用转移指令从外层转到内层。结构如下图(右)所示。,5.3 循环程序设计(续),1. 用条件转移或循环控制指令实现循环 例:将十进制数BUFD转换成二进制数,存入BUFB。 十进制数转换成二进制数可以用“按权展开相加”法。设AX中四位无符号BCD数的码元分别为ABCD,则其值为: A*103+B*102+C*10+D= (0+A)*10+B)*10+C)*10+D。 按照上面公式,先将四位十进制数保存到BX中; AX作为中间结果(乘10加下一位BCD数)和最后结果的存储单元先清零;然后将BX中的高位BCD数移至DX(移4次,一位十进制数); 加到AX中,AX再乘10;如此反复4次(四位十进制

10、数)。 乘10用加法进行:10x=2x+8x(x分别左移2位和3位再相加)。 因为加和乘都是按二进制运算规则进行的,所以最后在AX中得到转换后的二进制结果,将其存入BUFB单元。程序如下: .MODEL SMALL .386 .DATA BUFD DW 5189H BUFB DW ?,5.3 循环程序设计(续),.CODE .STARTUP MOV BX,BUFD MOV AX,0 MOV CH,4 ; 四位BCD数共需移位4次(控制外循环) LOP1: MOV DX,0 MOV CL,4 ; 移一位BCD数的移位次数(控制内循环) LOP2: ROL BX,1 ; 分离十进制的各位(移一位B

11、CD数) RCL DX,1 DEC CL JNZ LOP2 ; 一位BCD数移完否?未完继续 ADD AX,DX ; 加下1位BCD数 CMP CH,1 ; CH=1则AX已加完最低位的BCD数 JZ DONE ; 加完最后一位BCD数就转DONE(结束) ADD AX,AX ; 开始做*10运算 MOV SI,AX ; 存*2的结果 ADD AX,AX ; *4 ADD AX,AX ; *8 ADD AX,SI ; *8与*2相加 DEC CH ; 外循环变量减1 JMP LOP1 ; 未加完全部BCD数,再继续 DONE: MOV BUFB,AX ;存结果 .EXIT 0 ; 返回操作系统

12、 END,5.3 循环程序设计(续),例:将二进制数NUMB转换成十进制数NUMD 设AX中为16位无符号二进制数,将其转换成BCD数的算法也可以用“按权展开”,具体计算公式为:(0+D15)*2+D14)*2+D1)*2+D0。 AX所能表达二进制无符号数范围为0-FFFFH,转换成十进制数后范围为0-65535,超出两字节,所以按通用情况考虑,结果要存放在DXAX中。 将二十转换先定义成一个过程BTOD AX保存到BX后清零,通过BX左移将二进制数的Di移入CF,执行指令ADC AX,0来实现AX+Di; 再AXAX*2; 反复做AXAX+Di和AXAX*2,前者做16次、后者做15次;

13、实际上要考虑转换结果超过16位,即达到五位十进制数,超过的部分放入 DX中,所以对DX也要像对AX一样做+CF进位标志和*2操作。 因为要得到十进制结果,所以每次相加之后都要进行十进制调整,但基本 集指令DAA只能对AL中的内容进行调整,为要对AX和DX中的内容进行调 整,在程序开始部分定义了一个宏“XDAX”,用DAA指令逐次完成之。 按题目要求,主程序将二进制数NUMB送到AX中,调用二十转换的过程 BTOD,最后存DXAX中结果。,.MODEL SMALL .486 XDAX MACRO ; 定义对AX和DX进行十进制调整的宏 DAA XCHG AH,AL ADC AL,0 DAA XC

14、HG AH,AL XCHG AX,DX ADC AX,0 DAA XCHG AH,AL ADC AL,0 DAA XCHG AH,AL XCHG AX,DX ENDM .DATA NUMB DW 8AB9H NUMD DW ?,? .STACK .CODE .STARTUP MOV AX,NUMB CALL BTOD MOV NUMD,AX ;保存转换结果 MOV NUMD+2,DX .EXIT 0,FBTOD LABEL FAR ; 该过程也可为其他段调用(共享) BTOD PROC NEAR MOV BX,AX MOV AX,0 MOV DX,0 MOV CX,16 ; +Di和*2反复做

15、16次和15次 NEXT: ROL BX,1 ; CFDi ADC AX,0 ; AXAX+Di XDAX ; 十进制调整 CMP CX,1 ; 做完否? JZ DONE ; 加完16次则转DONE(结束返回) ADD AX,AX ; 低位部分AX*2 XDAX LOOP NEXT ; 未完继续 DONE: RET BTOT ENDP END,2. 用MASM 6.x循环控制伪指令实现循环,(1) .WHILE.ENDW伪指令语句 格式: .WHILE ;条件为真执行循环体 循环体 .ENDW 条件表达式与条件控制语句中的相同。 (2) .REPEATUNTIL伪指令语句 格式: .REPEAT ;重复执行循环体 循环体 .UNTIL ;直到条件为真结束循环 (3) .REPEATUNTILCXZ伪指令语句 格式: .REPEAT 循环体 .UNTILCXZ 条件表达式 语句中条件表达式是可选项,没有条件表达式将汇编成一条LOOP指令(重复执行直到CX减1后等于0),带条件表达式时循

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号