汇编,ASM,MASM,计算机,编程第5章.ppt_第1页
汇编,ASM,MASM,计算机,编程第5章.ppt_第2页
汇编,ASM,MASM,计算机,编程第5章.ppt_第3页
汇编,ASM,MASM,计算机,编程第5章.ppt_第4页
汇编,ASM,MASM,计算机,编程第5章.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

第五章 循环与分支程序设计,5.1 循环程序设计 5.2 分支程序设计 5.3 如何在实模式下发挥80386及其后继机型的优势,1. 编写汇编语言程序步骤 l 分析实际问题,确定解决问题的算法 l 按算法画出程序流程图 l 按流程图编写程序 l上机调试, 运行程序,注:本教材所讨论的编程环境只限于 在DOS操作系统下的实模式,2. 判断程序质量的标准 程序的正确性 程序的可读性 程序的执行时间 程序所占内存大小,3几种程序结构 顺序结构 循环结构 分支结构 子程序结构,顺序结构形式,循环结构形式,当型循环 (当条件成立进入循环),直到型循环 (直到条件成立退出循环),分支结构形式,Y,Y,N,N,分支结构形式,1多处调用完成同一功能的子程: code SEGMENT start: 、 CALL subp 、 CALL subp 、 CALL subp 、 MOV AH, 4CH INT 21H subp PROC 、 、 RET subp ENDP code ENDS END start,2模块化程序设计: code SEGMENT begin: CALL sub1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21H sub1 PROC 、 RET sub1 ENDP sub2 PROC 、 RET sub2 ENDP sub3 PROC 、 RET sub3 ENDP code ENDS END begin,子程结构形式,注意返回DOS语句位置,5.1.1 循环程序的结构形式,5.1 循环程序设计,(1)DO-WHILE结构 (2)DO-UNTIL结构,例1 将寄存器BX中的内容以十六进制形式显示出来。 (二进制 十六进制),有关字符、数码转换的处理 1. 计算机处理字符时,常用的字符编码是ASCII 码。 2. 数字和字母的ASCII码是一个有序序列 数字09 : 30H 39H 大写字母AZ : 41H 5AH 小写字母az : 61H 7AH,5.1.2 循环程序设计方法,3. 计算机处理信息时,其对象都是二进制数。 外设(显示器、打印机、键盘等) 用ASCII码与CPU进行信息传送。 例如: (1) 在键盘上按下某一字符键 (如9),键盘接口 向键盘缓冲区送去的是该字符的ASCII码(如 39H),而不是送数字09H。 ( 2) 在文本方式下,要在显示器上显示某一字符 (如A),须将该字符的ASCII码(如41H)送显示缓 冲区,不是送数字0AH。,计算机要利用显示器、键盘等外设时, 须据程序设计的需要进行有关转换。,例 将CPU运算的结果通过显示器显示时,如二进制数“A9” 需将结果转换成其对应的ASCII码才能进行显示。,例 CPU要处理从键盘输入的某一数据,如键入“1234” 需将该数据串进行转换十六进制后才能应用。,例1 将BX寄存器中的内容以十六进制形式显示出来。,BX是一个16位寄存器 二进制 1010 1001 0011 1110,用十六进显示时,每4位用一个字符显示,共4个 其中: 0000 0 30H , 1010 A 41H 0001 1 31H , 1011 B 42H 、 、 1001 9 39H , 1111 F 46H,十六进制 A 9 3 E,屏幕上的显示 A 9 3 E,对应的ASCII 41H 39H 33H 45H,算法: 取出要显示的某4位,转换为对应的ASCII码, 再调用DOS系统功能进行显示。,(1) 对于00001001(09), 先扩展成一个字节,高4位清0, 加上30H后, 即可得字符09对应的ASCII码。 0000 0001B + 30H= 31H 0000 1001B + 30H=39H 0001B 1 1001B 9,(2) 对于10101111(AF), 先扩展成一个字节,高4位清0, 加上30H后, 还要再加上07H,才能得到AF 对应的ASCII码 0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H 1010B A 1111B F,code SEGMENT ASSUME CS:code start: MOV CH, 4 ;字符个数 rotate: MOV CL, 4 ;循环移位次数 ROL BX, CL ;取显示位的值 MOV AL, BL ;保存在AL中 AND AL, 0FH ;清除高4位 ADD AL, 30H ;转变为数字的ASCII CMP AL, 3aH ;大于3aH, 则应转变 JL print ;为数字09的ASCII ADD AL, 07H ;为字母AF的ASCII print: MOV DL,AL ;送 ASCII字符到DL MOV AH, 2 ;显示DL中的字符 INT 21H DEC CH ;显示结束? JNZ next MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,例5.4 将正数n插入一个已整序的字数组的正确位置。 x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 mov ax, n mov array_head-2, 0ffffh mov si, 0 compare: cmp array_endsi, ax jle insert mov bx, array_endsi mov array_endsi+2, bx sub si, 2 jmp short compare insert: mov array_endsi+2, ax,寻址方式?,1、负数在计算机内部使用补码表示 2、数组的访问方式: 寄存器相对寻址 基址变址寻址 相对基址变址寻址 带比例因子的寻址(3种),例 5.5 逻辑尺的使用,LOGIC_RULE DW 00DCH MOV BX,0 MOV CX,10 MOV DX,LOGIC_RULE NEXT: MOV AX,XBX SHR DX,1 JC SUBTRACT ADD AX,YBX JMP SHORT RESULT SUBTRACT: SUB AX,YBX RESULT: MOV ZBX,AX ADD BX,2 LOOP NEXT RET ,寻址方式?,逻辑尺: 、定义 、使用,逻辑尺的形式: 、静态预置 、动态修改,5.1.3 多重循环程序设计,基本方法与单重循环相同,但要注意: 1、分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆 2、每次从外层循环再次进入内层循环时,初始条件要重新设置,例5.7 将首地址为a的字数组从大到小排序(气泡算法,多重循环) a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 dec cx loop1: mov di, cx mov bx, 0 loop2: mov ax, abx cmp ax, abx+2 jge continue xchg ax, abx+2 mov abx, ax continue: add bx, 2 loop loop2 mov cx, di loop loop1,注意:与教材的不同,数组的访问方式,循环程序设计小结 1、循环控制条件的选择: a. 循环次数已知,采用LOOP b. 循环次数已知,但有可能使用其他特征或条件结束循环, 可采用LOOPZ和LOOPNZ c. 循环次数未知,具体问题具体分析 2 、设立条件标志位的方法,5.2 分支程序设计,5. 2 .1分支程序的结构形式,双分支与多分支的共同特点: 运行方向是向前的 在某一种特定条件下,只能执行其中的一个分支,5. 2 .1分支程序设计方法,1、使用CMP、TEST等运算型指令+条件转移指令 2、使用逻辑尺的方法 3、使用跳跃表法实现CASE结构,例5.5 设有数组x(x1, , x10)和y(y1, , y10),编程计算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10,逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法 0 加法,x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dch mov bx, 0 mov cx, 10 mov dx, logic_rule next: mov ax, xbx shr dx, 1 jc subtract add ax, ybx jmp short result ; 向前引用 subtract: sub ax, ybx result: mov zbx, ax add bx, 2 loop next,例5.10 根据AL寄存器中哪一位为1(从低位到高位)把程序 转移到8个不同的程序分支去 。,branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,注意:DW 标号的使用,寄存器间接寻址,cmp al, 0 je continue lea bx, branch_table L : shr al, 1 ;逻辑右移 jnb not_yet ;jnb=jnc jmp word ptr bx ;段内间接转移 not_yet : add bx, type branch_table jmp L continue: routine1: routine2: ,可提高效率,寄存器间接寻址,cmp al, 0 je continue mov si, 0 L : shr al, 1 ;逻辑右移 jnb not_yet ;jnb=jnc jmp branch_tablesi ;段内间接转移 not_yet: add si, type branch_table jmp L continue: routine1: routine2: ,基址变址寻址,cmp al, 0 je continue lea bx, branch_table mov si, 7* type branch_table mov cx, 8 L : shl al, 1 ;逻辑左移 jnb not_yet ;jnb=jnc jmp word ptr bxsi ;段内间接转移 not_yet : sub si, type branch_table loop L continue: routine1: routine2: ,5.3 如何在实模式下发挥80386及其后继机型的优势,80386及其后继机型不但兼容8086的程序,运行速度更快; 而且还有其它的一些优势:,5.3.1 充分利用高档机的32位字长特征 5.3.2 通用寄存器可作为指针寄存器 5.3.3与比例因子有关的寻址方式,通用寄存器作指针寄存器 8个32位通用寄存器都可以作为基址或变址寄存器使用,但注意它们的高16位应为0。,32位字长特征 计算机一次能够处理32位的数据,可以访问32位的8个通用寄存器,但EIP和EFLAGS在实模式下只有低16位可以使用。,比例因子 方便了表格处理和多位数组处理,实模式段的大小限于64K,实模式下的程序是一种混合的16位和32位代码,纯16位模块 (1) 所有段长都

温馨提示

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

评论

0/150

提交评论