收藏 分享(赏)

第3章 程序设计.ppt

上传人:hwpkd79526 文档编号:7414484 上传时间:2019-05-16 格式:PPT 页数:57 大小:322KB
下载 相关 举报
第3章 程序设计.ppt_第1页
第1页 / 共57页
第3章 程序设计.ppt_第2页
第2页 / 共57页
第3章 程序设计.ppt_第3页
第3页 / 共57页
第3章 程序设计.ppt_第4页
第4页 / 共57页
第3章 程序设计.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、分支程序设计 循环程序设计,循环与分支程序设计,分支结构 子程序结构,程序结构:,复合结构:多种程序结构的组合,顺序结构 循环结构,编制汇编语言程序的步骤:,(1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序,例 、从键盘上键人09中任一自然数N,将其立方值送显示器显示。,data segmentINPUT DB PLEASE INPUT N(O9):$LFB DB 0$ 1$ 8$ 27$ 64$125$216$343$512$729$N DB ?data ends,MOV DX, OFFSET INPUT MOV AH,91NT 21H

2、MOV AH,1 INT 21HMOV N,ALMOV AH,2 MOV DL, OAHINT 21H,MOV DL,NAND DL,0FH MOV CL,2 SHL DL,CLMOV DH,0 ADD DX,OFFSET LFB MOV AH,9INT 21H,1. 分支程序设计,case 1 case 2 case n,?,?,case 1 case 2 case n,CASE 结构 IF-THEN-ELSE 结构,(1) 逻辑尺控制 (2) 条件控制 (3) 地址跳跃表(值与地址有对应关系的表),控制转移指令: 无条件转移指令JMP 条件转移指令 JZ / JNZ 、 JE / JNE、

3、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ 循环指令LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE 子程序调用和返回指令CALL、RET 中断与中断返回指令INT、INTO、IRET,无条件转移指令:段内直接短转移:JMP SHORT OPR执行操作:(IP) (IP) + 8位位移量段内直接近转移:JMP NEAR PTR OPR执行操作:(IP) (IP) + 16位位移量段内间接转移: JMP WORD PTR OPR执行操作: (IP) (EA),段

4、间直接远转移:JMP FAR PTR OPR执行操作:(IP) OPR 的段内偏移地址(CS) OPR 所在段的段地址段间间接转移: JMP DWORD PTR OPR执行操作: (IP) (EA)(CS) (EA+2),条件转移指令: 注意:只能使用段内直接寻址的8 位位移量(1) 根据单个条件标志的设置情况转移 格式 测试条件 JZ(JE) OPR ZF = 1 JNZ(JNE) OPR ZF = 0 JS OPR SF = 1 JNS OPR SF = 0 JO OPR OF = 1 JNO OPR OF = 0 JP OPR PF = 1 JNP OPR PF = 0 JC OPR C

5、F = 1 JNC OPR CF = 0,(2) 比较两个无符号数,并根据比较结果转移*格式 测试条件 JB (JNAE,JC) OPR CF = 1 JNB (JAE,JNC) OPR CF = 0 JBE (JNA) OPR CFZF = 1 JNBE (JA) OPR CFZF = 0* 适用于地址或双精度数低位字的比较,(3) 比较两个带符号数,并根据比较结果转移*格式 测试条件 JL (JNGE) OPR SFOF = 1 JNL (JGE) OPR SFOF = 0 JLE (JNG) OPR (SFOF)ZF = 1 JNLE (JG) OPR (SFOF)ZF = 0* 适用于

6、带符号数的比较(4) 测试 CX 的值为 0 则转移格式 测试条件 JCXZ OPR (CX)=0,单分支程序设计,条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址,例:如果 X50,转到TOO_HIGH;否则 |X-Y| RESULT, 如果溢出转到 OVERFLOW,,;例:计算AX的绝对值cmp ax,0jns nonneg ;分支条件:AX0neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足;计算AX的绝对值cmp ax,0jl yesneg ;分支条件:AX0jmp nonneg yesneg: neg ax ;条件

7、不满足,求补 nonneg: mov result,ax ;条件满足,例:从键盘输入一个字符,判断是否为大写字母,是大写字母则转换为小写显示。,; 代码段 call readc ; 输入一个字符,从AL返回值 cmp al,A ; 与大写字母A比较 jb done ; 比大写字母A小,不是大写字母,转移 cmp al,Z ; 与大写字母Z比较 ja done ; 比大写字母Z大,不是大写字母,转移 or al,20h ; 转换为小写 call dispcrlf ; 回车换行(用于分隔) call dispc ; 显示小写字母 done:,JB,JA,条件成立跳转执行第2个分支语句体,否则顺序执

8、行第1个分支语句体。注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,双分支程序设计,shl bx,1 ;BX最高位移入CF jc one ;CF1,即最高位为1,转移 mov dl,0;CF0,即最高位为0,DL0 jmp two ;一定要跳过另一个分支体 one: mov dl,1 ;DL1 two: mov ah,2 int 21h ;显示,例 显示BX最高位,例 判断有无实根,.startup mov al,_b imul al ;al*al-ax mov bx,ax ;BX中为b2 mov al,_a imul _c mov cx,4 imul cx ;AX中为4ac;(D

9、X无有效数据),cmp bx,ax ;比较大小 jge yes ;条件满足? mov tag,0 ;tag0 jmp done; yes:mov tag,1 done:.exit 0,例:将AX中存放的无符号数除以2,如果是奇数,则加1后除以2test ax,01h ;测试AX最低位jz even ;最低位为0:AX为偶数add ax,1;最低位为1:AX为奇数,需要加1 even: rcr ax,1 ;AXAX2;如果采用SHR指令,则不能处理AXFFFFH的特殊情况,BX,1234,例:把 BX 中的二进制数以十六进制的形式显示在屏幕上,MOV BX, 1234HMOV CH, 4 ; C

10、H做循环计数器 ROT: MOV CL, 4 ; CL做移位计数器ROL BX, CL ; 将最高4位移到低4位MOV AL, BLAND AL, 0FH ; 取出低4位ADD AL, 30H ; 转换为ASCII码CMP AL, 39H ; 与 9 比较JBE DISP ; 若(AL)9, 则转显示ADD AL, 7 ; 若(AL)9, 再加7转为A-F DISP: MOV DL, AL ; (DL)字符MOV AH, 2INT 21H ; 显示输出DEC CH ; 4个十六进制数显示完否?JNZ ROT ; 没有, 循环MOV DL, 48H ; HMOV AH, 2INT 21H ; 最

11、后显示H,例:有数组 x(x1,x2,x10) 和 y(y1,y2,y10),编程计算 z(z1,z2,z10)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,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,

12、z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dch ;0000,0000,1101,1100 mov bx, 0mov cx, 10mov dx, logic_rule next: mov ax, xbxshr dx, 1jc subtractadd ax, ybxjmp short result ; 向前引用 subtract: sub ax, ybx result: mov zbx, axadd bx, 2loop next,例:某工厂的产品共有8种加工处理程序P0P7,而某产品应根据不同情况,作不同的处理,其选择由键入的值07来决定。若键入07

13、以外的键,则退出该产品的加工处理程序。,data segmentINPUT DB INPUT(07):$PTAB DW P0,P1,P2,P3,P4,P5,P6,P7data ends AGAIN:MOV DX,OFFSET INPUTMOV AH,9INT 21HMOV AH,1INT 21HCMP AL,0JB EXITCMP AL,7,JA EXITAND AX,0FHADD AL,AL,MOV BX,AXJMP PTABBX EXIT: RET P0: JMP AGAINP7:JMP AGAIN,data segmentarray dw 12,11,22,33,44,55,66,77,

14、88,99,111,222,333number dw 55low_idx dw ?high_idx dw ? data ends,例:折半查找算法,12112233445566778899 111 222 333,0123456789 10 11 12,(si)=0ah Cf=0,(si)=10h Cf=1,折半算法1,lea di, arraymov ax, number ;要查找数cmp ax, di+2 ; (ax)与第一个元素比较ja chk_lastlea si, di+2je exit ; (ax)第一个元素,找到退出stcjmp exit ; (ax)最后一个元素,未找到退出,算

15、法1,compare:cmp ax, bx+sije exitja higherdec cxmov high_idx, cxjmp mid higher:inc cxmov low_idx, cxjmp mid no_match:stc exit:,search:mov low_idx, 1mov bx, di ;个数mov high_idx, bxmov bx, di mid:mov cx, low_idxmov dx, high_idxcmp cx, dxja no_matchadd cx, dxshr cx, 1mov si, cxshl si, 1,121122334455667788

16、99 111 222 333,0123456789 10 11 12,(si)=0ah (di)=0ah Cf=0,(si)=2 (di)=10h Cf=1,折半算法2,算法2,idx_ok:shr si, 1test si, 1jz sub_idxinc si sub_idx:sub di, sijmp short compare higher:cmp si, 2je no_matchshr si, 1jmp short even_idx all_done:mov si, di exit:,search:mov si, di even_idx:test si, 1jz add_idxinc

17、si add_idx:add di, si compare:cmp ax, dije all_doneja highercmp si, 2jne idx_ok no_match:stcjmp exit,例:根据 AL 寄存器中哪一位为 1(从低位到高位),把程序转移到 8 个不同的程序分支,branch_table dw routine1dw routine2dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,cmp al, 0 ;AL为逻辑尺je continuelea bx, branch_tabl

18、e L: shr al, 1 ;逻辑右移jnc add1jmp word ptrbx ;段内间接转移 add1: add bx, type branch_table ;add bx,2jmp L continue: routine1: routine2: ,(寄存器间接寻址),(寄存器相对寻址), cmp al, 0je continuemov si, 0 L: shr al, 1 ;逻辑右移jnc add1jmp branch_tablesi ;段内间接转移 add1:add si, type branch_tablejmp L continue: routine1: routine2: ,

19、(基址变址寻址),cmp al, 0je continuelea bx, branch_tablemov si, 7 * type branch_tablemov cx, 8 L: shl al, 1 ;逻辑左移jnc sub1 jmp word ptr bxsi ;段内间接转移 sub1: sub si, type branch_table ;(si)-2loop L continue: routine1: routine2: ,2. 循环程序设计,DO-WHILE 结构 DO-UNTIL 结构,控制条件,初始化,循环体,Y,N,控制条件,初始化,循环体,Y,N,初始化:设置循环的初始状态

20、循环体:循环的工作部分及修改部分 控制条件:计数控制特征值控制地址边界控制,循环指令(loop):,循环指令默认利用CX计数器,方便实现计数循环的程序结构 label操作数采用相对寻址方式,LOOP label ;CXCX1,;CX0,循环到标号label,LOOPZ label ;CXCX1,;CX0且ZF1,循环到标号label,LOOPZ label ;CXCX1,;CX0且ZF0,循环到标号label,JCXZ label ;CX0,转移到标号label,例: 数组求和程序 (次数控制循环 ),; 数据段 array dw 6,-8, 3,13,-16 ; 数组 sum dword ?

21、 ; 结果变量 ; 代码段 mov cx,lengthof array ; ECX数组元素个数 xor ax, ax ; 求和初值为0 mov bx, ax ; 数组指针为0 again: add ax,arraybx*(type array) ; 求和 inc bx ; 指向下一个数组元素 loop again mov sum, ax ; 保存结果 call dispsid ; 显示结果,例:字符个数统计程序 (条件控制循环),; 数据段 string db Do you have fun with Assembly?,0 ; 以0结尾的字符串 ; 代码段 xor bx, bx ; EBX记

22、录字符个数,同时也指向字符的指针 again: mov al,stringebx cmp al,0 ; 用指令“test al,al”更好 jz done inc bx ; 个数加1 jmp again ; 继续循环 done: mov ax,ebx ; 显示个数 call dispuid,mov bx, 0 newchar: mov ah, 1 ;键盘输入int 21hsub al, 30h jl exit ; 9退出cbwxchg ax, bxmov cx, 10mul cxxchg ax, bxadd bx, axjmp newchar exit: ,例:从键盘接收十进制数并存入 BX,

23、( ( 010)+1 )10+2 )10+5,mov bx, 0 newchar: mov ah, 1 ;键盘输入int 21hsub al, 30hjl exit ; f退出 add_to: mov cl, 4shl bx, clmov ah, 0add bx, axjmp newchar exit: ,例:从键盘接收十六进制数并存入 BX,1 a f 31 61 66,(016)+1) 16+0a) 16+0f,x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32,例:将正数 n 插入一个已整序的

24、正数字数组,105,array_head,array_end,n ,x ,.model small.stack.data sum dw ?.code.startupxor ax,ax ;被加数AX清0mov cx,100 again: add ax,cx;从100,99,.,2,1倒序累加loop againmov sum,ax ;将累加和送入指定单元.exit 0end,计数控制循环循环次数固定,例:求1+2+3+。+100,例 将字节变量SB中的8位二进数送显示器显示.,分析:先将字节变量中的1位二进制数移入AH中,再将移入的二进制数变为ASCII码。为了避免通过CF来传递二进制数,先将S

25、B中的8位二进制数送入AL中,再左移AX,将1位二进制数直接移入AH中。,数据段:SB DB 9AHOBUF DB 9 DUP(0),代码段:MOV CX, 8MOV BX,0MOV AL,SB AGAIN: MOV AH, 0SHL AX,1ADD AH,30HMOV OBUFBX,AHINC BXLOOP AGAINMOV 0BUFBX,$MOV DX,OFFSET OBUF MOV AH,9INT 21Hret,例:大小写字母转换,mov bx,offset string again: mov al,bx ;取一个字符or al,al ;是否为结尾符0jz done ;是,退出循环cmp

26、 al,A ;是否为大写AZjb nextcmp al,Zja nextor al,20h;是,转换为小写字母(使D5=1)mov bx,al ;仍保存在原位置 next: inc bxjmp again ;继续循环 done: .exit 0,条件控制循环利用标志退出,例: 将首地址为A的字数组从小到大排序 (气泡算法,多重循环) 32,85,16,15, 8,“冒泡法”是一种排序算法,不是最优的算法,但它易于理解和实现 冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再

27、进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序 这需要一个双重循环程序结构,多重循环即循环体内再套有循环.,mov cx,count ;CX数组元素个数dec cx ;元素个数减1为外循环次数 outlp: mov dx,cx ;DX内循环次数mov bx,offset array inlp: mov al,bx ;取前一个元素cmp al,bx+1 ;与后一个元素比较jna next;前一个不大于后一个元素,则不进行交换xchg al,bx+1 ;否则,进行交换mov bx,al next: inc bx ;下一对元素dec dxjnz inlp ;内循环尾lo

28、op outlp ;外循环尾,方法1:,方法2: mov cx, 5 ;元素个数dec cx ;比较遍数 loop1: mov di, cx ;比较次数mov bx, 0 loop2: mov ax, Abx ;相邻两数cmp ax, Abx+2 ; 比较jle continuexchg ax, Abx+2 ;交换位置mov Abx, ax continue:add bx, 2 loop loop2mov cx, diloop loop1,; 数据段 key db 234 bufnum = 255 buffer db bufnum+1 dup(0) ; 定义键盘输入需要的缓冲区 msg1 db

29、 Enter messge: ,0 msg2 db Encrypted message: ,0 msg3 db 13,10,Original messge: ,0,例:简单加密解密程序:,; 代码段 mov ax,offset msg1 ; 提示输入字符串 call dispmsg mov ax,offset buffer ; 设置入口参数AX call readmsg ; 调用输入字符串子程序 push ax ; 字符个数保存进入堆栈 mov cx, ax ; CX实际输入的字符个数,作为循环的次数 xor bx, bx ; BX指向输入字符 mov al,key ; AL加密关键字 enc

30、rypt: xor bufferbx,al ; 异或加密 inc bx dec cx ; 等同于指令:loop encrypt jnz encrypt ; 处理下一个字符 mov ax,offset msg2 call dispmsg mov ax,offset buffer ; 显示加密后的密文 call dispmsg,pop cx ; 从堆栈弹出字符个数,作为循环的次数 xor bx, bx ; BX指向输入字符 mov al,key ; AL解密关键字 decrypt: xor bufferbx,al ; 异或解密 inc bx dec cx jnz decrypt ; 处理下一个字符 mov ax,offset msg3 call dispmsg mov ax,offset buffer ; 显示解密后的明文 call dispmsg,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报