[计算机]IBM-PC汇编语言程序设计.ppt_第1页
[计算机]IBM-PC汇编语言程序设计.ppt_第2页
[计算机]IBM-PC汇编语言程序设计.ppt_第3页
[计算机]IBM-PC汇编语言程序设计.ppt_第4页
[计算机]IBM-PC汇编语言程序设计.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第五章 循环与分支程序设计,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. 计算机处理字符时,常用的字符编码是ASCII 码。 2. 数字和字母的ASCII码是一个有序序列 数字09 : 30H 39H 大写字母AZ : 41H 5AH 小写字母az : 61H 7AH,5.1.2 循环程序设计方法,例5.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.2 在ADDR单元中存放着数,度编制一程序把中1的个数存入COUNT单元中。,datarea segment addre dw 1234h count dw ? datarea ends,mov cx,0 mov bx,addre mov ax,bx again: test ax,0ffffh jz exit jns shift inc cx shift: shl ax,1 jmp again exit: mov count,cx ret,例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,例 5.5 i=Xi+Yi,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.6 键入一行以空格开头以空格结束的字符串,datarea segment buffer db 80 dup(?) flag db ? datarea ends,lea bx,buffer mov flag,0 next: mov ah,01 ;读键盘 int 21h ;所读内容放入al test flag,01h ;flag=1? jnz follow ;flag=0,zf=1不转 cmp al,20h ;al是空格?,jnz exit ;不是,zf=0退出 mov flag,1 ;置标志flag=1 jmp next follow: cmp al,20h ;al是空格? jz exit ;是,zf=1,退出 mov bx,al ;不是,保存 inc bx ;数组索引加1 jmp next exit:,20,a,b,c,d,e,f,20,flag= 0 1 jz exit成立,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 ;取第bx个数 cmp ax, abx+2 ;与后一个数比较 jge continue ;bx=bx+2 xchg ax, abx+2 ;,则交换位置 mov abx, ax continue: add bx, 2 ;指向下一个数 loop loop2 mov cx, di ;恢复外循环次数 loop loop1,例5.8 附加段字数组首地址存于DI,第1字存放长度,从小到大排序 extra segment a dw 10,10h,12h,32h,21h,11h,56h,43h,33h,3h,67h extra ends data segment start_addr dw ? save_cnt dw ? data ends lea di,a ;取有效地址 mov start_addr,di mov cx,es:di ;取长度 mov save_cnt,cx ;数组长度 init: mov bx,1 ;结束标志 dec save_cnt jz sorted ;zf=1,转移 mov cx,save_cnt mov di,start_addr,next: add di,2 mov ax,es:di ;取数 cmp es:di+2,ax ;比较 jae cont ;=,转移,不换 xchg es:di+2,ax mov es:di,ax sub bx,bx ;排序标志 cont: loop next cmp bx,0 ;bx=1,已排好 je init sorted: mov di,start_addr,练习5.11:从键盘输入一系列以$结束的字符串,统计数字字符的个数,data segment count dw 0 buff db 50 dup(?) data ends prognam segment main proc far assume cs:prognam start: push ds sub ax,ax push ax mov ax,data mov ds,ax lea bx,buff ;取缓冲地址 input: mov ah,01 ;从键盘读串 int 21H ;存入al中 mov bx,al ;保存字符,inc bx ;buff数组下标 cmp al,$ ;是不是$ jnz input ;是,结束读 lea bx,buff ;取串地址 mov ax,0 next: mov cl,bx ;取串中字符 inc bx ;指向下一字符 cmp cl,$ ;是不是$ jz disp ;是,zf=1,转移 cmp cl,30h ;与0比较 jb cont ;9,不计数 inc ax ;计数 cont: jmp next disp: ret main endp prognam ends end start,练习5.11:测试一字符串是否存在数字,若存在,置CL第5位置1,否则置0,data segment string db abcqdefghijklmnopqrs data ends prognam segment main proc far assume cs:prognam,ds:data,es:data start:push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax,begin: mov cx,20 ;字符个数 mov si,0 ;数组下标 again: mov al, stringsi cmp al,30h ;与0比较 jb goon ;,转移 or cl,20h ;有数字,置5位 jmp exit goon: inc si ;数组下标加1 loop again and cl,0dfh ;无数字,清5位 exit: ret main endp prognam ends end start,循环程序设计小结 1、循环控制条件的选择: a. 循环次数已知,采用LOOP b. 循环次数已知,但有可能使用其他特征或条件结束循环, 可采用LOOPZ和LOOPNZ c. 循环次数未知,具体问题具体分析 2 、设立条件标志位的方法,5.2 分支程序设计,5. 2 .1分支程序的结构形式,双分支与多分支的共同特点: 运行方向是向前的 在某一种特定条件下,只能执行其中的一个分支,5. 2 .1分支程序设计方法,1、使用CMP、TEST等运算型指令+条件转移指令 2、使用逻辑尺的方法 3、使用跳跃表法实现CASE结构,例5.9 折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,dseg segment low_idx dw ? high_idx dw ? list dw 12,11,22,33,44,55,66,77,88,99,111,222,333 target dw 77 dseg ends cseg segment main proc far assume cs:cseg,ds:dseg,es:dseg start: push ds sub ax,ax push ax mov ax,dseg mov ds,ax mov es,ax,例5.9 折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,mov ax,target ; lea di,list ;取数组首地址 cmp ax,es:di+2 ;取第1个数 ja chk_last ;第1个,检查最后1个 lea si,es:di+2 ;=第1个 je exit ;,退出 stc ;CF=1,没找到 jmp exit chk_last:mov si,es:di ;下面三条使SI指向 shl si,1 ;数组末元素 add si,di cmp ax,es:si ;与末元素比较 jb search ;,搜索数组 je exit ;,退出 stc ;CF=1,没找到 jmp exit,例5.9 折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,search: mov low_idx,1 ;搜索开始的地方 mov bx,es:di ;数组长度 mov high_idx,bx ;搜索结束的地方 mov bx,di ;list地址 mid: mov cx,low_idx ; mov dx,high_idx ; cmp cx,dx ;比较头与末指针 ja no_match ;,头到末之后 add cx,dx ;以下三条计算 shr cx,1 ;头与末的中点 mov si,cx shl si,1 ;对准中间字,(1+5)/2=3 3*2=6 DI偏移6,即106,即第3字,compare: cmp ax,es:bx+si ;比较,bx指向数组首元素 je exit ;,找到,退出 ja highter ;,调节搜索头 dec cx ;= mov high_idx,cx ;调节搜索末 jmp mid highter: inc cx mov low_idx,cx ;调节搜索头 jmp mid no_match: stc exit: ret,例5.9 折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,例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 ;逻辑右移,最低位进入CF位 jnb not_yet ;jnb=jnc,CF=0,转移 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 ;逻辑右移,最低位进入CF位 jnb not_yet ; jnb=jnc,CF=0,转移 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 ;逻辑左移,最高位进入CF位 jnb not_yet ;jnb=jnc,CF=0,转移 jmp word ptr bxsi ;段内间接转移 not_yet : sub si, type branch_table loop L continue: routine1: routine2: ,调试源程序,习题5.21 试写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息: (1)如果三个数都不相等,则显示0 (2)如果有两个相等则显示1 (3)如果都相等,则显示2,dseg segment array dw 3 dup(?) dseg ends cseg segment mov cx,3 lea si,array begin: push cx mov cl,4 mov di,4 mov dl, mov ah,02 int 21h,input: mov ah,01h int 21h and al,0fh shl dx,cl or dl, al dec di jne input mov si,dx add si,2 pop cx loop begin,compa:lea si, array mov dx,0 mov ax,si mov bx,si+2 cmp ax,bx jne next1 inc dx next1: cmp si+4,ax jne next2 inc dx next2: cmp si+4,bx jne num inc dx,num: cmp dx, 3 jl disp dec dx disp: mov ah,2 add dl,30h int 21h main endp cseg ends end start,习题5.23 已定义整型变量、 (1)若

温馨提示

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

评论

0/150

提交评论