版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计,第,5,章,循环与分支程序设计,汇编语言程序设计,分支结构,子程序结构,程序结构:,复合结构:多种程序结构的组合,顺序结构,循环结构,汇编语言程序设计,DO-WHILE,结构,DO-UNTIL,结构,控制条件,初始化,循环体,Y,N,控制条件,初始化,循环体,Y,N,循环程序结构,设置循环的初始状态,循环的工作部分及修改部分,1.,计数控制,:,循环次数已知,2.,特征值控制,:,次数已知,提,前结束,3.,地址边界控,制,:循环次数,未知,汇编语言程序设计,5.2,分支程序设计,case 1 case 2 case n,?,?,case 1 case 2 case n,CA
2、SE,结构,IF-THEN-ELSE,结构,程序的分支一般用条件转移指令来产生,控制条件是关键。可以采,用以下几种方式:,(1),条件控制,(2),逻辑尺控制,(3),地址跳跃表,(值与地址有对应关系的表),汇编语言程序设计,一、循环指令,LOOP,/,计算,0+1+2+3+4+5+6+7+8+9,的值,int sum=0;,for(int i=0;i10;i+),sum=sum+i;,/,计算,0+1+2+3+4+5+6+7+8+9,的值,mov ax,0,mov bx,0,mov cx,10,s: add ax,bx,inc bx,loop s,标号,S,代表,一个地址,ax,相当于,su
3、m,bx,相当于,i,判断,汇编语言程序设计,Loop,指令,指令的格式是:,loop,标号,CPU,执行,loop,指令的时候,要进行两步操作:,(cx)=(cx)-1,;,判断,cx,中的值,不为零则转至标号处执行程序,,如果为零则向下执行,退出循环。,可见,,cx,中的值影响着,loop,指令的执行结果。用,loop,指令,来实现循环功能时,,cx,中要存放,循环次数,。,汇编语言程序设计,例,3.80,:求首地址为,ARRAY,的,M,个字之和(不考虑溢出),,结果存入,TOTAL,(,ARRAY,和,TOTAL,都被定义为字变量),MOV CX, M,MOV AX, 0,MOV SI
4、, AX,AGAIN:,ADD AX, ARRAYSI,ADD SI, 2,LOOP AGAIN,MOV TOTAL, AX,寄存器相对寻址方式,汇编语言程序设计,例:编制程序将存放在首地址为,ARRAY,的,字符串,“,happy new year”,向高地址方向移动一个字节的位置,data segment,array db happy new year,data ends,code segment,assume cs:code,ds:data,start: mov ax,data,mov ds,ax,mov ax,4c00h,int 21h,code ends,end start,mov
5、cx,14,;,设置循环次数,mov bx,13,;,初始化,s:,mov al, arraybx,mov arraybx+1, al,dec bx,loop s,汇编语言程序设计,二、可提前结束的循环指令,功能,格式,测试条件,当为,0,或相等时循环,LOOPZ,/,LOOPE,标号,ZF=1,且(,CX,),0,不为,0,或不相等循环,LOOPNZ,/,LOOPNE,标号,ZF=0,且(,CX,),0,执行步骤:,(1),(CX),(CX),-,1,(2),检查是否满足测试条件,如满足则实现循环;,不满足则退出循环。,注意:,* CX,中存放循环次数,*,与比较指令,CMP,联合使用可提前
6、退出循环。,汇编语言程序设计,例:编制程序查找存放在首地址为,string,的,字符串中的,字母“,n”,找到则将其改为大写的“,N”,,没找到则结束程,序,data segment,string db happy new year,data ends,code segment,assume cs:code,ds:data,start: mov ax,data,mov ds,ax,mov ax,4c00h,int 21h,code ends,end start,mov cx,14,;,设置循环次数,mov bx,-1,;,初始化,mov al, ”n”,s:,inc bx,cmp al, ar
7、raybx,loopnz s,(,若,zf,=0,,没有找到,结束程序,),mov arraybx,”N”,汇编语言程序设计,思考题:,对于如下程序,mov ax,2,mov cx,3,s: add ax,2,s1: loop s,mov di,offset s1,mov si,offset s3,mov ax,cs:di,mov cs:si,ax,mov ax,1,mov cx,3,s2: add ax,2,s3: nop,nop,所有指令执行完后,ax,的值为,_,。,A,、,15,B,、,7,C,、,11 D,、,3,汇编语言程序设计,问题,编程,将,datasg,段中每,个单词的头一个
8、字母改为,大写字母。,assume cs:codesg,ds:datasg,datasg segment,db 1. file ;16,个字节,db 2. edit ,db 3. search ,db 4. view ,db 5. options ,db 6. help ,datasg ends,codesg segment,start:,codesg ends,end start,汇编语言程序设计,问题分析,在,datasg,中定义了,6,个字符串,每个长度为,16,字节。,(注意,为,了直观,每个字符串的后面都加上了,空格符,,以使它们的长度刚好,为,16,字节)。,datasg,中的数据
9、的存储结构如图:,?,因为它们是连续存放的,我们可以将这,6,个字符串看成一个,6,行,16,列的,二维数组。,汇编语言程序设计,我们用,bx,作变量,定位每行的起始地址,用,3,定位要修改,的列,用寄存器相对寻址的方式来对目标单元进行寻址,,程序如下:,mov ax,datasg,mov ds,ax,mov bx,0 ;,指向第一行,mov cx,6,s: mov al,bx+3,sub al,20h ;,小写字母改为大写,mov bx+3,al,add bx,16 ;,指向下一行,loop s,汇编语言程序设计,问题,编程:将,datasg,段中每个单词都,改为大写字母。,assume c
10、s:codesg,ds:datasg,datasg segment,db ibm ,db dec ,db dos ,db vax ,datasg ends,codesg segment,start:,codesg ends,end start,汇编语言程序设计,问题分析,在,datasg,中定义了,4,个字符串,每个长度为,16,字节。,datasg,中数据的存储结构如图:,我们需要修改每一个单词,即二维数组的每一行的前,3,列。,汇编语言程序设计,算法描述:,R=,第一行的地址,设置外循环次数,s0: C=,第一列的地址,设置内循环次数,s:,改变(,R,行,,C,列)的,字母为大写,C=,
11、下一列的地址;,loop s,R=,下一行的地址,loop s0,mov ax,datasg,mov ds,ax,mov bx,0 ;,行地址,mov cx,4 ;,外循环次数,s0: mov si,0 ;,列地址,mov cx,3 ;,内循环次数,s: mov al,bx+si,sub al,20h,mov bx+si,al,inc si ;,改变列地址,loop s,add bx,16 ;,改变行地址,loop s0,程序有没有问题?,汇编语言程序设计,一条循环指令可以用修改循环计数和判断转移条,件的两条指令替代,LOOP AGAIN,DEC CX,JNZ AGAIN,汇编语言程序设计,在
12、多重循环的程序结构中,,CX,计数器的保存和恢复,MOV CX, M,AGAIN: ,PUSH CX,MOV CX, N,NEXT: ,LOOP NEXT,POP CX,LOOP AGAIN,MOV DI, M,AGAIN: ,MOV CX, N,NEXT: ,LOOP NEXT,DEC DI,JNZ AGAIN,汇编语言程序设计,三、,控制转移指令:,?,8086CPU,的转移指令分为:,1,、无条件转移指令,(,jmp,),2,、条件转移指令(,jxx,),3,、循环指令,loop,4,、子程序调用与返回,5,、中断,int,汇编语言程序设计,1,、无条件转移指令:,JMP,段内直接短转移
13、:,JMP SHORT OPR,执行操作:,(IP),(IP) + 8,位位移量,段内直接近转移:,JMP,NEAR,PTR,OPR,执行操作:,(IP),(IP),+,16,位位移量,段内间接转移:,JMP,WORD,PTR,OPR,执行操作:,(IP),(EA),段间直接远转移:,JMP,FAR,PTR,OPR,执行操作:,(IP),OPR,的段内偏移地址,(CS),OPR,所在段的段地址,段间间接转移:,JMP,DWORD,PTR,OPR,执行操作:,(IP),(EA),(CS),(EA+2),转向的符,号地址,存储器寻,址方式,除立即数以外,的寻址方式,转向的符,号地址,short:,
14、表示实现的是,段内直接短转移,,,即位移量为,8,位数据,它对,IP,的修改范,围为,-128127,,也就是说,它向前转,移时可以最多越过,128,个字节,向后转,移可以最多越过,127,个字节。,汇编语言程序设计,比如:程序,assume cs:codesg,codesg segment,start:mov ax,0,jmp short s,add ax,1,s:,inc ax,mov ax, 4c00h,int 21h,codesg ends,end start,左面的程序执行后,,ax,中的值为,1,,,因为执行,jmp short s,后,,越过了,add,ax,1,,,IP,指向了
15、标号,s,处的,inc ax,。也,就是说,程序只进行了一次,ax,加,1,操作。,跳过的位移量即为指令,add ax,1,的长度,。,问:该程序执行后,(AX) =,?,我们可以看到,,Debug,将,jmp short s,中的,s,表示为,inc ax,指令的,偏移地址,8,,并将,jmp short s,表示为,jmp 0008,,表示转移到,cs:0008,处。,jmp 0008,所对应的机器码为,EB 03,,并没有出现,0008,。,CPU,执行,jmp short,标号,指令时并不需要转移的目的地址,只需,要知道转移的位移就行了。,汇编语言程序设计,2,、条件转移指令,注意:只
16、能使用段内直接寻址的,8,位位移量,(1),根据单个条件标志的设置情况转移,格式,转移条件,JZ(JE) OPR ZF = 1,结果为,0,(相等)则转移,JNZ(JNE) OPR ZF = 0,不为,0,(不相等)转移,JS OPR SF = 1,为负转移,JNS OPR SF = 0,为正转移,JO OPR OF = 1,溢出转移,JNO OPR OF = 0,不溢出转移,JP OPR PF = 1,有偶数个,1,则转移,JNP OPR PF = 0,有奇数个,1,则转移,JC OPR CF = 1,有进位转移,JNC OPR CF = 0,无进位转移,汇编语言程序设计,(2),比较两个,
17、无符号数,,并根据比较结果转移的指令,(与比较指令,CMP,联用),格式,测试条件,JB,(JNAE,JC),OPR,CF,=,1,;有借位,JNB,(JAE,JNC),OPR,CF,=,0,;没有借位,JNA,(JBE),OPR,CF,ZF,=,1,JA,(JNBE),OPR,CF,ZF,=,0,*,适用于地址或双精度数低位字的比较,汇编语言程序设计,无符号数比较,cmp ax,bx,汇编语言程序设计,cmp,指令对有符号数的比较,cmp ah, bh,(,1,)如果,SF=1,,而,OF=0,,,(ah)(bh),OF=0,,说明没有溢出,逻辑上真正结果的正负,=,实,际结果的正负;,SF
18、=1,表示实际结果为负,所以逻,辑上真正的结果为负,所以,(ah)(bh),。,(,2,)如果,SF=0,,而,OF=1,,,(ah)(bh),OF=1,,说明有溢出,逻辑上真正结果的正负,实际,结果的正负;,SF=0,表示由于溢出导致了实际结果,非负,那么逻辑上真正的结果必然为负。这样,,SF=0,,,OF = 1,,说明了,(ah)(bh),。,汇编语言程序设计,(,3,)如果,SF=0,,而,OF=0,,,(ah),(bh),OF=0,,说明没有溢出,逻辑上真正结果的正负,=,实际,结果的正负;,SF=0,表示实际结果非负,所以逻辑上真,正的结果必然非负。所以,(ah),(bh),。,(
19、,4,)如果,SF=1,,而,OF=1,,,(ah)(bh),OF=1,,说明有溢出,逻辑上真正结果的正负,实际结,果的正负;,SF=1,表示由于溢出导致了实际结果为负,,那么逻辑上真正的结果必然为正。这样,,SF=1,,,OF =,1,,说明了,(ah)(bh),。,汇编语言程序设计,(3),比较两个,带符号数,,并根据比较结果转移的指令,格式,测试条件,JL,(JNGE),OPR,SF,?,OF,=,1,JNL,(JGE),OPR,SF,?,OF,=,0,JNG,(JLE,),OPR,(SF,?,OF),ZF,=,1,JG,(JNLE),OPR,(SF,?,OF),ZF,=,0,*,适用于
20、带符号数的比较,(4),测试,CX,的值为,0,则转移的指令,格式,测试条件,JCXZ,OPR,(CX)=0,汇编语言程序设计,MOV AX, X,CMP AX, 50,TOO_HIGH,SUB AX, Y,OVERFLOW,NONNEG,NEG AX,NONNEG:,MOV RESULT, AX,TOO_HIGH:,OVERFLOW:,例,3-76,:,比较字,X,Y,如果,X50,,转到,TOO_HIGH,;否则先做,X-Y,,如果溢出转到,OVERFLOW,,否则,|X-Y|,RESULT,。,JG,JO,JNS,汇编语言程序设计,补充:常用的,DOS,调用:键盘输入,显示输出,;从键盘
21、输入一个字符并回显在屏幕上,MOV,AH, 01,;,DOS,功能号,1:,键盘输入并回显,INT,21H,;,DOS,调用类型,21H,:,(AL)=,字符的,ASCII,码,;输出一个字符到屏幕上,MOV DL, A,;,调用参数,:,输出字符,=,(,DL,),MOV,AH, 02,;,DOS,功能号,2,:,显示一个字符,INT,21H,;,DOS,调用类型,21H,;,输出字符串显示在屏幕上,MOV,DX,,,OFFSET,MESSAGE,;,DS:DX=,串地址(串必须以,$,结束),MOV AH,,,9,;,DOS,功能号,9:,显示字符串,INT 21H,汇编语言程序设计,BX
22、,1,2,3,4,例,5.1,:把,BX,中的二进制数以十六进制的形式显示在屏幕上,汇编语言程序设计,mov ch, 4,;设置循环次数,rotate: mov cl, 4,;设置移位位数,rol bx, cl,;循环左移,4,位,mov al, bl,;取低,8,位,and al, 0fh,;保留低,4,位,add al, 30h,; 09 ASCII 30H39H,cmp al, 3ah,jl printit,;判断是否为字母,不是则跳转,add al, 7h,; AF ASCII 41H46H,printit: mov dl, al,mov ah, 2,int 21h,;调用功能号,2,
23、,显示一个字符,dec ch,jnz rotate,MOV CX, 4,PUSH CX,POP CX,IOOP rotate,汇编语言程序设计,mov bx, 0,;,1,号功能调用,从键盘输入一个字符保存在(,AL,),newchar: mov ah, 1,int 21h,sub al, 30h,jl exit ; 0,退出,cmp al, 9,jg exit ; 9,退出,cbw,xchg ax, bx,mov cx, 10,mul cx,add bx, ax,jmp newchar,exit: ,例:从键盘接收十进制数并存入,BX,( ( 0,10)+1 ),10+2 ),10+5,1
24、2 5,31 32 35,汇编语言程序设计,mov bx, 0,newchar: mov ah, 1,;键盘输入,int 21h,sub al, 30h,jl exit,; 0,退出,cmp al, 10,jl add_to,sub al, 27h,; af,cmp al, 0ah,jl exit,;,a,退出,cmp al, 10h,jge exit,;,f,退出,add_to: mov cl, 4,shl bx, cl,mov ah, 0,add bx, ax,jmp newchar,exit: ,例:从键盘接收十六进制数并存入,BX,1 a f,31 61 66,(0,16)+1),16
25、+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,例,5.4,:将正数,n,插入一个已整序的正数字数组,mov ax, n,mov array_head-2, 0ffffh,mov si, 0,compare:,cmp array_end si, ax,jle insert,mov bx, array_end si,mov array_end si+2, bx,sub si, 2,jmp short compare,insert:,mov array_end
26、 si+2, ax,3,5,15,23,37,49,52,65,78,99,105,32,-1,array_head,?,array_end,?,n,?,x,?,汇编语言程序设计,例,5.5,:,有数组,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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机关卫生检查奖惩制度
- 通信工程资料员奖惩制度
- 私立学校老师奖惩制度
- 护士科室奖惩制度实施细则
- 化工安全隐患奖惩制度
- 绿化苗木管护及奖惩制度
- 工程项目奖惩制度方案模板
- 监理内部项目奖惩制度
- 五常安全管理奖惩制度
- 惠州市惠来商会奖惩制度
- 关于组织2026年春季新员工入职培训的通知函9篇范本
- 2025年江西旅游商贸职业学院单招职业适应性测试题库及答案解析
- 播种绿色希望共建美丽校园2026植树节主题教育课件
- 2026年海南软件职业技术学院单招综合素质考试题库及答案解析
- 2025年安庆市生态环境保护综合行政执法支队内勤辅助岗招聘笔试参考题库附带答案详解
- 公司文明卫生考核制度
- 2025中国南水北调集团新能源投资有限公司所属单位公开招聘34人笔试参考题库附带答案详解
- 《生成式人工智能应用实战》 课件全套 第1-10章:AI 与 AIGC 概述-AIGC应用综合实训
- 组合数学课件
- 生态环境材料 第2章 材料产业与生态环境
- 新教材教科版五年级上册科学 3-3《我们的水钟》课件
评论
0/150
提交评论