第11~12讲 第4章语言程序设计_第1页
第11~12讲 第4章语言程序设计_第2页
第11~12讲 第4章语言程序设计_第3页
第11~12讲 第4章语言程序设计_第4页
第11~12讲 第4章语言程序设计_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、第 4 章stackstacksegment stacksegment stack; ;定义堆栈段定义堆栈段dw 512 dup(?)dw 512 dup(?); ;堆栈段有堆栈段有512512字(字(10241024字节)空间字节)空间stackstackendsends; ;堆栈段结束堆栈段结束datadatasegmentsegment; ;定义数据段定义数据段stringstringdb db Hello, Everybody !Hello, Everybody !,0dh,0ah,0dh,0ah,$ $datadataendsendscodecodesegment segment c

2、odecode; ;定义代码段定义代码段assume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start:mov ax,datamov ax,data; ;建立建立DSDS段地址段地址mov ds,axmov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hmov ax,4c00hint 21hint 21h; ;利用功能调用返回利用功能调用返回DOSDOScodecodeendsends

3、; ;代码段结束代码段结束end startend start; ;汇编结束,同时指明程序起始点汇编结束,同时指明程序起始点完整段定义格式完整段定义格式数据段数据段堆栈段堆栈段(可略)可略)分配段寄存器分配段寄存器首指令位置首指令位置返回返回DOS设置设置DS段寄存器内容段寄存器内容源程序结束,第源程序结束,第一条指令的地址一条指令的地址n这是编写程序的模版:极其重要。这是编写程序的模版:极其重要。n汇编语言汇编语言的的main 在哪里?在哪里?第 4 章 例例 data seg ARR1 DB 00H,11H,22H,33H ARR2 DW 3456H,1024,2525,1000/3,10

4、A0H data endsARR100H11H22H33HARR256H34H00H04H71H02H4DH01HA0H10H0123456789ABCDEARR1的偏移地址是 0ARR2的偏移地址是 4MOV AX , ARR2 ; (AX) = ?MOV AX , OFFSET ARR2 ; (AX) = ?MOV AL , ARR2 + 5 ;(AL) = ? (X) MOV AX , ARR1+1 ; (AX) = ? (X)n偏移偏移地址地址这个这个例子说明两点:例子说明两点:1。变量的值与变量的地址的区别。变量的值与变量的地址的区别2。变量的类型。变量的类型-字节与字的区别字节与字

5、的区别第 4 章编辑编辑文本编辑器,如文本编辑器,如 EDIT.COM源程序:文件名源程序:文件名.asm汇编汇编汇编程序,如汇编程序,如 MASM.EXE目标模块:文件名目标模块:文件名.obj连接连接连接程序,如连接程序,如 LINK.EXE可执行文件:文件名可执行文件:文件名.exe调试调试调试程序,如调试程序,如 DEBUG.EXE应用程序应用程序错误错误错误错误错误错误错误错误注意:注意:MASM及及LINK生成的是后缀为生成的是后缀为EXE的可执行的可执行文件文件,与普通与普通CPU的的BIN或或HEX文件是不同的文件是不同的第 4 章微机原理与接口技术 第第4章章 深入浅出学编程

6、深入浅出学编程第 4 章通过本章的学习,应当掌握以下内容:n了解汇编语言的基本知识和特点。n熟悉汇编语言的程序结构、段定义以及语句的格式。n掌握汇编语言常用伪指令的使用方法。n熟练掌握汇编语言程序设计的基本方法:顺序结构、 分支结构、循环结构和子程序结构。n*掌握程序设计中的宏指令和常用的系统功能的调用方法。教学目的综合硬指令和伪指令,从程综合硬指令和伪指令,从程序结构角度展开程序设计,:序结构角度展开程序设计,:分支结构程序设计分支结构程序设计循环结构程序设计循环结构程序设计子程序结构程序设计子程序结构程序设计教学重点教学重点1. 掌握掌握、及其汇编语言程序设计及其汇编语言程序设计2. 问题

7、:问题:(09、AZ、az);第 4 章 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试 当接到程序设计的任务后,当接到程序设计的任务后,首先对任务进行详尽的分首先对任务进行详尽的分析,搞清楚已知的数据和析,搞清楚已知的数据和想要得到的结果,想要得到的结果,程序应程序应该完成何种的功能。该完成何种的功能。汇编语言设计的一般步骤第 4 章 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试 根据

8、实际问题的要求和指令根据实际问题的要求和指令系统的特点,确定解决问题系统的特点,确定解决问题的具体步骤。根据任务要求,的具体步骤。根据任务要求,对不同的计算方法进行比较,对不同的计算方法进行比较,选择最适宜的算法选择最适宜的算法。 汇编语言设计的一般步骤第 4 章 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试将解决问题的具体步骤用一将解决问题的具体步骤用一种约定的几何图形、指向线种约定的几何图形、指向线和必要的文字说明描述出来和必要的文字说明描述出来的图形。工具:的图形。工具:VISIO,

9、AUTOCAD汇编语言设计的一般步骤第 4 章 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试 经过上述各步骤后,解决问题经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语能框选用合适的指令编写出汇编语言程序。言程序。 工具工具: UltraEdit, Beyond Compare 2汇编语言设计的一般步骤第 4 章 一、汇编语言程序设计的一般步骤一、汇编语言程序设计

10、的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试在应用程序的设计中,几乎在应用程序的设计中,几乎没有一个程序只经过一次编没有一个程序只经过一次编写就完全成功的,所以必须写就完全成功的,所以必须经过上机调试。工具:经过上机调试。工具: MASM,TASM,Emu8086, ReallyASM, Debug汇编语言设计的一般步骤一个程序应包括两个方面的内容一个程序应包括两个方面的内容对数据的描述:数据结构对数据的描述:数据结构(data structure)对操作的描述:算法对操作的描述:算法(algorithm)著名计算机科学家沃思提出一个公式

11、: 数据结构数据结构 + 算法算法 = 程序程序数据结构算法程序设计方法合适语言工具数据结构算法程序设计方法合适语言工具完整的程序设计应该是:第 4 章算法的概念 广义地说,为解决一个问题而采取的方法和步骤,就称广义地说,为解决一个问题而采取的方法和步骤,就称为为“算法算法”。方法方法1:1+2,+3,+4,一直加到,一直加到100 加加99次次方法方法2:100+(1+99)+(2+98)+(49 +51)+50 = 100 + 49100 +50 加加51次次对同一个问题,可有不同的解题方法和步骤对同一个问题,可有不同的解题方法和步骤例: 求1001nn简单地说:算法就简单地说:算法就是解

12、决问题的思路是解决问题的思路问题是:汇编语言问题是:汇编语言与高级语言的思路与高级语言的思路不太一样不太一样第 4 章用流程图表示算法用流程图表示算法美国国家标准化协会美国国家标准化协会ANSI(American National Standard ANSI(American National Standard Institute)Institute)规定了一些常用的流程图符号:规定了一些常用的流程图符号:起止框起止框判断框判断框处理框处理框输入输入/输出框输出框注释框注释框流向线流向线连接点连接点希望大希望大家重视家重视流程图是表示算法的较好的工具。一个流程流程图是表示算法的较好的工具。一个

13、流程图包括以下几部分图包括以下几部分 :(1)(1)表示相应操作的框;表示相应操作的框;(2)(2)带箭头的流程线;带箭头的流程线;(3)(3)框内外必要的文字说明。框内外必要的文字说明。 第 4 章传统流程图的流程可以是:传统流程图的流程可以是: 这种如同乱麻一样的算法称为这种如同乱麻一样的算法称为BSBS型算法,意为一碗型算法,意为一碗面条面条(A Bowl of Spaghetti)(A Bowl of Spaghetti),乱无头绪。,乱无头绪。缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。 第

14、 4 章 (3 3)分支)分支( (选择)结构选择)结构 (4 4) 子程序结构子程序结构 程序结构程序结构(5)复合结构:多种程序结构的组合)复合结构:多种程序结构的组合 (1 1) 顺序结构顺序结构 (2 2) 循环结构循环结构Bohra和Jacopini提出了以下三种基本结构: 顺序结构、选择结构、循环结构顺序结构、选择结构、循环结构 用这三种基本结构作为表示一个良好算法的基本单元。第 4 章 图中没有一条从入口图中没有一条从入口到出口的路径通过到出口的路径通过A A框。框。不正确的流程表示:不正确的流程表示:流程内的死循环流程内的死循环第 4 章4.3 顺序程序设计顺序程序完全按指令书

15、顺序程序完全按指令书写的前后顺序执行每一写的前后顺序执行每一条指令,是最基本、最条指令,是最基本、最常见的程序结构常见的程序结构一般纯粹的顺序结构的一般纯粹的顺序结构的程序设计较少程序设计较少开始执行1结束执行2例4.1.model small.model small.stack.stack.data.dataX Xdw 5dw 5Y Ydw 6dw 6Z Zdw 7dw 7W Wdw ?dw ?.code.code.startup.startupmov ax,Xmov ax,Xadd ax,Yadd ax,Yadd ax,Zadd ax,Zmov W,axmov W,ax.exit 0.ex

16、it 0endend计算:Z=X+Y,结果放在W64位数据左移8位 例4.21/2.data.dataqvarqvar dq 1234567887654321hdq 1234567887654321h.code.codemov al,mov al,byte ptr qvar6byte ptr qvar6mov mov byte ptr qvar7byte ptr qvar7,al,almov al,byte ptr qvar5mov al,byte ptr qvar5mov byte ptr qvar6,almov byte ptr qvar6,almov al,byte ptr qvar4m

17、ov al,byte ptr qvar4mov byte ptr qvar5,almov byte ptr qvar5,almov al,byte ptr qvar3mov al,byte ptr qvar3mov byte ptr qvar4,almov byte ptr qvar4,al图示图示3456788765432100例4.22/2mov al,byte ptr qvar2mov al,byte ptr qvar2mov byte ptr qvar3,almov byte ptr qvar3,almov al,byte ptr qvar1mov al,byte ptr qvar1m

18、ov byte ptr qvar2,almov byte ptr qvar2,almov al,byte ptr qvar0mov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar1,almov mov byte ptr qvar0,0byte ptr qvar0,01212 3434 5656 7878 8787 6565 4343 2121h h3434 5656 7878 8787 6565 4343 2121 0000h h移位后移位后图示图示第 4 章64位数据左移8位123456788765432100qvar0qvar

19、1qvar2qvar3qvar4qvar5qvar6qvar7例题 代码转换1/2;查表法,实现一位;查表法,实现一位1616进制数转换为进制数转换为ASCIIASCII码显示码显示.model small.model small.stack.stack.data.dataASCIIASCII db 30h,31h,32h,33h,34h,35hdb 30h,31h,32h,33h,34h,35hdb 36h,37h,38h,39hdb 36h,37h,38h,39h ;0;09 9的的ASCIIASCII码码db 41h,42h,43h,44h,45h,46hdb 41h,42h,43h,4

20、4h,45h,46h;A;AF F的的ASCIIASCII码码hexhexdb 0bhdb 0bh; ;任意设定了一个待转换的一位任意设定了一个待转换的一位1616进制数进制数例题 代码转换2/2.code.code.startup.startupmov bx,offset ASCIImov bx,offset ASCII;BX;BX指向指向ASCIIASCII码表码表mov al,hexmov al,hex;AL;AL取得一位取得一位1616进制数,正是进制数,正是ASCIIASCII码表中位移码表中位移and al,0fhand al,0fh; ;只有低只有低4 4位是有效的,高位是有效的

21、,高4 4位清位清0 0 xlatxlat; ;换码:换码:ALDS:BXALDS:BXALALmov dl,almov dl,al; ;入口参数:入口参数:DLALDLALmov ah,2mov ah,2;02;02号号DOSDOS功能调用功能调用 显示出来显示出来int 21hint 21h; ;显示一个显示一个ASCIIASCII码字符码字符.exit 0.exit 0endend第 4 章开始设置数据段和堆栈段地址设置堆栈指针取数据截取高四位右移四位 例:例:设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数, 并存入HEX和HEX+1单元的低4位,HEX存放高位

22、十六进制数, HEX+1单元存放低位十六进制数 解解 : 分析命题分析命题确定算法确定算法画流程图画流程图拆字程序拆字程序取原数据结束保存高位十六进制数截取低四位保存低位十六进制数保存结果第 4 章 MOV SS,AX MOV SP,LENGTH STK MOV AL,DATA MOV AH,AL AND AL,0F0H MOV CL,04 SHR AL,CL MOV HEX,AL AND AH,0FH MOV HEX+1,AH MOV AX,4C00H INT 21HCSEG ENDS END BEG 例:例:设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数, 并存入

23、HEX和HEX+1单元的低4位,HEX存放高位十六进制数, HEX+1单元存放低位十六进制数 解解 : 分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试拆字程序拆字程序 SSEGSEGMENT STACKSTKDB 20 DUP(0)SSEG ENDSDSEG SEGMENTDATA DB 0B5HHEXDB 0,0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGBEG: MOV AX,DSEGMOV DS,AX MOV AX,SSEG第 4 章4.4 分支程序设计分支程序根据条件是真或假决定执行

24、分支程序根据条件是真或假决定执行与否与否判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志等执行后形成的状态标志转移指令转移指令Jcc和和JMP可以实现分支控制可以实现分支控制单分支:求绝对值等双分支:显示BX最高位等多分支:例4.4等第 4 章29/18汇编语言程序的基本结构分支结构分支结构:n利用条件转移指令,使程序执行到某一指令后,根利用条件转移指令,使程序执行到某一指令后,根据条件是否满足,来改变程序执行的顺序。据条件是否满足,来改变程序执行的顺序。n一般先用一般先用比较指令比较指令或或数据操作数据操作及及位检测指令位检测指令来改变来改变标志寄存器各

25、个标志位,然后用标志寄存器各个标志位,然后用条件转移指令条件转移指令进行进行分支。分支。n绘制程序流程图步骤必不可少!绘制程序流程图步骤必不可少!n绘制程序流程图,一般先按上下流程线写,再完成绘制程序流程图,一般先按上下流程线写,再完成分支部分。分支部分。n绘制程序流程图的判断环节时,要特别注意把握绘制程序流程图的判断环节时,要特别注意把握逻逻辑关系辑关系和和标志位的意义标志位的意义。分支如何产生第 4 章单分支程序设计条件成立跳转,否条件成立跳转,否则顺序执行分支语则顺序执行分支语句体;注意选择正句体;注意选择正确的条件转移指令确的条件转移指令和转移目标地址和转移目标地址例题 求绝对值;计算

26、;计算AXAX的绝对值的绝对值cmp ax,0cmp ax,0jns no_negjns no_neg ; ;分支条件:分支条件:AX0AX0neg axneg ax; ;条件不满足,求补条件不满足,求补no_neg:no_neg: mov result,axmov result,ax; ;条件满足条件满足;计算;计算AXAX的绝对值的绝对值cmp ax,0cmp ax,0js yesnegjs yesneg; ;分支条件:分支条件:AXAX0 0jmp nonneg ;jmp nonneg ;分支条件:分支条件:AX=0AX=0yesneg:yesneg: neg axneg ax; ;条件

27、不满足,求补条件不满足,求补nonneg:nonneg: mov result,axmov result,ax; ;条件满足条件满足Good Bad例题 无符号数除以2(自学);AXAX中存放的无符号数中存放的无符号数; ;如果是偶数除以如果是偶数除以2 2,如果,如果是奇数,则加是奇数,则加1 1后除以后除以2 2test ax,01htest ax,01h; ;测试测试AXAX最低位最低位jz evenjz even; ;最低位为最低位为0 0:AXAX为偶数为偶数add ax,1add ax,1; ;最低位为最低位为1 1:AXAX为奇数,需要加为奇数,需要加1 1even:even:

28、rcr ax,1rcr ax,1;AXAX;AXAX2 2; ;如果采用如果采用SHR/SARSHR/SAR指令,则不能处理指令,则不能处理AXAXFFFFHFFFFH的特殊情况的特殊情况第 4 章分析命题分析命题确定算法确定算法画流程图画流程图开始取十六进制数X+30H0=X=9YN0A=X=0FHX+37H结束YN分支程序设计分支程序设计例:例:写一个实现把一位十六进制数转化为对应ASCII码的程序。 流程流程图的图的例子例子第 4 章分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试 JMP LAB2 LAB1: ADD AL,37H LAB2: MOV A

29、SCII,AL MOV AH,4CH INT 21H CODE ENDS END START DATASEGMENT XX DB 4 ASCII DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,0FH CMP AL,9 JA LAB1 ADD AL,30H分支程序设计分支程序设计例:例:写一个实现把一位十六进制数转化为对应ASCII码的程序。 第 4 章双分支程序设计条件成立跳转执行条件成立跳转执行第第2个分支语句体,个分支语句体,否则顺序执行第否则顺序执行第1个个分支语

30、句体。注意第分支语句体。注意第1个分支体后一定要个分支体后一定要有一个有一个JMP指令跳到指令跳到第第2个分支体后个分支体后例题 显示BX最高位-解法1shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjc onejc one;CF;CF1 1,即最高位为,即最高位为1 1,转移,转移mov dl,mov dl,0 0 ;CF;CF0 0,即最高位为,即最高位为0 0,DLDL0 0jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:one: mov dl,mov dl,1 1 ;DL;DL1 1two:two: mov ah,2mov

31、ah,2int 21hint 21h; ;显示显示另一种解法例题 显示BX最高位-解法2shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc onejnc one;CF;CF0 0,即最高位为,即最高位为0 0,转移,转移mov dl,mov dl,1 1 ;CF ;CF1 1,即最高位为,即最高位为1 1,DLDL1 1jmp twojmp two; ;一定要跳过另一个分支体一定要跳过另一个分支体one:one: mov dl,mov dl,0 0 ;DL;DL0 0two:two: mov ah,2mov ah,2int 21hint 21h; ;显示显示另一种解

32、法例题 显示BX最高位-解法3mov dl,mov dl,0 0 ;DL;DL0 0shl bx,1shl bx,1;BX;BX最高位移入最高位移入CFCFjnc twojnc two;CF;CF0 0,最高位为,最高位为0 0,转移,转移mov dl,mov dl,1 1 ;CF;CF1 1,最高位为,最高位为1 1,DLDL1 1two:two: mov ah,2mov ah,2int 21hint 21h; ;显示显示 解法三说明:双分支程解法三说明:双分支程序可以改为单分支程序序可以改为单分支程序第 4 章多分支程序设计多个条件对应各自的分支语句体,哪个条多个条件对应各自的分支语句体,

33、哪个条件成立就转入相应分支体执行。多分支可以件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如:化解为双分支或单分支结构的组合,例如: or ah,ahor ah,ah; ;等效于等效于cmp ah,0cmp ah,0 jz function0 jz function0;ah;ah0 0,转向,转向function0function0 dec ah dec ah; ;等效于等效于cmp ah,1cmp ah,1 jz function1 jz function1;ah;ah1 1,转向,转向function1function1 dec ah dec ah; ;等效于等效

34、于cmp ah,2cmp ah,2 jz function2 jz function2;ah;ah2 2,转向,转向function2function2图示图示想想想想C语言语言的的CASE多分支结构AH=0function0YNAH=1function1YNAH=2function2YN第 4 章第 4 章【例】编程实现下列函数的功能,其中X、Y为无符号字节数。(多分支)YXYXYXZ1011:画出详细流程2:编写完整程序第 4 章流程图第 4 章地址表形成多分支(太技巧,不用看)需要在数据段事先安排一个按顺序排需要在数据段事先安排一个按顺序排列的转移地址表列的转移地址表输入的数字作为偏移量

35、。因为有输入的数字作为偏移量。因为有2个字个字节节16位偏移地址,所以偏移量需要乘位偏移地址,所以偏移量需要乘2关键是要理解间接寻址方式关键是要理解间接寻址方式JMP指令指令地址表地址表分支分支1地址地址分支分支2地址地址.table dw disp1, disp2, disp3, disp4, .此例有此例有点难不点难不用看,用看,但这个但这个方法方法(技技巧)是巧)是汇编经汇编经常用到常用到的的.data.datamsgmsgdb Input number(18):,0dh,0ah,$db Input number(18):,0dh,0ah,$msg1msg1db Chapter 1 :

36、.,0dh,0ah,$db Chapter 1 : .,0dh,0ah,$msg2msg2db Chapter 2 : .,0dh,0ah,$db Chapter 2 : .,0dh,0ah,$.msg8msg8db Chapter 8 : . ,0dh,0ah,$db Chapter 8 : . ,0dh,0ah,$tabletable dw disp1,disp2,disp3,disp4dw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8dw disp5,disp6,disp7,disp8; ;取得各个标号的偏移地址取得各个标号的偏移地址

37、例4.4 数据段1/3此处等同于此处等同于 offset disp1start1:start1: mov dx,offset msgmov dx,offset msg ; ;提示输入数字提示输入数字mov ah,9mov ah,9int 21hint 21hmov ah,1mov ah,1; ;等待按键等待按键,ASCII CODE,ASCII CODEint 21hint 21hcmp al,1cmp al,1; ;数字数字 1 8 8?ja start1ja start1and ax,000fhand ax,000fh ; ;将将ASCIIASCII码转换成数字码转换成数字例4.4 代码段

38、2/3dec axdec axshl ax,1shl ax,1; ;等效于等效于add ax,axadd ax,axmov bx,axmov bx,axjmp tablebxjmp tablebx; ;(段内)间接转移:(段内)间接转移:IPtable+bxIPtable+bxstart2:start2:mov ah,9mov ah,9int 21hint 21h.exit 0.exit 0disp1:disp1:mov dx,offset msg1mov dx,offset msg1; ;处理程序处理程序1 1jmp start2jmp start2disp2:disp2:mov dx,of

39、fset msg2mov dx,offset msg2; ;处理程序处理程序2 2jmp start2jmp start2 .例4.4 代码段3/3可以改为可以改为 call tablebx对应修改为对应修改为 ret第 4 章4.5 循环程序设计循环结构一般是根据某一条件判断为循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体真或假来确定是否重复执行循环体循环指令和转移指令可以实现循环控循环指令和转移指令可以实现循环控制制循环指令LOOPE:例4.6转移指令:例4.7多重循环:例4.8等循环指令LOOP:例4.5第 4 章循环结构 结束结束 初始化初始化 循环的初始状态循环的初始

40、状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N第 4 章 循环程序结构形式循环程序结构形式DO-WHILE 结构结构 DO-UNTIL 结构结构控制条件控制条件初始化初始化循环体循环体YN控制条件控制条件初始化初始化循环体循环体YN第 4 章: 设置循环的初始状态设置循环的初始状态: 循环的工作部分及修改部分循环的工作部分及修改部分:计数控制(:计数控制(LOOP) 特征值控制特征值控制(LOOPZ/LOOPNZ/ 条件跳转指令条件跳转指令) 循环程序结构说明循环程序结构说明第

41、4 章例例4.5:把:把 BX BX 中的二进制数以十六进制的形式显示在屏幕中的二进制数以十六进制的形式显示在屏幕上上 如:如:1011 0010 1111 1010 B H BXBX1234第 4 章分析:分析:(1)程序结构的确定程序结构的确定 由题意由题意,显然这可以用循环结构来完成,每次显,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已知的,计数值示一个十六进制数位,因而循环次数是已知的,计数值为为4。 (2)循环体的构成(算法确定)循环体的构成(算法确定) 循环体应该包括:循环体应该包括:。 需要了解相关知识需要了解相关知识:字符和其字符和其ASCII码之间的

42、关系?码之间的关系? “0”“9” 30H39H, “A”Z” 41H5AH如何显示一个字符?如何显示一个字符?(a)将显示字符的将显示字符的ASCII码放入码放入DL寄存器;寄存器;(b)将将AH的内的内容置为容置为2(功能号);(功能号);(c)执行执行INT 21H(DOS 功能调功能调用)。用)。第 4 章开开始始初初始始化化循循环环计计数数值值B B X X 循循环环左左移移一一个个数数位位把把最最右右面面的的数数位位转转换换为为A A S S C C I I I I是是A A S S C C I I I IA A F F ?加加上上7 7显显示示一一个个字字符符循循环环计计数数值值

43、= = 0 0 ?结结束束Y YN NN NY Y(3)循环控制条件分析)循环控制条件分析因为循环次数已知,可以使用因为循环次数已知,可以使用实现,但是必须注意:实现,但是必须注意:。除了可以使用除了可以使用LOOPLOOP指令之外,还指令之外,还可以使用可以使用来实现。来实现。LOOP AGAIN DEC 计数器计数器 JNZ AGAIN第 4 章 mov cx, 4 mov cx, 4 ;初始化;初始化rotate: rotate: mov cl, 4 ; mov cl, 4 ; 把高四位移到低四位把高四位移到低四位 rol bx, clrol bx, cl mov al, bl mov

44、al, bl;找出;找出BXBX的低四位的低四位 and al, 0fhand al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl printit;al3ah;al3ah add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46H printit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h loo

45、p rotate loop rotate 方法方法1 (LOOP)注意注意这个这个地方地方这是这是干什干什么?么?显示显示AL的的内容内容第 4 章 mov mov , 4 , 4 ;初始化;初始化rotate: mov rotate: mov , 4, 4 rol bx, cl rol bx, cl mov al, bl mov al, bl and al, 0fh and al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl print

46、it add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h 方法方法2 (条件跳转指令条件跳转指令).model small.model small.stack.stack.data.datasumsumdw ?dw ?.code.code.startup.startupxor ax,axxor ax,ax; ;被加数被加数AXAX清清0 0mov cx,mov cx,100100agai

47、n:again:add ax,cx add ax,cx ; ;从从100,99,.,2,1100,99,.,2,1倒序累加倒序累加loop againloop againmov sum,axmov sum,ax; ;将累加和送入指定单元将累加和送入指定单元.exit 0.exit 0endend例4.6 求和:1+2+100 计数控制循环计数控制循环 循环次数固定循环次数固定mov bx,offset stringmov bx,offset stringagain:again: mov al,bxmov al,bx ; ;取一个字符取一个字符or al,alor al,al; ;是否为结尾符是

48、否为结尾符0 0jz donejz done; ;是,退出循环是,退出循环cmp al,Acmp al,A; ;是否为大写是否为大写A AZ Zjbjb next nextcmp al,Zcmp al,Zjaja next nextor al,20hor al,20h; ;是,转换为小写字母(使是,转换为小写字母(使D D5 5=1=1)mov bx,almov bx,al ; ;仍保存在原位置仍保存在原位置next:next:inc bxinc bxjmp againjmp again; ;继续循环继续循环done:done:.exit 0.exit 0例4.7 把一串字符中的大写改为小写

49、条件控制循环条件控制循环 利用标志退出利用标志退出大小写字母仅大小写字母仅 D D5 5位位不同不同第 4 章冒泡法“冒泡法冒泡法”是一种排序算法,不是最优的算是一种排序算法,不是最优的算法,但它易于理解和实现法,但它易于理解和实现冒泡法从第一个元素开始,依次对相邻的两冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大外的元素依上述方法再进行比

50、较,得到次大的元素排在后面;如此重复,直至完成就实的元素排在后面;如此重复,直至完成就实现元素现元素从小到大从小到大的排序的排序这需要一个双重循环程序结构这需要一个双重循环程序结构图示图示冒泡法的排序过程序号序号 数数比 较 遍 数1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285第 4 章movmov cxcx,count,count;CX;CX数组元素个数数组元素个数dec cxdec cx; ;元素个数减元素个数减1 1为外循环次数为外循环次数outlp:outlp:movmov dxdx,cx,cx;DX;D

51、X内循环次数内循环次数mov bx,offset arraymov bx,offset arrayinlp:inlp: mov al,bxmov al,bx; ;取前一个元素取前一个元素cmp al,bx+1cmp al,bx+1 ; ;与后一个元素比较与后一个元素比较jna nextjna next; ;前一个不大于后一个元素,则不进行交换前一个不大于后一个元素,则不进行交换xchg al,bx+1xchg al,bx+1; ;否则,进行交换否则,进行交换mov bx,almov bx,alnext:next: inc bxinc bx; ;下一对元素下一对元素dec dxdec dxjnz

52、 inlpjnz inlp; ;内循环尾内循环尾loop outlploop outlp; ;外循环尾外循环尾例4.8 计数控制双重循环计数控制双重循环; ;现有一个以现有一个以$ $结尾的字符串,要求剔除其中的空格结尾的字符串,要求剔除其中的空格.data.datastringstringdb db Let us have a try !Let us have a try !, ,$ $.code.code.startup.startupmov di,offset stringmov di,offset stringoutlp:outlp:cmp byte ptr di,cmp byte pt

温馨提示

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

评论

0/150

提交评论