第5章汇编语言程序相关设计_第1页
第5章汇编语言程序相关设计_第2页
第5章汇编语言程序相关设计_第3页
第5章汇编语言程序相关设计_第4页
第5章汇编语言程序相关设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章汇编语言程序相关设计5.1顺序程序设计 nC.Bohm在1966年就提出:每个程序都由三种基本结构组成:n 顺序结构:按先后顺序执行的语句体;n 选择结构:根据条件选择两个或若干个分支之一来执行的语句结构;n 重复结构:满足条件重复执行某个语句体的语句结构。n这三种控制结构的一个共同点就是:每种结构只有一个入口和一个出口。n顺序结构是程序设计中最简单最基本的结构,在顺序结构中程序的执行流程按各条指令存储的先后顺序依次进行,不产生分支和转移。n5.2分支程序设计分支程序设计n分支程序有单路分支、两路分支和多路分支,如下图所示,它们相当于高级语言中IF-THEN、IF-THEN-ELSE和C

2、ASE语句。1. 用转移指令实现分支 n分支程序判断标志位的状态是否满足条件来实现流程的分支。因此,在一条对FL状态标志位产生影响的指令后面,用判断标志位状态的条件转移指令都可能使程序产生分支。无条件转移指令也使程序产生分支,为使程序流程清晰,无条件转移指令应尽量少用,多用将破坏程序的结构。n编程举例:对ASCII字符串加偶校验n计算机系统中常用一个字节的七位(D6D0)表示 ASCII字符,余下的最高位(D7)用作奇偶校验(parity check)位。所谓的奇(或偶)校验,就是对奇偶校验位(D7)赋“1”或“0”以使每字节8bit中“1”的总数为奇(或偶)数个;通过检查数据的奇偶性来判断其

3、在传送、存储过程中是否正确。n设从STRING单元开始存放一个ASCII字符串,已知字符串以ASCII码24H(字符$)结束,请编程对该字符串加偶校验。n具体作法是:取出一个字符,判断其是否为$,若是则结束;否则先将D7位置“1”,再判奇偶标志PF,若PF=1(偶)则将已加偶校验的数送回原单元,若PF=0(奇)则说明原数中“1”的个数已为偶数,所以原单元的内容不变;重复以上操作,直到结束。按照以上算法(请读者画出流程图)编制程序如下。DATA SEGMENT STRINGDB 36H, 57H,73H,56H,29H,96H,3EH,7FH,30H DB 20 DUP(?) DB This i

4、s a computor,24HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,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(为奇)则转移至NEXT MOV BX,AL ; 为偶则送回已加校验的字符 NEXT: INC BX ; 指向下一单元 JMP AGAIN ; 继续 DONE: M

5、OV AH,4CH INT 21HCODE ENDS ENDSTART2. 用MASM 6.x条件控制伪指令实现分支 nMASM 6.x引入了IF条件控制伪指令,类似于高级语言的分支语句功能。在汇编时,该伪指令语句自动展开,生成比较和条件转移指令序列,实现程序流程分支,简化了分支结构的编程。条件控制伪指令语句格式如下(尖括号内是必选项,方括号内是可选项) :n.IF n 分支体1;条件1为真(非0),执行分支体1n .ELSEIF n 分支体2;条件1为假,条件2为真,执行分支体2n .ELSEn 分支体3 ;条件1和条件2都为假,执行分支体3n.ENDIF2. 用MASM 6.x条件控制伪指

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

7、 .ELSEnLEABX,ADDRESSMnENDIFnJMPBX ;转到响应的入口求根n 5.3 循环程序设计 n凡重复执行的系列操作均可用循环程序来实现。 循环程序一般由四个部分组成:n 初始化部分:为循环做准备工作,如设置计数器及地址指针初值等。n 循环体:这部分是重复执行的指令序列,须精心设计。n 循环修改部分:修改地址指针及计数器或条件等,为下一次循环操作 做准备。n 循环控制部分:判断是否继续循环。n循环程序的基本结构有两种,如下图(左)所示。n结构(a)的循环控制部分在循环体之后,所以循环体至少被执行一次, 结构(b)的循环控制在循环体的前面,所以循环体有可能一次都不被执行。不管

8、哪种结构,一般都不能用转移指令直接进入循环体内,但允许在循环体内用转移指令转到循环体外。n对于循环程序设计,一般多采用两种控制方式计数控制:要求循环次数已知,控制方法是给计数器一个初值,然后每 循环一次计数器减1,直到循环计数器的值达到零后退出循环;条件控制(如结束标志控制),在这种方式中循环的次数通常未知,条 件满足(如循环结束标志出现),退出循环。n复杂算法常用多重循环实现。多重循环是一层套一层的循环嵌套,外层包含内层,各层之间不得交叉,而且不允许用转移指令从外层转到内层。结构如下图(右)所示。 5.3 循环程序设计(续)n1. 用条件转移或循环控制指令实现循环 n例:将十进制数BUFD转

9、换成二进制数,存入BUFB。n十进制数转换成二进制数可以用“按权展开相加”法。设AX中四位无符号BCD数的码元分别为ABCD,则其值为:nA*103+B*102+C*10+D= (0+A)*10+B)*10+C)*10+D。n按照上面公式,先将四位十进制数保存到BX中;AX作为中间结果(乘10加下一位BCD数)和最后结果的存储单元先清零;然后将BX中的高位BCD数移至DX(移4次,一位十进制数);加到AX中,AX再乘10;如此反复4次(四位十进制数)。乘10用加法进行:10 x=2x+8x(x分别左移2位和3位再相加)。因为加和乘都是按二进制运算规则进行的,所以最后在AX中得到转换后的二进制结

10、果,将其存入BUFB单元。程序如下:n .MODEL SMALLn .386n .DATAnBUFDDW5189HnBUFBDW?5.3 循环程序设计(续)n.CODEn.STARTUPn MOV BX,BUFDn MOV AX,0n MOV CH,4 ; 四位BCD数共需移位4次(控制外循环)n LOP1:MOV DX,0n MOV CL,4 ; 移一位BCD数的移位次数(控制内循环)n LOP2: ROL BX,1 ; 分离十进制的各位(移一位BCD数)n RCL DX,1n DEC CLn JNZ LOP2 ; 一位BCD数移完否?未完继续 ADD AX,DX ; 加下1位BCD数n C

11、MP CH,1 ; CH=1则AX已加完最低位的BCD数 JZ DONE ; 加完最后一位BCD数就转DONE(结束) ADD AX,AX ; 开始做*10运算n MOV SI,AX ; 存*2的结果 n ADD AX,AX ; *4n ADD AX,AX ; *8n ADD AX,SI ; *8与*2相加n DEC CH ; 外循环变量减1n JMP LOP1 ; 未加完全部BCD数,再继续 DONE:MOVBUFB,AX ;存结果n .EXIT 0 ; 返回操作系统 END5.3 循环程序设计(续)n例:将二进制数NUMB转换成十进制数NUMDn设AX中为16位无符号二进制数,将其转换成B

12、CD数的算法也可以用“按权展开”,具体计算公式为:(0+D15)*2+D14)*2+D1)*2+D0。AX所能表达二进制无符号数范围为0-FFFFH,转换成十进制数后范围为0-65535,超出两字节,所以按通用情况考虑,结果要存放在DXAX中。n将二十转换先定义成一个过程BTODAX保存到BX后清零,通过BX左移将二进制数的Di移入CF,执行指令ADC AX,0来实现AX+Di;再AXAX*2;反复做AXAX+Di和AXAX*2,前者做16次、后者做15次;实际上要考虑转换结果超过16位,即达到五位十进制数,超过的部分放入 DX中,所以对DX也要像对AX一样做+CF进位标志和*2操作。因为要得

13、到十进制结果,所以每次相加之后都要进行十进制调整,但基本 集指令DAA只能对AL中的内容进行调整,为要对AX和DX中的内容进行调 整,在程序开始部分定义了一个宏“XDAX”,用DAA指令逐次完成之。按题目要求,主程序将二进制数NUMB送到AX中,调用二十转换的过程 BTOD,最后存DXAX中结果。.MODEL SMALL.486XDAX MACRO ; 定义对AX和DX进行十进制调整的宏 DAA XCHGAH,AL ADC AL,0 DAA XCHG AH,ALXCHGAX,DXADCAX,0 DAA XCHGAH,AL ADC AL,0 DAA XCHG AH,ALXCHGAX,DX END

14、M.DATANUMBDW8AB9HNUMDDW?,?.STACK.CODE.STARTUPMOVAX,NUMBCALLBTODMOVNUMD,AX;保存转换结果MOVNUMD+2,DX.EXIT 0FBTODLABELFAR; 该过程也可为其他段调用(共享)BTODPROCNEAR MOV BX,AX MOV AX,0 MOV DX,0 MOV CX,16 ; +Di和*2反复做16次和15次 NEXT:ROL BX,1 ; CFDi ADC AX,0 ; AXAX+Di XDAX ; 十进制调整 CMP CX,1 ; 做完否? JZ DONE ; 加完16次则转DONE(结束返回) ADD

15、AX,AX ; 低位部分AX*2 XDAX LOOP NEXT ; 未完继续 DONE: RETBTOTENDPEND 2. 用MASM 6.x循环控制伪指令实现循环 n(1) .WHILE.ENDW伪指令语句伪指令语句n格式:.WHILE ;条件为真执行循环体 循环体.ENDWn条件表达式与条件控制语句中的相同。n(2) .REPEATUNTIL伪指令语句伪指令语句n格式:.REPEAT;重复执行循环体 循环体.UNTIL ;直到条件为真结束循环n(3) .REPEATUNTILCXZ伪指令语句伪指令语句n格式:.REPEAT 循环体.UNTILCXZ 条件表达式n语句中条件表达式是可选项,

16、没有条件表达式将汇编成一条LOOP指令(重复执行直到CX减1后等于0),带条件表达式时循环结束的条件是CX减1后等于0或条件为真。n(4) 其它控制循环执行的伪指令语句其它控制循环执行的伪指令语句n.BREAK ;无条件退出当前循环n .CONTINUE ;转入循环体的开始处,进入下一轮循环 例5-47 求10!和110的整数和。用.WHILEENDW伪指令用.REPEATUNTIL伪指令MOVEAX,1MOVEAX,1MOVBX,0MOVBX,0MOVCX,1MOVCX,1.WHILECX10MOVMEMDD,EAX;存阶乘积MOVMEMDD,EAXMOVMEMWD,BX;存累加和MOVME

17、MWD,BX5.4保护方式编程 n32位微处理器只有工作在保护方式下,才能发挥其本身的强大功能。在保护方式下:n32/36条地址线有效,可寻址4GB/64GB物理地址空间;n 扩充的存储器分段和可选的分页机制,硬件上实现了存储器的保护和 共享,支持实现虚拟存储器;n支持多任务,可快速进行任务切换,实现任务环境的保护;n 具有四个特权级和完善的特权检查机制,在进行资源共享的同时有效 地实现了任务隔离,保证代码和数据的安全;n支持虚拟86方式,在保护方式下可同时执行多个8086程序。n1. 方式的切换方式的切换n(1) 切换到保护方式切换到保护方式n从实方式切换到保护方式,要设置相应的段描述符和全

18、局描述符表GDT。n为此,要先建立64位长的段描述符结构和48位长的伪描述符结构。DESCRIPTOR STRUC;段描述符共8个字节 LIMITDW 0;16位段界限 BASELDW0;段基址低16位 BASEMDB0;段基址1623位 ATTRIBUTESDW0;16位段属性 BASEHDB0;段基址2431位DESCRIPTOR ENDS 5.4保护方式编程(续)n伪描述符在装入48位全局描述符表寄存器GDTR时要用到。nPDESCRIPTORSTRUCnLIMITDW0;16位段界限nBASEDD0;32位段基址nPDESCRIPTORENDSn切换到保护方式,必须将控制寄存器CR0的

19、第0位置1,打开A20地址线(在实方式下A19A0有效,可寻址1MB存储空间),同时保证段间跳转将代码段的选择子装入到CS寄存器。为此分别定义了三个宏,如下所示。nTO_PROTECTMACRO;使CR0.0置1的宏MOVEAX,CR0OREAX,1MOVCR0,EAXENDM nENABLE_A20MACRO;打开A20的宏PUSHAXINAL,92HORAL,2;将D1置为1OUT92H,AL;输出到92H端口,打开A20 POPAX ENDM 5.4保护方式编程(续)nJUMPFAR MACRO selector, offsets DB0EAH ;JMP指令的机器码11101010 DW

20、offsets;偏移地址 DWselector;段选择子 ENDMn(2) 切换回实方式切换回实方式n切换回实方式,所做的操作与上述的相反。其中段间跳转的宏JUMPFAR的传递参数选择实方式下的段选择子和偏移量即可,只须再定义CR0.0清0和关闭A20的两个宏。nTO_REALMACRO ;CR0.0清0的宏nMOVEAX,CR0nANDEAX,0FFFFFFFEHnMOVCR0,EAXnENDMnDISABLE_A20MACRO ;关闭A20的宏nPUSHAXnINAL,92HnANDAL,0FDH ;将D1清0nOUT92H,AL ;输出到92H端口,关闭A20nPOPAXnENDM 2.

21、 保护方式编程举例 n下面程序描述了如何从实方式转换到16位段的保护方式,以及再怎样返回实方式。n .386P;使用386指令集DATA SEGMENTUSE16;16位数据段GDT LABELBYTE;定义全局描述符表,GDT为BYTE类型EMPTYDESCRIPTOR ;第一个描述符是空的CSEGDESCRIPTOR 0FFFFH,98H,;定义代码段描述符,32位段基址未设置C_SEL=CSEG-GDT;代码段描述符选择子DSEGDEISCRIPTOR 0FFFFH,0,68H,92H,;数据段描述符D_SEL=DSEG-GDT;数据段描述符选择子GDTLEN=$-GDT;求GDT实际长度(+1)VGDTR PDESCRIPTOR GDTLEN-1, ;伪描述符,其段界限为GDT的实际长度 ;32位段基址未设置(暂为缺省值0)DATA ENDSCODE SEGMENT USE16;定义16位代码段 ASSUME CS:CODE,DS:DATA;段关联2. 保护方式编程举例(续)n;以下为切换回实方式的步骤。首先将实模式下段选择子和偏移地址装入CS:IP, 清除指令预取队列n JUMPFAR ,Realmode: TO_REAL;CR0.0清0,切换回实方式 DISAB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论