1、第第5 5章章 汇编语言层汇编语言层本章主要内容:本章主要内容:8080 x86x86宏汇编语言的语句格式宏汇编语言的语句格式8080 x86x86宏汇编语言的语法规则宏汇编语言的语法规则基本程序结构及程序设计方法基本程序结构及程序设计方法汇编语言程序的开发方法汇编语言程序的开发方法5.1 5.1 概概 述述1.1.汇编语言汇编语言一种一种面向机器面向机器的的低级低级程序设计语言;程序设计语言;符号化符号化的机器语言,汇编指令与机器指令一的机器语言,汇编指令与机器指令一一对应。一对应。2.2.汇编语言源程序汇编语言源程序用汇编语言编制的程序用汇编语言编制的程序;不能由计算机直接;不能由计算机直
2、接执行。执行。3.3.汇编程序汇编程序应用应用汇编程序汇编程序将将汇编语言源程序汇编语言源程序翻译成翻译成目标目标代码代码(即机器语言程序)。(即机器语言程序)。4.4.汇编语言的特点汇编语言的特点高性能高性能对对计算机的完全控制计算机的完全控制有助于更好地使用高级语言编程有助于更好地使用高级语言编程有助于了解计算机的结构有助于了解计算机的结构5.2 5.2 汇编语言语句格式汇编语言语句格式 汇编语言源程序的汇编语言源程序的基本组成单位基本组成单位是是语句。语句。(2)伪指令语句)伪指令语句 (1)指令语句(可执行语句)指令语句(可执行语句)1.语句的种类语句的种类表示计算机的某种具体操作,汇
3、编时产生指令代码表示计算机的某种具体操作,汇编时产生指令代码(即目标代码),在程序(即目标代码),在程序运行运行时实现。时实现。指示汇编程序如何对源程序进行汇编,其功能在指示汇编程序如何对源程序进行汇编,其功能在汇编汇编时完成。除了所定义的数据项之外,其它项时完成。除了所定义的数据项之外,其它项不产生目不产生目标代码标代码。(3)宏指令语句)宏指令语句在在5.5中介绍中介绍 2.语句格式语句格式标号标号指令助记指令助记符符操作数操作数注释注释:;,(1)指令语句格式指令语句格式(2)伪)伪指令语句格式指令语句格式符号名符号名伪指令符伪指令符操作数操作数注释注释;,3.标识符标识符标号标号和和符
4、号名符号名统称为标识符,由若干字符构成,规统称为标识符,由若干字符构成,规则如下:则如下:字符个数字符个数 1 31;第一个字符必须是字母或第一个字符必须是字母或3个特殊字符之一个特殊字符之一 (?(?下划线下划线 _ ););从第二个字符开始,可以是字母从第二个字符开始,可以是字母、数字和、数字和 特殊字符;特殊字符;不能与系统专用保留字相同。不能与系统专用保留字相同。5.3 805.3 80 x86x86宏汇编语言数据、表达宏汇编语言数据、表达式和运算符式和运算符5.3.1 常数常数纯数值数据、无属性、值不能改变纯数值数据、无属性、值不能改变1.数值常数数值常数 可用二进制、八进制、十进制
5、、十六进制数表示可用二进制、八进制、十进制、十六进制数表示如如1100101011001010B B、73Q73Q、345D345D、4aEH4aEH、0AH0AH2.字符常数字符常数 单引号或双引号扩起来的一个或多个字符,以单引号或双引号扩起来的一个或多个字符,以ASCII码码存储。存储。如如AA的的ASCIIASCII码为码为4141H H5.3.2 变量变量变量应先变量应先定义定义并并预置预置初值,才能被引用。初值,才能被引用。1、变量定义、变量定义数据定义伪指令数据定义伪指令实现变量的定义,格式如下:实现变量的定义,格式如下:变量名变量名 数据定义伪指令数据定义伪指令 1,可选DB 定
6、义字节DW 定义字DD 定义双字DQ 定义8字节DT 定义10字节例:例:DATA1 DB 10H变量的变量的3个属性个属性(1)段属性()段属性(SEG)表示变量存放在哪个逻辑段中,用变量所在段的段基值表示。(2)偏移地址属性()偏移地址属性(OFFSET)表示变量在逻辑段中离段起始单元的距离,用字节数表示。(3)类型属性()类型属性(TYPE)表示单个变量占存储单元的字节数。上述两个属性构成了变量的逻辑地址。逻辑地址。DATA SEGMENTDA1 DB 12HDA2 DW 1234HDA3 DD 12345678HDATA ENDS变量的初值变量的初值 数值表达式数值表达式字字双双字字:
7、10H 20H 30H 34H 12H 78H 56H 34H 12H :VA1VA2VA3存储器分配图存储器分配图00000HFFFFFH例:DATA SEGMENTVA1 DB 10H DB 20H,30HVA2 DW 1234HVA3 DD 12345678H DATA ENDS 字符串表达式字符串表达式 STRING1 DB STRING STRING2 DW ST,RI,NG STRING3 DD ST,RI,NG 例:存放字符的存放字符的ASCII码码“?”表达式表达式只分配存储单元,不指定初值只分配存储单元,不指定初值。例:例:DB?,?,?带带DUP表达式表达式变量名变量名 D
8、UP()VA1 DW 20H DUP(4)例:重复次数重复次数重复数据的内容重复数据的内容为连续存储单元重复预置一组数据,格式如下:为连续存储单元重复预置一组数据,格式如下::04H 00H 04H :00H:存储器分配图存储器分配图VA1共共40H字节字节:33338:33338:DA2内层内层DUP操作重操作重复复4次,共次,共4字节字节外层外层DUP操作操作重复重复10H次,次,共共50H字节字节存储器分配图存储器分配图DUPDUP操作符的嵌套使用操作符的嵌套使用DA2 DB 10H DUP(4 DUP(3),8)引用变量名引用变量名2、变量的使用、变量的使用(1)在)在指令语句指令语句
9、中引用变量名中引用变量名变量名作为变量名作为地址表达式的组成部分地址表达式的组成部分之一之一。那么几种含有变量名的地址表达式如下:直接寻址:VAR、VAR+08H变址寻址:VAR SI、VAR+5 DI基址寻址:VAR BX、VAR+10H BP基址变址寻址:VAR BXDI、VAR+06H BPSI例如,设在某数据段中有如下的变量定义:VAR DB 40H DUP(?)(2)在在数据定义语句数据定义语句中引用变量名中引用变量名DW:引用变量名的偏移地址在DW或DD数据定义语句的操作数字段上引用了变量名,那么在为DW或DD伪指令分配的存储单元中,将预置被引用变量名的地址部分(段基值和偏移地址)
10、。DD:引用变量的段基值和偏移地址例如:NUM1 DB 10H DUP(?)NUM2 DW 10H DUP(?)ARRAY DB 10H DUP(ABCD)ADR1 DW ARRAY ADR2 DD ARRAY5.3.3 标号标号指令的指令的符号地址符号地址,可作为转移类指令的可作为转移类指令的目标地址目标地址。LOP:INC SI JNZ LOP 例如,有程序段如下:例如,有程序段如下:1.标号的属性标号的属性(1)段属性()段属性(SEG)表示指令在哪个逻辑段中表示指令在哪个逻辑段中(2)偏移地址属性()偏移地址属性(OFFSET)表示这条指令目标代码的首字节离段起始单元之间的表示这条指令
11、目标代码的首字节离段起始单元之间的字节数。字节数。(3)类型属性()类型属性(TYPE)表示指令的转移特性。表示指令的转移特性。上述两个属性构成了指令的逻辑地址。NEAR(近)段内转移FAR(远)段间转移2.标号类型的设置标号类型的设置(1)隐含方式)隐含方式直接指定指令的标号例如:例如:NEXT:MOV AX,3000HNEXT:MOV AX,3000H(2)用)用LABEL伪指令伪指令设置标号类型设置标号类型名字名字 LABEL 类型类型格式如下:格式如下:标号标号 NEAR/FAR变量名变量名 BYTE/WORD/DWORD LABELLABEL语句与指令语句配合使用语句与指令语句配合使
12、用例:SUB1_FAR LABEL FAR SUB1:MOV AX,1234HMOV语句有两个具有相同段和偏移地址属性的标号:语句有两个具有相同段和偏移地址属性的标号:SUB1_FAR和和SUB1,但类型属性不同。但类型属性不同。LABELLABEL语句与数据定义语句配合使用语句与数据定义语句配合使用例:DATA_BYTE LABEL BYTE DATA_WORD DW 20H DUP(567H)DATA_WORD和和DATA_BYTE 具有相同的段和具有相同的段和偏移地址属性,但类型属性不同偏移地址属性,但类型属性不同。有语句如下:MOV AX,DATA_WORD+4MOV AL,DATA_
13、BYTE+4传送第传送第3 3个字个字(5 5、6 6字节)字节)传送第传送第5 5个字节个字节表达式表达式 常用作指令语句或伪指令语句的常用作指令语句或伪指令语句的操作数操作数;由常数、变量、标号通过运算符连接而成;由常数、变量、标号通过运算符连接而成;有有数值表达式数值表达式和和地址表达式地址表达式;汇编时汇编时,经计算得到一个,经计算得到一个数值数值或或地址地址。5.3.4 表达式与运算符表达式与运算符运算符运算符算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符数值返回运算符数值返回运算符属性运算符属性运算符包括:包括:+(加)、(加)、(减)、(乘)、/(除)、MOD(模除
14、)、SHL(左移)、SHR(右移)1 1、+、-、*、/运算的操作数和运算结果都是整数;运算的操作数和运算结果都是整数;除法除法运算取商的整数,运算取商的整数,MOD运算取除法的余数;运算取除法的余数;减法减法运算可用于同一段内的两个变量;运算可用于同一段内的两个变量;例:NUM=15*5NUM=NUM/8NUM=NUM MOD 5NUM=NUM+4NUM=NUM SHR 2 AND、OR、XOR、NOT 2 2、只用于数值表达式;按位进行逻辑操作;在汇编过程中完成运算;通常出现在源操作数中。MOV AL,NOT 0F0HMOV BL,55H OR 0F0HAND BH,55H AND 0F0
15、HXOR CX,55H XOR 50H例:3 3、关系、关系 EQ(相等)、NE(不等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)DA1 DB 3 LT 8DA2 DB 10 NE 0AHMOV AL,10 EQ 0AHMOV BX,DA2 GE DA1格式:比较两表达式的值,两表达式的性质相同;数值按无符号数比较,地址表达式比较偏移量;关系成立,结果为全1;关系不成立,结果为0。例:4 4、数值返回SEG、OFFSET、TYPE、SIZE、LENGTH格式:存储器操作数(1)SEG运算符返回段基值返回段基值变量名变量名标号标号(2)OFFSET运算符返回偏移地址返回偏移
16、地址(3)TYPE运算符 返回类型属性对应的数值返回类型属性对应的数值类型属性运算结果变量BYTE1WORD2DWORD4标号NEAR-1FAR-2(4)LENGTH运算符若变量用若变量用DUPDUP定义,返回定义,返回外层外层DUPDUP的重复次数;的重复次数;若变量没用若变量没用DUPDUP定义,则定义,则返回结果总是返回结果总是1 1。只用于变量只用于变量(5)SIZE运算符只用于变量只用于变量是是TYPETYPE和和LENGTHLENGTH两个运算结果的两个运算结果的乘积乘积。ORG 20H VAR1 DB 10,15,20 VAR2 DW 0FFFFH,100H VAR3 DW 10
17、H DUP(1,2 DUP(4)例:MOV AX,SEG VAR1MOV SI,OFFSET VAR2MOV BL,TYPE VAR2MOV CL,LENGTH VAR3MOV CH,SIZE VAR3为已分配的存储单元为已分配的存储单元临时设定类型属性临时设定类型属性5、属性修改格式:类型 PTR 例:DA_BYTE DB 20H DUP(0)DA_WORD DW 30H DUP(0)MOV WORD PTR DA_BYTE 10,AX MOV BYTE PTR DA_WORD DI,BL INC BYTE PTR SI SUB WORD PTR BX,30H JMP FAR PTR SUB
18、1例:例:DA3 DB 82H,76H,56H,0ADH,7FH MOV CX,WORD PTR DA3 AND CX,0FH MOV AL,DA3+3 SHL AL,CL上述程序段运行后,上述程序段运行后,AL中的内容是什么?中的内容是什么?(AL)=0B4H例:例:ORG 0202H DW1 DW 20H,30H MOV AL,BYTE PTR DW1+1 MOV AH,BYTE PTR DW1 MOV BX,OFFSET DW1 MOV CL,BYTE PTR DW1+2 MOV CH,TYPE DW1上述指令序列执行后,上述指令序列执行后,AX、BX、CX寄存器的内容寄存器的内容分别是
19、什么?分别是什么?(AX)=2000H (BX)=0202H (CX)=0230H6 6、规则规则:先高优先级,后低优先级先高优先级,后低优先级;若有多个若有多个同优先级同优先级的运算符,则的运算符,则从左到右从左到右;圆括号圆括号可改变运算顺序。可改变运算顺序。例:NUM1 DB (12 OR 6 AND 2)GE 0EH NUM2 DB (12 XOR 6 AND 2)LE 0EH上述两条语句汇编后,NUM1和NUM2两字节存储单元中的内容分别是什么?NUM1:0FFHNUM2:0FFH5.4 805.4 80 x86x86宏汇编语言伪指令宏汇编语言伪指令5.4.1 符号定义语句符号定义语
20、句格式:格式:符号符号 EQU 功能功能:将表达式的值赋给符号将表达式的值赋给符号1 1、等值语句、等值语句EQUEQU常数常数/数值表达式数值表达式地址表达式地址表达式变量变量/标号标号/指令助记符指令助记符例:COUNT EQU 5ADR1 EQU DS:BP+14L1 EQU SUBSTART EQU伪指令伪指令不分配存储单元;不分配存储单元;在同一源程序中,在同一源程序中,同一符号不能同一符号不能用用EQU伪指令伪指令重新定义;重新定义;例:DA1 EQU BYTE PTR DA2 DA2 DW 0ABCDH SHL DA1,1 SHR DA2,1上述两条指令执行后,DA2字存储单元中
21、的内容是什么?2 2、等号语句、等号语句 =格式:格式:符号符号=表达式表达式功能功能与与EQU语句相同;语句相同;区别区别在于等号语句在于等号语句可重新定义符号可重新定义符号。例:NUM=15*5NUM=NUM/8NUM=NUM MOD 5NUM=NUM+4NUM=NUM SHR 25.4.3 段结构伪指令段结构伪指令1 1、段定义伪指令、段定义伪指令SEGMENT/ENDSSEGMENT/ENDS段名 SEGMENT 定位类型 组合类型 使用类型 类别名段名 ENDS格式:格式:功能:功能:指定逻辑段的名字和范围、段的起始边界、指定逻辑段的名字和范围、段的起始边界、段与段之间的连接关系等。
22、段与段之间的连接关系等。(1)段名)段名必选,开始与结尾的段名一致必选,开始与结尾的段名一致(2)定位类型)定位类型可选,指定装入时的起始边界要求可选,指定装入时的起始边界要求4种:种:PAGE(页)、页)、PARA(节)、节)、WORD(字)、字)、BYTE(字节)字节)默认默认(3)组合类型)组合类型可选,指定段与段之间的连接方式可选,指定段与段之间的连接方式6种种:NONE(隐含)、隐含)、PUBLIC、COMMON、STACK、MEMORY、AT(4)使用类型)使用类型可选,指定可选,指定386386以上以上CPUCPU的段模式的段模式(5)类别名)类别名可选,单引号括起来可选,单引号
23、括起来2 2、段寻址伪指令、段寻址伪指令 ASSUMEASSUME格式:格式:ASSUME sr1:seg1,sr2:seg2,功能:功能:建立段名与段寄存器之间的联系建立段名与段寄存器之间的联系段寄存器名段寄存器名段名段名DS_DATA SEGMENTVAR1 DB 12HDS_DATA ENDSES_DATA SEGMENTVAR2 DB 34HES_DATA ENDSCODE SEGMENTVAR3 DB 56H ASSUME CS:CODE,DS:DS_DATA,ES:ES_DATASTART:INC VAR1INC VAR2INC VAR3CODEENDSEND START例:例:3
24、 3、段寄存器的装载、段寄存器的装载(1)DS 和和 ES 的装载的装载用数据传送指令用数据传送指令例:例:MOV AX,DATA_DS ;设置设置DSMOV DS,AXMOV AX,DATA_ES;设置;设置ESMOV ES,AX (2)SS 的装载的装载自动装载自动装载:定义堆栈段时,定义堆栈段时,组合类型置为组合类型置为STACK。STACK1SEGMENT PARA STACK DW 40H DUP(0)STACK1ENDS用执行指令的方法装载用执行指令的方法装载:与:与DS/ESDS/ES的装载方法类似的装载方法类似。(3)CS 的装载的装载使用使用结束伪指令结束伪指令ENDEND,
25、格式如下格式如下:END END 执行执行转移类指令转移类指令时,时,CPUCPU自动修改自动修改CSCS和和IPIP。例:STACK2 SEGMENT DW 30H DUP(0)TOP LABAL WORD STACK2 ENDS CODE SEGMENT MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET TOP ;设置SP 5.4.6 定位和对准伪指令定位和对准伪指令1 1、位置计数器(、位置计数器($)2 2、定位伪指令、定位伪指令(ORG)ORG)记录正在汇编的数据或指令的目标代码在当前段内记录正在汇编的数据或指令的目标代码在当前段内的的偏移地址。偏移地址。$
26、:$:表示表示位置位置计数器的计数器的当前值当前值。设置位置计数器设置位置计数器格式:格式:ORG ORG 例:例:DATA SEGMENT ORG 30H DB1 DB 12H,34H ORG$+20H STRING DB STRING DATA ENDS例:ORG 34H DA1 DW 10H,$+20H,30H,$+40H上述语句汇编后,数据项$+20H 和$+40H 中的$值分别是多少?3 3、对准伪指令、对准伪指令(EVEN)EVEN)功能:功能:将位置计数器的值调整为偶数。将位置计数器的值调整为偶数。格式格式:EVENEVEN5.4.7 过程定义伪指令过程定义伪指令 PROC/EN
27、DP过程名 PROC NEAR/FAR RET 过程名 ENDP指令序列指令序列过程定义在过程定义在逻辑段内;逻辑段内;过程名是必须的;过程名是必须的;至少有一条至少有一条返回指令返回指令RET。格式:格式:3个属性:个属性:段段、偏移地址偏移地址、类型类型属性;属性;5.4.8 包含伪指令包含伪指令 INCLUDE格式:格式:INCLUDE INCLUDE 功能:功能:将指定文件插入到正在汇编的源程序中。将指定文件插入到正在汇编的源程序中。5.4.9 标题伪指令标题伪指令 TITLE格式:格式:TITLE TITLE 功能:功能:为程序指定标题。为程序指定标题。不超过不超过80个字符;个字符
28、;指定的标题在指定的标题在列表文件中每一页的第一行列表文件中每一页的第一行显示。显示。在在源程序开始处源程序开始处使用;使用;5.5 5.5 宏指令宏指令1 1、宏指令的使用过程、宏指令的使用过程3步:宏定义、宏调用和宏展开步:宏定义、宏调用和宏展开(1)宏定义宏名 MACRO 形参1,形参2,ENDM宏体宏体例:定义宏,交换两个存储单元的数据例:定义宏,交换两个存储单元的数据XCHAGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDMMULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,
29、AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM功能:对AX中的数据乘以10(2)宏调用宏宏名名 实参实参1,实参,实参2,(3)宏展开宏汇编程序扫描宏指令语句(宏调用)时,用宏体的目标代码插入宏调用处;对带参数的宏,用实参代替形参,并对宏体中出现参数的地方作适当修改。例,可对前面定义的宏调用如下:XCHAGE SI,DI,AXMULTAX10例:MOV AX,SI XCHG AX,DI MOV SI,AX(2)表达式操作符%格式:格式:%表达式表达式功能:功能:告诉宏汇编程序获取表达式的值,而不是表达告诉宏汇编程序获取表达式的值,而不是表达式本身。式本身。
30、例:SHIFT_VAR MACRO R_M,DRECT,COUNT MOV CL,COUNT S&DRECT R_M,CL ENDM宏调用:SHIFT_VAR AX,HL,22 2、宏操作符、宏操作符(1)连接操作符&功能:功能:在宏定义的宏体内连接形参。在宏定义的宏体内连接形参。例:SHIF0 MACRO CNT MOV CL,CNT ENDM SHIF1 MACRO REG,DIRECT,NUM COUNT=NUM SHIF0%COUNT S&DIRECT REG,CL ENDM SHIF1 AX,HL,2 MOV CL,2 SHL AX,CL (4)字符操作符!格式:格式:!字符!字符“
31、!”后的字符后的字符不作操作符不作操作符使用使用,而是而是字符本字符本身。身。例:PROMPT MACRO NUM,TEXT PROMPT&NUM DB&TEXT&ENDM PROMPT 23,255 PROMPT23 DB Expression 255(3)文本操作符功能:功能:将包含分隔符的实参扩起来,作为一个单将包含分隔符的实参扩起来,作为一个单一的实参。一的实参。例:例:XCHAGE ,DI,AL只能用于宏定义中,只能用于宏定义中,宏体第一条宏体第一条语句;语句;汇编时,符号展开为汇编时,符号展开为?XXXXXXXX 的形式。的形式。3 3、LOCALLOCAL为指令为指令格式:格式:
32、LOCAL LOCAL 例:例:MULTIP MACRO MULT1,MULT2,MULT3 LOCAL LOP,EXIT0 MOV DX,MULT1 MOV CX,MULT2 XOR BX,BX XOR AX,AX JCXZ EXIT0 LOP:ADD BX,DX ADC AX,0 LOOP LOP EXIT0:MOV MULT3,BX MOV MULT3+2,AX ENDM 4 4、宏库、宏库多个宏定义以多个宏定义以文件形式文件形式组织成宏库。组织成宏库。使用时用使用时用INCLUDE伪指令。伪指令。5.6 5.6 汇编语言程序设计基本技术汇编语言程序设计基本技术5.6.1 程序设计步骤程
33、序设计步骤分析问题,建立数学模型;分析问题,建立数学模型;确定算法;确定算法;编制程序流程图;编制程序流程图;编制程序;编制程序;调试程序。调试程序。5.6.2 顺序程序设计顺序程序设计按编写指令的顺序执行,且每条指令只执行一次。指令1指令2指令n-1指令n 顺序程序结构图例:试编制程序,计算下列公式的值,并将结果存放例:试编制程序,计算下列公式的值,并将结果存放 在在FUN存储单元中。存储单元中。F 其中X,Y,Z的值分别存放在VARX、VARY、VARZ三个字存储单元中,且计算过程的中间值和最后结果仍在16位二进制数的范围内。编制源程序如下:2)1(3)(10ZYXTITLE EXAMPL
34、E PROGRAM DATA SEGMENT ;设置数据段 VARX DW 123H;变量X VARY DW 456H;变量Y VARZDW 789H;变量Z FUNDW?;结果单元 DATA ENDS STACK1 SEGMENT PARA STACK;设置堆栈段 DW 20H DUP(0)STACK1 ENDSCODESEGMENT;设置代码段ASSUME CS:CODE,DS:DATA,SS:STACK1START:MOV AX,DATA;置段基值于DSMOV DS,AXMOV AX,VARX;取变量XADD AX,VARY;AX(X+Y)MOV BX,AX;BX(X+Y)SAL AX,
35、1;AX2*(X+Y)SAL AX,1;AX 4*(X+Y)ADD AX,BX;AX 5*(X+Y)SAL AX,1;AX 10*(X+Y)MOV BX,VARZ;取变量ZDEC BX;BX(Z1)MOV CX,BX;CX(Z1)SAL BX,1;BX 2*(Z1)ADD BX,CX;BX 3*(Z1)SUB AX,BX;AX 10*(X+Y)3*(Z1)SAR AX,1;AX 10*(X+Y)3*(Z1)/2MOV FUN,AX;存放计算结果MOV AH,4CH;终止用户程序,返回DOSINT 21HCODEENDSEND START例:用查表方法将一位十六进制数(例:用查表方法将一位十六进
36、制数(09,AF)转换成它对应的转换成它对应的ASCII码。码。首先在数据段建立一个表TABLE,按照十六进制数从小到 大(即从09到AF)的顺序,在表中存入它们对应的ASCII码值(十六进制数用大写英文字母AF)。为查出某个数的ASCII码,需计算它在内存中的地址。用简化段定义伪指令,编制源序如下:.MODEL SMALL;设置内存模式.DATA;设置数据段TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 4ASCI DB?.STACK 100H;设置堆栈段.CODE;设置代码段
37、START:MOVAX,DATADATAMOVDS,AXLEABX,TABLE;取表首址XORAH,AH ;AH清零MOVAL,HEX ;取一位十六进制数ADDBX,AX;确定查表位置MOVAL,BX ;查表MOVASCI,AL ;存结果MOVAH,4CH;终止程序,返回DOSINT21HENDSTART5.6.3 分支程序设计分支程序设计1 1、转移指令、转移指令无条件转移指令无条件转移指令条件转移指令条件转移指令直接寻址直接寻址间接寻址间接寻址段内转移段内转移段间转移段间转移简单条件转移指令简单条件转移指令无符号数条件转移指令无符号数条件转移指令带符号数条件转移指令带符号数条件转移指令段内
38、转移段内转移段间转移段间转移(1)无条件转移指令格式:格式:JMP JMP 目标地址目标地址目标地址有两种表达方式目标地址有两种表达方式a.直接寻址:目标地址通常是标号目标地址通常是标号段内转移段内转移:相对转移,指令给出位移量相对转移,指令给出位移量DISPDISP;执行操作:执行操作:IP (IP)+DISP(IP)+DISP段间转移段间转移:执行操作:执行操作:IP 偏移地址偏移地址 CS CS 段基值段基值例如:例如:JMP NEXTJMP NEXT;NEXT为为标号标号JMP指令的下一指令指令的下一指令与目标地址所指的指与目标地址所指的指令之间的字节距离令之间的字节距离b.间接寻址:
39、目标地址通常由寄存器或存储单元提供目标地址通常由寄存器或存储单元提供段内转移段内转移:寄存器或存储单元提供偏移地址寄存器或存储单元提供偏移地址执行操作:执行操作:IP 偏移地址偏移地址段间转移段间转移:执行操作:执行操作:IP 偏移地址偏移地址 CS CS 段基值段基值(2)条件转移指令格式:格式:Jxx Jxx 目标地址目标地址只能在段内转移,而且是相对转移。只能在段内转移,而且是相对转移。xxxx为转移条件为转移条件例:JMP CX;JMP WORD PTR BXa.简简单条件转移指令单条件转移指令指令 转移条件 含义JC CF=1 有进位/借位转移JNC CF=0 无进位/借位转移JE/
40、JZ ZF=1 相等/等于0 转移JNE/JNZ ZF=0 不相等/不等于0转移JS SF=1 是负数转移JNS SF=0 是正数转移JO OF=1 有溢出转移JNO OF=0 无溢出转移JP/JPE PF=1 有偶数个“1”转移JNP/JPO PF=0 有奇数个“1”转移例:DA5 DB 2,3,7,0AH,0FH,4,5,9,8,0CH XOR AX,AX XOR CL,CL XOR BX,BXLOP:TEST DA5BX,01H JE NEXT ADD AL,DA5BX INC AHNEXT:INC BX INC CL CMP CL,10 JNE LOP上述程序段运行后,AH和AL中的内
41、容分别是什么?(AH)=5 (AL)=27Hb.无符号数条件转移指令无符号数条件转移指令 指 令 转 移 条 件 含 义 JA/JNBE CF=0 AND ZF=0 AB转移JAE/JNB CF=0 OR ZF=1 AB转移JB/JNAE CF=1 AND ZF=0 A B转移JGE/JNL SF=OF OR ZF=1 AB转移JL/JNGE SFOF AND ZF=0 A B转移JLE/JNG SFOF OR ZF=1 AB转移例:下面程序段是判断寄存器AH和AL中第3位是否相同,如果相同,AH置0;否则AH置非0。试把空白处填上适当的指令(一个空白只填写一条指令)。AND AH,08H M
42、OV AH,0FFH JMP NEXTZERO:MOV AH,0NEXT:(1)(2)(1)XOR AH,AL (2)JE ZERO2 2、分支程序设计、分支程序设计(1)比较)比较/测试测试分支结构分支结构比较/测试分支结构程序流程例例1 1:编程序段,把:编程序段,把DA1DA1字节数据变为偶数。字节数据变为偶数。分析:若二进制数最低位为分析:若二进制数最低位为0 0,则为偶数。,则为偶数。程序段流程程序段如下:程序段如下:TESTTEST DA1,01H DA1,01H JE NEXTJE NEXT INC DA1 INC DA1 NEXT:NEXT:例例2 2:设数据段中:设数据段中N
43、UM1,NUM2NUM1,NUM2两字节单元中有无符号整数,两字节单元中有无符号整数,编程完成下面的操作:编程完成下面的操作:两个数均是偶数,两个数加1后分别送入DA1、DA2字节单元中;如两个数均是奇数,两个数分别直接送入DA1、DA2字节单元中;如一个是奇数,一个是偶数,则奇数直接送DA1字节单元,偶数直接送DA2字节单元。分析:依次测试分析:依次测试NUM1NUM1和和NUM2NUM2的奇偶性的奇偶性,有有4 4种情况。种情况。NUM1NUM1奇奇偶偶NUM2NUM2偶偶DA1DA1NUM1,NUM1,DA2DA2NUM2NUM2DA1DA1NUM1,NUM1,DA2DA2NUM2NUM
44、2DA1DA1NUM2,NUM2,DA2DA2NUM1NUM1DA1DA1NUM1+1,NUM1+1,DA2DA2NUM2+1NUM2+1奇奇偶偶奇奇根据分析,画出流程图如下:根据分析,画出流程图如下:程序段如下:程序段如下:MOV AL,NUM1MOV AL,NUM1MOV AH,NUM2MOV AH,NUM2TEST AL,01HTEST AL,01HJNE JNE END0END0TEST AH,01HTEST AH,01HJNE JNE L1L1 INC AL INC ALINC AHINC AH JMP END0JMP END0L1L1:XCHG AL,AHXCHG AL,AHEND
45、0END0:MOV DA1,AL:MOV DA1,ALMOV DA2,AHMOV DA2,AHL1L1END0END0(2)用跳转表形成多路分支结构假设某程序根据不同情况在5个计算公式中选择1个。可编制5个程序段,分别完成1个公式的运算。在程序中构造跳转表,有两种情况。例:由分支的入口地址构成跳转例:由分支的入口地址构成跳转表。表。跳转表在跳转表在数据段数据段,表中每一项都是,表中每一项都是一个一个分支的偏移地址分支的偏移地址。为转移到第为转移到第N N个公式,需先找到个公式,需先找到该分支的该分支的入口地址入口地址。入口地址。入口地址在跳转表中的偏移量为在跳转表中的偏移量为2 2*(N-1)
46、N-1)。数据段如下:数据段如下:DATASEGMENTJUMP_TABLEDW SUB1,SUB2,SUB3,SUB4,SUB5PARAMDB 3DATAENDS实现多路分支的程序段如下:实现多路分支的程序段如下:XORAX,AXMOVAL,PARAM ;取参数DECAL ;计算2*(PARAM-1)SHLAL,1MOVBX,OFFSET JUMP_TABLEADDBX,AXMOVAX,BX ;取转移的入口地址JMPAX ;间接转移到分支入口例:由转移指令构成跳转表的多路分支程序设计。例:由转移指令构成跳转表的多路分支程序设计。跳转表在跳转表在代码段代码段,表中每一项都是,表中每一项都是JM
47、PJMP指令代码指令代码。为转移到第为转移到第N N个公式,需先转移到跳转表中对应的个公式,需先转移到跳转表中对应的JMPJMP指令指令(在表中的偏移量为(在表中的偏移量为3 3*(N-1)N-1),再通过这里的再通过这里的JMPJMP指令转移指令转移到对应的计算公式。到对应的计算公式。实现多路分支的程序段如下:实现多路分支的程序段如下:XOR BX,BXXOR BX,BX MOV BL,PARAM ;MOV BL,PARAM ;取参数取参数 DEC BLDEC BL;参数减参数减1 1 MOV AL,BL MOV AL,BL;再乘再乘3 3 SHL BL,1 SHL BL,1 ADD BL,
48、AL ADD BL,AL ADD BX,OFFSET JUMP_TABLE ADD BX,OFFSET JUMP_TABLE JMP BXJMP BX ;转至跳转表转至跳转表JUMP_TABLEJUMP_TABLE:JMP SUB1JMP SUB1;转至分支转至分支5.6.4 循环程序设计循环程序设计1 1、循环控制指令、循环控制指令(1)LOOP指令属于程序转移类指令属于程序转移类指令格式:格式:LOOP LOOP 目标地址目标地址例:例:编制程序,产生编制程序,产生n n个数据的裴波纳契数列。个数据的裴波纳契数列。裴波纳契数列中,裴波纳契数列中,a a1 1=0,a=0,a2 2=1,=1
49、,从第从第3 3个数开始,个数开始,a an=n=a an-1n-1+a+an-2n-2 。数据段中数据定义如下:数据段中数据定义如下:FIBONA DW 100 DUP(0);FIBONA DW 100 DUP(0);存放数列存放数列NUM DB 20H NUM DB 20H ;数据个数数据个数功能:功能:循环计数循环计数(CXCX减减1)1)后,判断循环是否结束:后,判断循环是否结束:若若(CXCX)0 0,则继续循环,否则顺序执则继续循环,否则顺序执行。行。产生数列的程序段如下:产生数列的程序段如下:XOR CX,CXMOV CL,NUMLEA DI,FIBONAMOV AX,0MOV
50、BX,1LOP:MOV DI,AXXCHG AX,BXADD AX,BXADD DI,TYPE FIBONALOOP LOP 例:AA1 DB 10H DUP(2)AA2 DW 10H DUP(0304H)XOR BX,BX XOR AL,AL XOR CX,CX BB1:ADD AL,AA1BX ADD AL,BYTE PTR AA2BX INC BX LOOP BB1上述程序段运行期间,当执行完 INC BX 指令且(BX)=05H 时,CX 和 AL 中的内容分别是什么?(CX)=0FFFCH (AL)=1CH(2)LOOPE/LOOPZ指令格式:格式:LOOPE LOOPE 目标地址目
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。