微机原理课件第四章-汇编语言程序设计_第1页
微机原理课件第四章-汇编语言程序设计_第2页
微机原理课件第四章-汇编语言程序设计_第3页
微机原理课件第四章-汇编语言程序设计_第4页
微机原理课件第四章-汇编语言程序设计_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

1、微型计算机原理及其应用第四章:汇编语言程序设计1第四章 汇编语言程序设计汇编语言程序格式伪指令语句DOS系统功能调用和BIOS中断调用程序设计方法2汇编语言是利用指令的助记符、符号地址、标号来编写的语言。用汇编语言编写的程序称为汇编语言源程序;把汇编语言源程序翻译成由机器代码组成的目标程序的过程称为汇编;用来把汇编语言源程序自动翻译成目标程序的软件叫汇编程序。 3计算机语言可分为机器语言、汇编语言、高级语言三类。机器语言是计算机唯一能识别的语言(二进制语言)汇编语言是面向机器的语言,不同的CPU有不同的汇编语言(PC机汇编、单片机汇编) 优点:直接针对硬件操作,效率高,节省内存,运行速度快,实

2、时性能好。高级语言是面向过程的语言:如Basic、c、Pascal目前流行的面向对象的语言:VB、VC、C#8086系统中常用的汇编程序: 宏汇编程序MASM4【例】显示输出“This is a sample program.”DATA SEGMENT ;数据段DA1 DB This is a sample program. DB 0DH,0AH, ;回车符和换行符的ASCII码DATA ENDS STACK SEGMENT STACK STACK;堆栈段 ST1 DB 100 DUP(?) ;定义100个空的字节单元STACK ENDSCODE SEGMENT ;代码段 ASSUME CS:

3、CODE,DS:DATA,SS:STACK ;段分配MAIN PROC FAR ;主过程开始START: MOV AX,STACK ;初始化SS MOV SS,AX5 PUSH DS ;为返回DOS设置堆栈 MOV AX,0 PUSH AX MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9号调用,显示字符串,以结束 MOV DX,OFFSET DA1 INT 21H RET ;返回DOSMAIN ENDP ;主过程结束CODE ENDS ;代码段结束 END START ;源程序结束6【例】显示输出“Hello!”DATA SEGMENT ;数据段STRING

4、DB Hello!, DATA ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA ;段分配START: MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9号调用,显示字符串,以结束 MOV DX,OFFSET STRING INT 21H MOV AH,4CH ;返回DOS INT 21HCODE ENDS ;代码段结束 END START ;源程序结束7由例程看出:(1)8086汇编源程序具有分段结构 段名 SEGMENT 段名 ENDS 在源程序中各段的顺序可以任意,段的数目可根据需要确定(至少有一个代码段),原则上不

5、受限制。而每个段又是由若干语句组成,语句是汇编语言源程序的基础。(2)CS不能人为设置,其它段寄存器的初始化需两条指令完成(MOV AX,DATA MOV DS,AX)。8(3)两种返回DOS的方法:MAIN PROC FAR ;将主程序建立为过程 PUSH DS ;将DOS段值和偏移量(0)入栈 MOV AX,0 PUSH AX RET ;返回DOS(将0和DOS段值IP、CS) MAIN ENDP ;主过程结束使用4CH号的DOS系统功能调用 MOV AX,4C00H(或MOV AH ,4CH) INT 21H(4)全部源程序用END伪指令结束。9MASM中可使用的语句分成两类:指令性语句

6、和伪指令语句。一、指令性语句特点:与机器指令相对应,汇编时产生目标代码。标号:指令助记符 操作数,操作数 ;注释标号:表示本指令语句的符号地址,后跟冒号“:”,用作转移的目标地址;指令助记符:指出指令的操作类型,由英文字母缩写而成;操作数:指明参加指令运算的数据,有无操作数、单操作数和双操作数之分,其中双操作数之间用逗号“,”分隔,操作数与指令助记符之间用空格隔开;注释:用来说明一条指令或一段程序的功能,前面以分号“;”为标记,汇编程序对注释不进行汇编,增加可读性其中指令助记符是关键字,不可省略,其余部分均可省略。4-1 汇编语言程序格式10二、伪指令语句特点:没有对应的机器指令(本身不产生目

7、标代码),只为汇编程序提供汇编信息。格式: 名字 伪指令指示符 操作数,操作数 ;注释名字:给伪指令取的名称,用符号地址表示,名字后不带冒号“:”,只用空格符与伪指令指示符相分隔;伪指令指示符:是MASM规定的符号,明确不同的操作;操作数:规定同指令性语句,区别在于操作数可能多于2个;注释:规定同指令性语句其中不可省略的部分是伪指令指示符,其余均可缺省。三、数据项操作数的三种基本数据项:常数、变量、标号11常量:固定值,不能改变 a.数字常数:字母后缀B、Q(或O)、D可省略、H b.字符串常数:ABCASCII码字节序列41H、42H、43H c.符号常数:COUNT EQU 100变量:某

8、操作数据所存放单元的符号地址,在CS以外的其它段由DB、DW等定义标号:某条指令所存放单元的符号地址,在CS中定义变量和标号均具有三种属性:a.段值(SEGMENT):可用分析运算SEG取出b.段内偏移地址(OFFSET):可用分析运算OFFSET取出c.类型(TYPE):可用分析运算TYPE取出 变量:每个元素所包含的字节数,有BYTE、WORD和DWORD三种类型。 标号:可转移的距离(或距离属性),有NEAR和FAR两种。12四、MASM中的表达式表达式由运算对象和运算符组成,在汇编过程中完成表达式运算。其中运算对象可以是常数、变量、标号、寄存器等。1.算术运算符(运算对象和运算结果均为

9、整数)包括:+、- 等,常用于地址运算。注:两符号地址相减表示某符号地址占用的内存字节数。【例】ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV CX,TRY-ARRAY 汇编后: MOV CX,8 132.逻辑运算符(按位运算)包括:AND、OR、NOT、XOR例:AND AL, 8FH AND 73H 运算符,汇编过程中完成 指令助记符,程序执行时完成。3.关系运算符包括:EQ、NE(不等)、LT(小于)、GT(大于)、LE()、GE() a.结果为真,输出全1(字节运算为OFFH或字运算为OFFFFH) b.结果为假,输出全0【例】 MOV AX,10H GE

10、 16汇编后:MOV AX,0FFFFH144.数值返回运算符(或分析运算符) 功能:返回运算对象的某个参数值。包括:SEG、OFFSET、TYPE、LENGTH、SIZESEG 变量或标号 ;取段基址 常用法:MOV AX,SEG M1(或用段名) MOV DS, AXOFFSET 变量/标号 ;取偏移地址值 常用法:MOV BX,OFFSET DA1 ;设地址指针 LEA BX,DA1TYPE 变量/标号 ;取类型属性 变量返回1(DB)、2(DW)、4(DD)等 标号返回-1(NEAR)、-2(FAR) (0FFH) (0FEH)15DATASEGMENT;定义数据段VAR1 DB 10

11、H,18H,25H,34H;定义字节数据VAR2 DW 2300H,1200H ;定义字数据VAR3 DD 11002200H,33004400H ;定义双字数据DATAENDS;数据段结束设DATA段起始于物理地址30000H处,则MOV BX,SEG VAR1 汇编成: MOV BX,3000HMOV CX,SEG VAR2 汇编成: MOV CX,3000HMOV DX,SEG VAR3 汇编成: MOV DX,3000HMOV BX,OFFSET VAR1 汇编成: MOV BX,0000HMOV CX,OFFSET VAR2 汇编成: MOV CX,0004HMOV DX,OFFSE

12、T VAR3 汇编成: MOV DX,0008H16【例】A1 DB 20H,30H A2 DW 0438H A3 DD ? L1: MOV AH,TYPE A1 MOV BH,TYPE A2 MOV AL,TYPE A3 MOV BL,TYPE L1汇编后:MOV AH,1 MOV BH,2 MOV AL,4 MOV BL,0FFH17LENGTH 变量 ;返回重复操作符DUP之前的重复次数,若不是由DUP定义,则都返回1。SIZE 变量 ;返回该变量包含的总字节数。 SIZE=LENGTH*TYPE注:SEG、OFFSET、TYPE可用于变量和标号前,返回三种属性值;而LENGTH和SIZ

13、E只对变量才有效。【例】M1 DW 100 DUP (?) M2 DW 1,2,3 M3 DB A B C D MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV AL,LENGTH M318汇编后: MOV CX,100 MOV BL,1 MOV AL,1 若指令改为: MOV CX,SIZE M1 MOV BL,SIZE M2 MOV AL,SIZE M3 则汇编后: MOV CX,200 MOV BL,2 MOV AL,1195.修改属性运算符(综合运算符)功能:修改变量/标号的三种属性段操作符:修改段基址与偏移地址来源的默认关系,格式如下:段前缀:变量或地址表达

14、式例:MOV AX ,ES:BXPTR:对变量/标号赋予新的属性,以保证操作数类型的匹配,常与BYTE、WORD、NEAR、FAR等连用。格式:新类型 PTR 变量/标号例:MOV BX,10H ;汇编时提示错误 MOV BYTE PTRBX,10H ;BX10H MOV WORD PTRBX,10H ;BX,BX+10010H20例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX, WORD PTR N1 执行后:AX=3615H MOV BL, BYTE PTR N2 执行后:BL=22H MOV AX, WORD PTR N1+1 执行后:AX=2236H注

15、:若符号地址出现在操作数中,其类型为DB、DW所定义的类型(如直接寻址、寄存器相对寻址、相对基址变址寻址),如类型不匹配汇编时提示Warning Error:Operand types must match 或 Illegal size for operand;若存储器操作数中不包含符号地址(如寄存器间接寻址等),则该操作数的类型不确定,指令中的另一操作数必须明确类型,否则汇编时提示Severe Error:Operand must have size.例:LEA BX,N1之后CMP BX,10H 或 INC BX均出错。21THIS:对变量/标号赋予新的属性,且该变量或标号的段地址和偏移地

16、址与下一个存储单元的地址相同。格式:变量/标号 EQU THIS 类型 例:FIRST EQU THIS BYTE TABLE DW 200 DUP(?) TABLE为字类型,FIRST为字节类型,两者地址相同。(该数据区具有双重类型属性) MOV AL , FIRST MOV AX , TABLE 均正确。SHORT:说明转向地址为短转移(8位位移量) 格式:SHORT 标号例:JMP SHORT LP MOV -128+127之间LP: MOV226.其它运算符 方括号 a.表示地址表达式例:M1 DB 10H,20H,30H,40H M2 DW 1234H,5678H,9ABCH MOV

17、 BX,OFFSET M1 MOV CL,BX ;10HCL MOV BX,OFFSET M2 MOV DX,BX+2 ; M2的第二个单元5678HDX b.表示多重变量的下标值(下标从0开始算)例:MOV CX,M20 ;1234HCX MOV M21,CX ;CXM2的第二个单元,覆盖5678H234-2 伪指令语句特点:无对应的机器代码,在汇编期间进行处理 (不是由CPU执行) (为汇编程序提供汇编信息)一、数据定义语句功能:为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为此存储单元提供任意初始值。例:ARRAY DB 1,2,4 则ARRAY记为第一个字节的偏移地址该

18、伪指令助记符有:DB 定义字节 DW 定义字 DD 定义双字241、操作数是常数或表达式,可以为数据或地址 DA DW 1122H,34H,5*20H2、操作数为字符串,字符串必须用单引号括起来 STR1 DB OK STR2 DW OK注:字符串一般用DB定义,有时2个字符可用DW定义3、可用?保留空单元(分配内存单元但不初始化) M1 DB ? M2 DW 1234H,?4、用重复操作符DUP初始化重复数据格式:DB(或DW) 重复次数 DUP(重复内容)注:DUP可嵌套 ARR DW 3 DUP(1,2 DUP(0),2) ;变量共占 ?个字节单元2425二、表达式赋值语句(不占用内存)

19、1、赋值语句 EQU格式:符号名 EQU 表达式(表达式应有确定值) COUNT EQU 100EQU左边的名字等价于右边的表达式2、等号语句 = COUNT = 100与EQU语句具有相同功能。区别:EQU中的符号名不允许重复定义,应先用PURGE语句解除,而“=”伪指令可以。例:C1 EQU 100 PURGE C1 ;C1不再代表100 C1 EQU 20026三、段定义语句1、段定义语句 SEGMENTENDSSEGMENT和ENDS必须成对使用,将源程序分段。段名 SEGMENT 定位类型 组合类型 分类名 段名 ENDS在SEGMENT和ENDS之间,对于数据段、附加段和堆栈段中,

20、一般是一些伪指令;而对于代码段,主要是指令序列和伪指令。27(1)定位类型:对段起始地址定位此参数一般缺省,缺省值为PARA,表示段起始地址必须在节的整数边界(存储空间从0开始,每16个存储单元叫一节)。(2)组合类型:提出各个逻辑之间的组合方式此参数在堆栈段中不可缺省,用STACK指定该段为堆栈段。而在其它段中一般缺省,缺省值为NONE,表示该段与其它同名段不进行连接,各段独立存在于存储器中。(3)分类名此参数一般缺省,主要作用是汇编程序连续时将所有分类名相同的逻辑段组成一个段组。282、段分配语句(ASSUME)ASSUME CS:CODE ,DS:DATA ,SS:STACK ,ES:E

21、XTRA该语句不可省略,一般放在代码段的开始。用来建立4个段寄存器(CS、DS、ES、SS)与程序中所取段名(位于SEGMENT和ENDS之前)之间的对应关系。但ASSUME语句只指定某个段分配给哪个段寄存器,它并不能把段基址装入段寄存器中,故DS、ES、SS的具体值还必须分别通过两条MOV指令得到(如初始化SS,还应加上SP的初始化),但CS的赋值是在程序初始化时自动完成的。29总结:分段程序的两种完整段定义格式(1)DATA SEGMENT ;数据段 DATA ENDS STACK SEGMENT STACK ;堆栈段 STT DW 100 DUP(?) TOP EQU SIZE STT

22、STACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;段分配 MAIN PROC FAR ;主过程 START: MOV AX , STACK ;初始化SS和SP MOV SS , AX MOV SP , TOP DW 100 DUP (?)TOP EQU $30 PUSH DS ;为返回DOS设置堆栈 MOV AX ,0 ;(XOR AX,AX),(AND AX,0) ;(SUB AX,AX) PUSH AX MOV AX ,DATA ;初始化DS MOV DS ,AX RET ;返回DOSMAIN ENDPCODE EN

23、DS END START31(2)前面两个段相同 CODE SEGMENT ASSUME START: 段寄存器及SP初始化 MOV AH ,4CH ;利用4CH号DOS系统 INT 21H ;功能调用返回DOS CODE ENDS END START32例:两个16位无符号二进制数相乘。DATA SEGMENTD1 DW 1234HD2 DW 5678HP1 DD ?P2 DD ?DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP (?)TOP EQU SIZE STT STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STA

24、CK,DS:DATA33START:MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,AXL1: MOV AX,D1 MUL D2 MOV BX,OFFSET P1 MOV BX,AX MOV BX+2,DX MOV AH,4CH INT 21HCODE ENDS END START34四、过程定义语句(子程序定义语句)格式:过程名 PROC NEAR或FAR RET 过程名 ENDPa.每定义一个过程,PROC和ENDP要成对出现,两者前面的过程名应一致。b.主、子程序在同一代码段中,则定义为NEAR型(或缺省) 主、子程序不在同一代码

25、段中,则定义为FAR型; 一般可将主程序定义为FAR属性(主过程作为DOS调用的一个远端子过程)c.要调用一个过程,在主调函数中用CALL 过程名,而过程返回必须通过RET语句。35例:用过程调用的方法,将内存中4个BCD码相加。DATA SEGMENTONE DB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HSUM DB 20 DUP (?)DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP (?)TOP EQU SIZE STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:

26、DATA,ES:DATASTART:MOV AX,STACK MOV SS,AX MOV SP,TOP36 MOV AX,DATA MOV DS,AX MOV ES,AX MOV SI,OFFSET ONE ;设置地址指针 MOV BX,OFFSET TWO MOV DI,OFFSET SUM CLD ;清方向标志 CLC ;清进位标志 MOV CX,4 ;循环次数LL: CALL ABC LOOP LL MOV AH,4CH INT 21H37ABC PROC NEAR ;完成单字节数据加法运算 LODSB ;DS:SIAL,SI+1SIL1: ADC AL,BX ;带进位相加 DAA ;十

27、进制调整 STOSB ;ALES:DI,DI+1DI INC BX ;修改指针 RETABC ENDPCODE ENDS END START38五、程序开始和结束语句1.NAME:为源程序目标模块赋名字格式:NAME 程序名一般放在程序开始,列表文件将打印此程序名,如缺省NAME语句,汇编程序将源文件名作目标模块的名字。2.ORG:定位伪指令格式:ORG 表达式(值为065535)功能:表示下面存储单元的偏移地址从表达式的值开始排。即程序和数据要从某一个特定的地址开始存放。注:一般,段内的EA是从段名SEGMENT以下,以0作为开始,以后每分配一个字节,EA加1。若要给某变量或标号设置特定的起

28、始偏移地址,可用ORG语句。 39例:DATA SEGMENT ORG 100H A1 DB 10H,20H,30H ORG 200H A2 DB 40H,50H,60H DATA ENDS3.END:源程序结束语句格式:END 标号:标号为程序中第一条指令的起始地址,可以缺省。放在源程序最后一行,告诉汇编程序,源程序到此结束,此后的内容将被认为不属于本程序的范畴。 40汇编语言中经常地址计数器的值。(P150)注:地址计数器用来保存当前指令或数据的偏移地址。其值可用“”来引用,“”的值是动态变化的。常用于堆栈段的长度定义,以便于设置堆栈指针。例: ORG 1000H ABC DW 1,2,+

29、4,ODH,OAH,+3设定ABC的偏移地址为1000H,则第一个“”代表1004H,而第二个“”代表100AH。 上述语句等价于 ABC DW 1,2,1008H,ODH,OAH,100DH例:STACK SEGMENT DW 100 DUP(?) TOP EQU STACK ENDS MOV SP,TOP ;代码段中初始化堆栈指针SP41六、高档微机增加的伪指令1、常用伪指令(1) .386 选择80386指令系统(2) .EXIT 返回DOS(3) .MODEL 选择编程模型(4) .STARTUP 指示程序的开始(包括段寄存器初始化)2、汇编语言的两种编程格式完整的段定义模型常用模型S

30、MALL,包含两个段:64KB的代码段和64KB的数据段。42例:将存储块LIST1中100个字节的内容复制到存储块LIST2中。.MODEL SMALL ;小模型.386 ;选择80386指令系统.STACK 100H ;定义堆栈段.DATA ;定义数据段LIST1 DB 100 DUP (?)LIST2 DB 100 DUP (?).CODE ;定义代码段.STARTUP ;说明程序的起点,初始化DS、SSCLDMOV SI,OFFSET LIST1MOV DI,OFFSET LIST2MOV CX,100REP MOVSB.EXIT 0 ;返回DOS(返回0,表示无错误)END43操作系

31、统(OS)包括DOS、WINDOWS、UNIX等。操作系统是用户和PC机之间的接口,用户依靠操作系统来使用PC机。DOS系统设置了两层内部子程序(供用户使用)基本输入输出系统BIOS(OS的核心)主要功能:驱动系统所配置的外部设备采用BIOS功能调用(INT 10HINT 1AH)DOS层的功能模块(DOS系统功能调用)主要功能:文件管理、存储管理、作业管理、设备管理等原理:通过BIOS使用外部设备,但功能较BIOS弱。(INT 21H)一、DOS系统功能调用简述按功能分为六组:1.字符I/O管理 2.传统的文件管理(磁盘)3.扩充的文件管理(目录、文件) 4.内存管理(内存)5.作业管理(终

32、止、装入等) 6.其它资源管理(日期、时间等)4-3 DOS系统功能调用和BIOS中断调用44二、DOS系统功能调用(88种功能,系统功能号00H57H)调用格式分四步:系统功能号AH置入口参数执行中断指令INT 21H分析出口参数。三、常用的DOS系统功能调用1. 01H号调用:读取键盘单字符并回显调用方式:MOV AH ,1 INT 21H注:无入口参数 出口参数:所按键字符对应的ASC码AL45【例】交互式程序中用户按下1,2,3,程序转入相应的服务子程序,若按下其它键就继续等待。KEY: MOV AH,1 ;读入键值AL INT 21H CMP AL,1 ;按下数字键1? JE ONE

33、 CMP AL,2 ;按下数字键2? JE TWO CMP AL,3 ;按下数字键3? JE THREE JMP KEY ;等待键入正确数字ONE: TWO: THREE: 462. 02H调用:显示单字符调用方式: MOV DL ,待显示字符的ASC码 MOV AH ,2 INT 21H 注:出口参数是把字符显示在屏幕上。3. 09H号调用(字符串输出显示)调用方式:DS:DX待显示字符串的首地址 MOV AH ,9 INT 21H注:待显示字符串必须以“”字符结束,且“”不显示,只作为结束标志。47【例】在屏幕上显示HOW ARE YOU!,且光标换行。 CR EQU 0DH ;回车符AS

34、CII码 LF EQU 0AH ;换行符ASCII码 MES DB HOW ARE YOU!,CR,LF,$ MOV DX,OFFSET MES MOV AH,9 INT 21H4. OAH号调用(字符串输入)调用方式:DS:DX接收字符的输入缓冲区首地址 MOV AH ,OAH INT 21H注:a.直到回车符结束48b.缓冲区第一个字节为此区能接收字符的个数;第二个字节保留(用“?”初始化),用作填写实际字符个数;从第三个字节开始顺序存放键盘输入的字符。c.如实际输入字符数定义的字节数,缓冲区其余字节补零。【例】开辟一个缓冲区接收从键盘输入的字符串,将输入的字符数存入CL寄存器,并将指针指

35、向第一个字符。 BUFF DB 100 ;缓冲区大小 DB ? ;实际输入字符数 DB 100 DUP(?) ;顺序存放输入字符 MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1 ;取字符数 ADD BX,2 ;指针指向第一个字符5. 4CH号调用:返回操作系统调用方式:MOV AH ,4CH INT 21H注:无入口参数494-4 程序设计方法汇编语言设计基本要求:结构化、简明、易读、易调试执行速度快占用的存储空间少 在结构化程序设计中,提倡采用的基本结构形式是:顺序结构、分支结构、循环结构、子程序结构。一、顺序结构一般为

36、简单程序,由上而下顺序执行每条指令无分支,无循环,无转移,又称为直线程序顺序程序结构是各种其它程序结构中的局部程序段50【例】内存中TABLE开始存放09的平方值,通过人机对话,当任意输入09,查表得出平方值,放在AL中。.MODEL SMALL.386.STACK 100H.DATATABLE DB 0,1,4,9,16,25,36,49,64,81BUF DB Input one number(09),ODH,0AH,$.CODE.STARTUPLEA DX,BUF ;显示提示字符串MOV AH,9INT 21H51MOV AH,1 ;等待键入INT 21HAND AL,0FH ;屏蔽AL

37、高4位,低4位不变MOV BX,OFFSET TABLEMOV AH,0ADD BX,AXMOV AL,BX.EXIT 0ENDXLAT TABLE52二、分支结构分支结构有两种形式: 双分支结构和多分支结构条件?分支程序段1分支程序段2YN条件?程序段1程序段n程序段2条件1条件2条件n图a:双分支图b:多分支531、双分支结构双分支结构一般由四个部分组成:产生条件:用于比较、判断的指令CMP、SUB、TEST、AND、CMPSB/W 、SCASB/W、移位指令(如判AX中有多少个“1”)等只要能影响PSW中的一个或多个标志。测试:条件转移指令JC、JA、JG等定向:根据条件,决定程序的不同

38、走向(条件满足或不满足,程序转移或不转移即顺序执行)标号:用来指定分支后的转移地址。应注意统一出口:某个分支结束后用JMP指令跳过另一分支。2、多分支结构一次判断可引出两个分支,故N个分支,需N-1次判断。按条件的先后,依次分解成一串双分支结构,然后使用双分支的方法进行程序设计。实质是用一连串的条件转移指令来实现。54【例】存储器中有一串字符串首址为BUF,字符串长度N小于256,要求分别计算出其中数字、大写字母和其它字符的个数,存放在字符串的下面三个单元中。解:本题根据字符的ASCII码值范围进行判断,大写字母 41H5AH,数字30H39H。.MODEL SMALL.386.STACK 1

39、00H.DATA BUF DB 7 DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP (?).CODE.STARTUP55 MOV CH,BUF ;数组个数CH MOV BX,1 MOV DX,0 ;DH计数字个数,DL计字母个数LP: MOV AH,BUFBX ;第一次取01HAH CMP AH,30H JL NEXT ;小于0转(用JB最佳) CMP AH,39H JG ABC ;大于9转(用JA最佳) INC DH ;数字个数+1 JMP NEXTABC: CMP AH,41H JL NEXT ;小于A 转 CMP AH,5AH JG NEXT ;大

40、于Z转 INC DL ;字母个数+156NEXT: INC BX ;数组地址+1 DEC CH ;计数-1 JNZ LP ;不为0跳转继续 MOV NUM,DH ;数字个数送入内存单元 MOV NUM+1,DL ;字母个数送入内存单元 MOV AH,BUF SUB AH,DH ;计算其它字符个数 SUB AH,DL MOV NUM+2,AH ;其它字符个数送入内存单元.EXIT 0END57【例】设有首地址为BUFFER的数据,已按升序排好,字组的长度N(=10),在该数组中查找数M(=80),若找到它则从数组中删掉,若找不到将它插入正确的排列位置,DX中记录数组最后的长度。DATA SEGM

41、ENTBUFFER DW 5,10,32,47,53,77,89,106,115,124N DW 10M EQU 80DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATAMAIN PROC FARSTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX58 MOV AX,M ;待查数AX MOV CX,N ;计数CX MOV DX,N ;数组长度 MOV DI,OFFSET BUFFER CLDREPNE SCASW ;串扫描查找 JE DEL ;找到ZF=1 DEC

42、 DX ;未查到,此数插入正确位置 MOV SI,DX ;定位到BUFFER最后一个数 ADD SI,DXL1: CMP AX,BUFFERSI ;关键字从后向前比较 JL L2 ;关键字比数组中某个字小 MOV BUFFERSI+2,AX ;否则插在后面 JMP L3 59L2: MOV BX,BUFFERSI ;数组后移一个数 MOV BUFFERSI+2,BX SUB SI,2 ;指针前移一个数 JMP L1L3: ADD DX,2 ;修改长度 JMP NEXT1DEL: JCXZ NEXT ;找到,且为最后一个数,删此元素DEL1: MOV BX,DI ;其后元素依次前移 MOV DI

43、-2,BX ADD DI,2 LOOP DEL1NEXT: DEC DX ;改变数组长度NEXT1:RETMAIN ENDPCODE ENDS END START60三、循环结构1. 循环结构有两种结构形式a. “先执行,后判断”结构(直到型) : 至少执行一次循环体(不允许零次循环); 适合于循环次数固定的程序b. “先判断,后执行”结构(当型) : 循环体可能一次也不执行(允许零次循环) ; 适合于循环次数不固定的程序61入口入口初始化部分初始化部分循环体修改参数循环控制出口循环控制循环体修改参数”先执行,后判断“结构”先判断,后执行“结构62循环结构包括四部分:(1)初始化:为循环做准备

44、,建立指针,设置循环计数器,设置其它变量的初值(2)循环体:循环部分的核心,完成循环的基本操作(3)修改参数:修改地址指针,为下次循环作准备(4)循环控制:修改计数器值,判断循环控制条件,决定是否继续循环632. 循环程序的控制方法 核心问题:循环的控制(1)计数控制法(已知循环次数)正计数法:计数器初值为0,递增,与终值比较倒计数法:计数器初值设为循环次数,递减,直到减为0为止,一般用LOOP完成,或用DEC和JNZ联用实现。(2)条件控制法(循环次数未知)每执行一次循环体后判断一次循环条件,满足循环条件,继续循环;不满足则结束循环。一般在数据或表格处理中常在末尾添加一个特殊的结束标志。64

45、【例】将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示出数值。 MOV SI,OFFSET BUF ;设置地址指针 MOV CH,4 ;计数初值=4NEXT: MOV CL,4 ;最高位移到右边 ROL BX,CL MOV AL,BL ;转换成ASCII码 AND AL,0FH ADD AL,30H CMP AL,3AH ;字符为AF吗? JL STORE65 ADD AL,7STORE:MOV SI,AL ;字符存入内存 MOV AH,2 ;显示单字符 MOV DL,AL INT 21H INC SI DEC CH ;修改计数并判断 JNZ NEXT HL

46、T ;循环结束此题采用“先执行,后判断”的结构。66【例】AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到CL寄存器。 MOV CL,0 ;初始化L1: AND AX,AX ;循环控制 JZ STOP SAL AX,1 ;循环体 JNC L2 INC CLL2: JMP L1STOP:HLT 此方法采用“先判断,后执行”的结构。67 MOV BX,16 ;初始化 MOV CL,0L1: SAL AX,1 ;控制循环 JNC L2 INC CLL2: DEC BX JNZ L1STOP:HLT 此方法采用“先执行,后判断”的结构。683. 循环程序的两种基本模式(1)单重循环:循

47、环体为顺序和分支结构(2)多重循环:循环体为一个新的循环结构多重循环是由单重循环嵌套而成。最常用:双重循环(分为内循环和外循环)设计方法同单重循环,但应注意:双重循环的初始控制条件及程序实现;各层循环之间不能交叉,可以从内循环跳到外循环,不可以从外循环跳进内层循环;防止出现死循环。69【例】存储器数据段从BUF开始存放着一个无符号字数组,数组的第一个字中存放着该数组的长度,编制一个程序使此数组中的数据按照从小到大的顺序排列。分析一:采用冒泡排序算法,即从第一个数据开始,相邻的数进行比较,若次序不对,两数交换位置。第一遍比较(N-1)次后,最大的数已到了数组尾,第二遍仅需比较(N-2)次就够了,

48、共比较(N-1)遍就完成了排序,共有两重循环。DATA SEGMENTBUF DW 7,15,37,8600,A768H,3412H,1256H,76HDATA ENDSSTACK SEGMENT STACK SA DB 100 DUP(?)TOP EQU $STACK ENDS70CODE SEGMENT ASSUME CS:CODE,DS,DATA,SS:STACKMAIN PROC FARSTART:MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV

49、CX,BUFBX ;CX作为内循环计数器 DEC CX71L1:MOV DX,CX ;DX作为外循环计数器L2:ADD BX,2 ;修改地址指针 MOV AX,BUFBX ;取一数 CMP AX,BUFBX+2 ;与下一数比较 JBE CONTI ;若符合前小后大,转移 XCHG AX,BUFBX+2 ;否则两数交换 MOV BUFBX,AXCONTI:LOOP L2 ;内循环控制 MOV CX,DX ;外循环次数CX MOV BX,0 ;地址指针返回 LOOP L1 ;外循环控制 RETMAIN ENDPCODE ENDS END START72分析二:采用改进的冒泡排序法,即用设置标志的方

50、法。设立一个FLAG位作标记,进入外循环时标志为0,在内循环中每进行一次交换,标志置1。内循环结束测试标志,若为1,再一次进入外循环;若为0,表示内循环没有进行数据交换,可以提前结束外循环,不必循环N-1遍,节省了操作时间。73START:MOV DI,OFFSET BUF ;设置地址指针 MOV CX,DI ;设内循环计数器CX DEC CX ;N-1,内循环次数L1: MOV DX,CX ;设外循环计数器DX MOV BH,0 ;BH为FLAGL2: ADD DI,2 MOV AX,DI CMP AX,DI+2 JBE CONTI XCHG AX,DI+2 ;若前大后小,交换,FLAG=1

51、 MOV DI,AX MOV BH,1CONTI:LOOP L2 CMP BH,0 ;FLAG=0,提前结束,跳出外循环 JE STOP74 MOV CX,DX MOV DI,OFFSET BUF LOOP L1STOP: RET思考:如何改为降序?75总结:双重循环需要内、外两个循环计数器方法(1):CX内循环计数器 DX(或其它)外循环计数器 格式: MOV DX,外循环次数 LP1: MOV CX,内循环次数 LP0: LOOP LP0 DEC DX JNZ LP1 76方法(2):内、外循环计数器均用CX,此时应采用堆栈保护外循环计数器格式: MOV CX,外循环次数 LP1: PUS

52、H CX ;保护外循环计数值 MOV CX,内循环次数 LP0: ;内循环体 LOOP LP0 POP CX ;恢复外循环计数值 LOOP LP177四、子程序结构1. 概念子程序:可以多次反复调用的,能完成指定操作功能的特殊程序段。主程序:调用子程序的程序(相对而言)调用子程序(或转子):主程序调用子程序的过程返回主程序(或返主):子程序结束返回主程序接着执行过程调用的指令为CALL,过程返回的指令为RET。CALL指令自动保存返回地址,RET指令自动恢复返回地址,均需通过堆栈完成。782. 子程序的结构形式完整的子程序结构必须包括:(1)子程序说明文件(以注释形式出现) ;子程序名 ;子程

53、序的功能 ;子程序中用到的寄存器和存储单元 ;子程序的入口参数和出口参数 ;子程序中调用其它子程序的名称 ;子程序举例(2)子程序的现场保护和现场恢复在子程序设计时,一般在子程序一开始就保护子程序将要占用的寄存器的内容(用一组PUSH指令),子程序执行RET之前再恢复被保护寄存器的内容(用一组POP指令) 。79保护现场和恢复现场的工作既可在主程序中完成,也可在子程序中完成。注意:保护和恢复现场需遵循堆栈操作先进后出的特点。(3)子程序的调用与返回由设在主程序的CALL指令和设在子程序结尾的RET指令联合实现。3. 子程序的设计方法(1)子程序的定义 过程名 PROC NEAR或FAR RET

54、 过程名 ENDP80注: 主、子程序在同一代码段中,则定义为NEAR型(或缺省)主、子程序不在同一代码段中,则定义为FAR型;一般可将主程序定义为FAR属性(主过程作为DOS调用的一个远端子过程)(2)子程序的参数传递方法主、子程序间的参数传递:主程序传递输入参数及子程序传递输出参数的过程。三种方法:用寄存器传递参数:适合于参数较少的情况,传递速度较快;用存储器传递参数:适合于参数较多的情况,需要事先在存储器中建立一个存储区,主、子程序均能访问,通常采用寄存器存放该存储区首地址的方法;用堆栈传递参数:适合于参数较多的情况,注意堆栈中返回地址的保存与恢复。81【例】有一个子程序说明如下: ;名

55、称:BCD2BIN ;功能:将一个字节的BCD码转换成二进制数 ;所用寄存器:CX ;入口参数:AL存放两位BCD码 ;出口参数:AL存放二进制数 ;调用其它子程序:无 ;子程序举例:执行前AL=36H,执行后AL=24H子程序编制如下:82BCD2BIN PROC NEAR(或FAR) PUSH CX ;保护现场 MOV CH,AL AND CH,0FH ;存低4位 MOV CL,4 SHR AL,CL ;高4位右移4位 MOV CL,10 ;然后乘10 MUL CL ADD AL,CH ;高4位乘10+低4位 POP CX ;恢复现场 RETBCD2BIN ENDP注:本例是通过寄存器来传

56、递参数的。83【例】数据段定义两个数组,编程实现对两个数组分别求和(不计溢出)。DATA SEGMENTARY1 DW 100 DUP(?) ;定义数组1SUM1 DW ?ARY2 DW 100 DUP(?) ;定义数组2SUM2 DW ?DATA ENDSSTACK SEGMENT STACK SA DW 50 DUP(?) TOP EQU SIZE SASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK84MAIN PROC FARSTART: MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DAT

57、A MOV DS,AX LEA SI,ARY1 ;数组1首地址,入口参数 MOV CX,LENGTH ARY1 ;数组1长度,入口参数 CALL SUM ;调用求和子程序 LEA SI,ARY2 ;数组2首地址,入口参数 MOV CX,LENGTH ARY2 ;数组2长度,入口参数 CALL SUM ;调用求和子程序 MOV AH,4CH ;返回DOS INT 21HMAIN ENDP85SUM PROC NEAR ;子程序 XOR AX,AX ;AX清0L1: ADD AX,WORD PTRSI ;加数组元素 INC SI INC SI LOOP L1 MOV WORD PTRSI,AX ;

58、数组和送入SUM RET ;子程序返回SUM ENDPCODE ENDS END START注:本例是通过存储器来传递参数的。86【例】通过堆栈传递参数,实现十进制数数组求和,要求主程序和过程不在同一个代码段中,要进行段间调用。MDATA SEGMENTARY1 DB 20 DUP(?) ;定义数组1SUM1 DW ?ARY2 DB 100 DUP(?) ;定义数组2SUM2 DW ?MDATA ENDSMSTACK SEGMENT STACK DW 100 DUP(?) TOP EQU $MSTACK ENDSMCODE SEGMENT ;主代码段 ASSUME CS:MCODE,DS:MD

59、ATA,SS:MSTACK87MAIN PROC FARSTART:MOV AX,MSTACK ;初始化SS,SP MOV SS,AX MOV SP,TOP PUSH DS ;设置返回堆栈 MOV AX,0 PUSH AX MOV AX,MDATA ;初始化DS MOV DS,AX MOV AX,OFFSET ARY1 ;PADD过程入口参数进栈 PUSH AX MOV AX,SIZE ARY1 PUSH AX CALL FAR PTR PADD 88 MOV AX,OFFSET ARY2 PUSH AX MOV AX,SIZE ARY2 PUSH AX CALL FAR PTR PADD R

60、ETMAIN ENDPMCODE ENDSPCODE SEGMENT ;过程代码段 ASSUME CS:PCODE,DS:MDATA,SS:MSTACKPADD PROC FAR PUSH BX ;寄存器保护 PUSH CX PUSH BP MOV BP,SP89 PUSHF MOV CX,BP+10 ;数组长度CX MOV BX,BP+12 ;数组首地址BX MOV AX,0NEXT: ADD AL,BX ;加数组中一元素 DAA MOV DL,AL MOV AL,0 ADC AL,AH DAA MOV AH,AL MOV AL,DL INC BX LOOP NEXT MOV BX,AX ;

温馨提示

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

最新文档

评论

0/150

提交评论