1、2018/11/16,第4章 8086/8088汇编语言(格式),1,8086/8088和ARM核汇编语言程序设计,第4章 8086/8088汇编语言(格式),2018/11/16,第4章 8086/8088汇编语言(格式),2,4.1 汇编语言和汇编程序的基本概念,4.2 汇编语言源程序书写格式,4.3 伪指令语句,第4章 8086/8088汇编语言(格式),4.4 8086/8088汇编语言程序格式,4.5 汇编语言的上机过程,2018/11/16,第4章 8086/8088汇编语言(格式),3,汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用
2、符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快 。,4.1.1 汇编语言,4.1汇编语言和汇编程序的基本概念,2018/11/16,第4章 8086/8088汇编语言(格式),4,用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。汇编程序有基本汇编ASM(Ass
3、embler)和宏汇编MASM(Macro Assembler)两种。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。,4.1汇编语言和汇编程序的基本概念,4.1.2 汇编程序,2018/11/16,第4章 8086/8088汇编语言(格式),5,4.1 汇编语言和汇编程序的基本概念,4.1.2 汇编程序,汇编语言程序的建立和汇编过程,在计算机上运行汇编语言程序的步骤是: 用编辑程序(任何一种文本编辑程序)建立ASM文件; 用MASM程序把ASM文件转换成OBJ文件; 用LINK程序把OBJ文件转换成EXE文件; 用DOS命令直接键入文件名就可执行该
4、程序;,2018/11/16,第4章 8086/8088汇编语言(格式),6,4.1 汇编语言和汇编程序的基本概念,4.1.2 汇编程序,汇编程序的主要功能:(1) 检查源程序,给出出错信息。(2)产生目标文件(.obj)和列表文件(.lst)。(3)展开宏指令。,2018/11/16,第4章 8086/8088汇编语言(格式),7,连接的主要功能DOS运行一个可执行程序时,先要在内存中为该程序开辟一块或几块存储空间,然后在此加载并运行该程序。该存储空间是由系统当时的运行状态决定的,是不固定的,这就要求可执行程序是可重定位的,即它可以在内存的不同位置运行。汇编后生成的目标程序虽然加载了CPU可
5、识别的机器代码,但它缺少系统所需要的重定位信息,所以并不能直接运行。目标程序必须经过连接程序的连接,生成附带重定位信息的可执行程序(后缀为.COM或.EXE的文件)才能运行。连接程序的第一个任务就是从目标模块中产生一个运行模块,并使其具有可重定位性。连接程序的第二个任务是可将几个目标模块连接成一个可执行的模块,并同样使其具有可重定位性。这样就可以将一个程序的几部分分别编写,汇编成几个目标模块,再通过连接程序将几个目标模块连接,生成一个完整的运行模块。连接程序可以发现源程序中的连接错误,如段的溢出或覆盖、匹配的模块、不存在或不匹配的标号、变量等。DOS下常用的连接程序有Link、Tlink等。,
6、4.1 汇编语言和汇编程序的基本概念,4.1.2 汇编程序,2018/11/16,第4章 8086/8088汇编语言(格式),8,4.2 汇编语言源程序书写格式,4.3 伪指令语句,第4章 8086/8088汇编语言(格式),4.4 8086/8088汇编语言程序格式,4.5 汇编语言的上机过程,4.1 汇编语言和汇编程序的基本概念,2018/11/16,第4章 8086/8088汇编语言(格式),9,4.2 汇编语言源程序书写格式,4.2.1 汇编语言源程序的分段结构,数据段 堆栈段 代码段,4.2.2 汇编语言源程序的语句类型,指令语句 伪指令语句 宏指令语句,2018/11/16,第4章
7、 8086/8088汇编语言(格式),10,例:一个完整的段定义格式,STACK SEGMENT STACK ; 定义堆栈段STACK. ; 分配堆栈段的大小 STACK ENDS DATA SEGMENT ; 定义数据段. ; 定义数据 DATA ENDS CODE SEGMENT CODE ;定义代码段ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ; 程序开始MOV DS,AX. ; 程序代码MOV AX,4C00H ; 程序终止,返回DOSINT 21H CODE ENDS ;代码段结束. ;子程序代码END START ;汇编结束
8、,例:一个完整的段定义格式,4.2 汇编语言源程序书写格式,2018/11/16,第4章 8086/8088汇编语言(格式),11,stackseg segment para stackdb 256 dup(?) stackseg ends data1 segment word public const data1 ends data2 segment word public vars data2 ends,汇编语言程序结构,4.2 汇编语言源程序书写格式,2018/11/16,第4章 8086/8088汇编语言(格式),12,codeseg segment assume cs:codeseg
9、,ds:data1,es:data2,ss:stackseg start: mov ax,data1;初始化DS和ESmov ds,ax mov ax,data2mov es,ax mov ah,4ch ;程序结束,返回DOSint 21h codeseg endsend start,4.2 汇编语言源程序书写格式,2018/11/16,第4章 8086/8088汇编语言(格式),13,4.3 伪指令语句,4.2 汇编语言源程序书写格式,第4章 8086/8088汇编语言(格式),4.4 8086/8088汇编语言程序格式,4.5 汇编语言的上机过程,4.1 汇编语言和汇编程序的基本概念,20
10、18/11/16,第4章 8086/8088汇编语言(格式),14,4.3.1 数据定义及存储器分配伪指令,4.3 伪指令语句,变量 助记符 初值表达式1 ,初值表达式2, ; 注释,1) 变量名必须是一个合法的标识符,它可以写,也可以不写; 2) 助记符用于确定内存单元的数据类型,如:DB(字节)、DW (字) 、DD (双字) 、DF(6字节)、DQ(四字)、DT(10字节)。 3) 初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号,分开;如果某个存储单元没有初值表达式,则必须用一个问号?来表示; 4) 在定义语句的后面可以书写注释内容,也可以不写。,2018/11/1
11、6,第4章 8086/8088汇编语言(格式),15,4.3.1数据定义及存储器分配伪指令,4.3 伪指令语句,表达式根据不同的伪操作有不同的形式:,DB伪指令:表达式可以是以下4种形式: 字节常量以及不确定常量“?”; 重复子句:数值表达式 DUP (表达式,表达式); 串常量; 以上3种形式的任意组合。,变量 DB 初值表达式1 ,初值表达式2, ; 注释,2018/11/16,第4章 8086/8088汇编语言(格式),16,例:,4.3.1 数据定义及存储器分配伪指令,4.3 伪指令语句,STRING DB ABC,例:,BYTES DB 10,4,?,10H,2018/11/16,第
12、4章 8086/8088汇编语言(格式),17,4.3.1数据定义及存储器分配伪指令,4.3 伪指令语句,表达式根据不同的伪操作有不同的形式:,DW伪指令:表达式可以是以下4种形式:除了是字数据外与DB伪指令的、同;地址表达式(此时取的是其偏移地址);一个或两个字符组成的串常量;以上3种形式的任意组合。,2018/11/16,第4章 8086/8088汇编语言(格式),18,DATA_BYTE DB 10,4,10H,? DATA_WORD DW 100,100H,-5,?,DATA_BYTE ,DATA_WORD ,例:,4.3.1 数据定义及存储器分配伪指令,4.3 伪指令语句,2018/
13、11/16,第4章 8086/8088汇编语言(格式),19,4.3.1数据定义及存储器分配伪指令,4.3伪指令语句,表达式根据不同的伪操作有不同的形式:,DD伪指令:表达式可以是以下4种形式:除了是双字数据外与DB伪指令的、同;地址表达式(此时分别将偏移地址和段地址存放到存储 器 中,偏移地址对应低地址);一个到四个字符组成的串常量;以上3种形式的任意组合。,2018/11/16,第4章 8086/8088汇编语言(格式),20,0 4,1 0,6 4,0 0,0 0,0 1,F B,F F,3 C,0 0,0 0,0 0,F D,F F,0 0,0 0,0 A,DATA1,DATA2,DA
14、TA3,10d,4,10h,DATA1 DB 10,4,10H DATA2 DW 100,100H,-5 DATA3 DD 3CH,0FFFDH,例:,4.3.1数据定义及存储器分配伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),21,ARRAY DB HELLODB ABDW AB,ARRAY ,DW1 DD 12345678H DW2 DD 0abcd1243H,DW1 ,DW2 ,例,例:,4.3.1数据定义及存储器分配伪指令,4.3伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),22,重复说明符DUP从前面的内
15、容里,我们知道了定义少量内存变量的定义形式,但如果在程序中要说明50个、100个、200个甚至更多的、同类型的内存变量时,若采用前面所学的方法,对它们一一加以说明显然是不可行的。为此,汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下:repeat_count DUP (表达式, 表达式, , 表达式)解释:repeat_count是重复次数,(表达式, 表达式, , 表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是含义另一个DUP的式子。如果在表达式的括号中有多个表达式,那么,它们之间要用逗号,分开。,4.3.1数据定义及存储器分配伪指令,4.3伪指令语句,2018/
16、11/16,第4章 8086/8088汇编语言(格式),23,0 1,0 2,-,0 0,0 1,0 2,-,-,0 0,BUF1,BUF2,-,100个 字节,例: BUF1 DB 2 DUP(0,1,2,?)BUF2 DB 100 DUP(?),例: DB 2 DUP (0,2 DUP(1,2),3),4.3.1数据定义及存储器分配伪指令,4.3 伪指令语句,应为 0,1,2,1,2,3, 0,1,2,1,2,3,2018/11/16,第4章 8086/8088汇编语言(格式),24,4.3.2符号定义伪指令,4.3 伪指令语句,常用的符号定义伪指令有EQU、LABLE。,1) EQU伪指
17、令 格式:标识符 EQU 表达式 功能:用表达式来定义标识符,即使得标识符等同于表达式。,COUNT EQU 8 ;定义一个符号常量COUNT,使其等同 于8 ADDR EQU SS:BXSI ;使得ADDR等同于地址表达式SS:BXSI,例,作用是左边的符号名代表右边的表达式。 注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义,2018/11/16,第4章 8086/8088汇编语言(格式),25,4.3.2符号定义伪指令,4.3伪指令语句,2) 伪指令 格式:标识符 = 表达式 功能:与EQU伪指令基本相同,但=伪指令可对同一标识符重新定义。,数值表达式在
18、汇编时应该可以计算出数值。用等号语句定义的符号可以被重复定义。 例如:ABC = 10 + 200 * 5 ;ABC的值为1010ABC1 = 5 * ABC + 21 ;ABC1的值为5071COUNT = 1 ;COUNT的值为1COUNT = 2*COUNT + 1 ;COUNT的值为3,2018/11/16,第4章 8086/8088汇编语言(格式),26,4.3.2符号定义伪指令,4.3伪指令语句,3) LABEL伪指令 格式:标识符 LABEL 类型 功能:定义标识符的类型。 如果标识符是变量,则类型可以是BYTE、WORD、DWORD。 如果标识符是标号,则类型可以是FAR、NE
19、AR。,这样,上述100个字节的数组中的第一个字节的地址赋予二个不同类型的变量名:字节类型变量名BYTE_ARRAY和字类型WORD_ARRAY。注意:EQU、=伪指令仅仅是对程序中某些符号进行等价说明,并不实际分配存储单元。因此,EQU、=和LABEL伪指令定义的符号不占存储单元。,例 BYTE_ARRAY LABEL BYTEWORD_ARRAY DW 50 DUP(?),2018/11/16,第4章 8086/8088汇编语言(格式),27,(1)label与指令语句连用,为标号定义类型属性,如:sub_far label farsub:mov ax,bx这样,sub_far和sub两个
20、标号就具有相同的逻辑地址,但具有不同的类型属性,前者为far属性,后者为near属性。,4.3.2符号定义伪指令,4.3伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),28,(2)label与伪指令(变量定义)语句连用,为变量定义类型属性,如:dat_byte label bytedat_word dw 20h dup(?)这样,dat_byte和dat_word两个变量就具有相同的逻辑地址,但具有不同的类型属性,前者为字节类型,后者为字类型。在访问这一段存储器时,可以通过dat_byte作为字节访问,也可以通过dat_word作为字访问,增加了使用的灵活性。,4
21、.3.2符号定义伪指令,4.3伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),29,例 现有数据段定义如下。 D1 SEGMENTA DB 10,4,10H,100B DW $+5,100H,-5C DD 3*20,0FFFDHD DB HELLOE DB ABF DW ABG DW AH DD B,2018/11/16,第4章 8086/8088汇编语言(格式),30,X EQU C+3I DB 2 DUP(0,?,3,-5)K LABEL BYTEL DW 4 DUP(6789H)ORG $+2M DW XD1 ENDS,2018/11/16,第4章 8086
22、/8088汇编语言(格式),31,4.3.3 段定义伪指令,4.3 伪指令语句,段定义伪指令指示汇编程序如何按段组织程序和使用存储器。,1SEGMENT和ENDS伪指令格式:段名 SEGMENT 定位类型组合类型类别 ;段体段名 ENDS,2018/11/16,第4章 8086/8088汇编语言(格式),32,(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。 (2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。 (3)BYTE:表示本段起始地址可以从任一地址处开始存放。 (4)PAGE:表示本段要从能被256整除的地址处
23、开始存放,即起始地址的最低八位必须是0。默认为 PARA,1) 定位类型:说明段的起始地址应有怎样的边界值 。 PARA 、BYTE、WORD 、DWORD 、PAGE,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),33,(1)PRIVATE 该段为私有段,在连接时将不与其他同名段合并 (2)PUBLIC 该段在连接时可以把不同模块的同名段相连接而形成一个段。 (3)COMMON 该段在连接时可以把不同模块中的同名段重叠而形 成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。 (4)STACK 把不同模块的同名段组合而成一
24、个堆栈段。各段之间没有间隙。 (5) MEMORY 同PUBLIC (6)AT 表达式 使段地址是表达式所计算出来的16位值,CS除外。默认为 PRIVATE,2) 组合类型(combine_type)说明程序连接时段合并方法 PRIVATE 、PUBLIC 、COMMON 、AT expression 、 MEMORY、 STACK,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),34,【例】有两个模块,各模块段定义如下 模块1: DATA1 SEGMENT PARA PUBLIC DATA1 M1 DB 45H DUP(0)
25、DATA1 ENDSDATA2 SEGMENT PARA COMMON DATA2 N1 DB 102H DUP(0) DATA2 ENDS END,模块2: DATA1 SEGMENT PARA PUBLIC DATA1 M2 DB 104H DUP(11H) DATA1 ENDSDATA2 SEGMENT PARA COMMON DATA2 N2 DB 105H DUP(0) DATA2 ENDSDATA3 SEGMENT T1 DB 80 DUP(20H) DATA3 ENDS END,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言
26、(格式),35,该段的定位组合方式示意图如图所示。,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),36,3) 类别在引号中给出连接时组成的段组的类型名。在连接后形成的装入模块中,可使相同类别的段位置靠在一起。,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),37,4.3.3 段定义伪指令,4.3 伪指令语句,2ASSUME伪指令格式: ASSUME 段寄存器名:段名/组名,段寄存器名:段名/组名功能:该伪指令用于通知汇编程序,CS、DS、SS或ES被设定为哪些段的段
27、地址寄存器,从而在汇编时能知道语句中引用的变量、标号或表达式所对应的段。格式:ASSUME 段寄存器:NOTHING格式3:ASSUME NOTHING 这两种格式取消前面由ASSUME指定的段寄存器与段的联系。,2018/11/16,第4章 8086/8088汇编语言(格式),38,伪指令ASSUME建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。 DATA1 SEGMENT A DB 1,2,3 DATA1 ENDS CODE SEGMENTASSUME DS:DATA1,CS:CODE CODE ENDS,其中段寄存器名必须是CS ,DS,ES 和SS中的一个。段名必须是由S
28、EGMENT定义的段中的段名。,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),39,段寄存器的装入,DS和ES的装入 通过寄存器传送 如:MOV AX,DATA1MOV DS,AXMOV AX,DATA2MOV ES,AX,SS的装入 (1)自动装入 采用定义段时指定组合类型STACK参数,在ASSUME语句中建立SS的关系,这样就可以自动装入SS。,2018/11/16,第4章 8086/8088汇编语言(格式),40,SS段寄存器的装入,stack1 segment para stackdw 40h dup(?) stack
29、1 ends code1 segmentassume cs:code1,ss:stack1,2018/11/16,第4章 8086/8088汇编语言(格式),41,SS段寄存器的装入,(2) 程序设置 stack1 segment para dw 40h dup(?) top label word stack1 ends code1 segmentassume cs:code1,ss:stack1,mov ax,stack1mov ss,axmov sp,offset top,2018/11/16,第4章 8086/8088汇编语言(格式),42,CS和IP的装入,初始化时装入,根据END伪指
30、令指示的地址END 标号 END语句的作用: 告诉汇编程序,源程序结束 指定程序运行时的起始地址,即: seg 标号 cs offset 标号 ip 例:END START START的,段地址CS,偏移地址 IP,2018/11/16,第4章 8086/8088汇编语言(格式),43,CS和IP的装入,(2)自动修改CS和IP 执行CALL FAR和RET指令 执行JMP FAR指令 响应中断及中断返回(IRET) RESET ,2018/11/16,第4章 8086/8088汇编语言(格式),44, 段定义伪操作:,完整的段定义格式举例,data segment ; 定义数据段 data
31、ends ;- extra segment ; 定义附加段 extra ends ;- code segment ; 定义代码段assume cs:code, ds:data, es:extra start: mov ax, datamov ds, ax ; 段地址 段寄存器 code endsend start,安徽理工大学 计算机科学与技术系 汇编语言,2018/11/16,第4章 8086/8088汇编语言(格式),45, code segment main proc farassume start:push dsmov ax, 0push axret main endp code en
32、dsend start, code segment main proc farassume start:mov ax,4c00hint 21h main endp code endsend start,安徽理工大学 计算机科学与技术系 李敬兆 汇编语言,2018/11/16,第4章 8086/8088汇编语言(格式),46,4.3.3段定义伪指令,4.3 伪指令语句,3段组语句GROUP 格式:段组名 GROUP 数据段名1,数据段名2 功能 :GROUP伪指令可以把模块中若干不同的段集合成一个组,并赋予一个组名,使它们都装在同一物理段(64KB)中。以便程序在访问各数据段时使用一个数据段寄存
33、器DS。,data1 segmentdata1 endsdata2 segment data2 endsdatagroup group data1,data2code segmentassume cs:code,ds:datagroupstart:mov ax,datagroupmov ds,ax,2018/11/16,第4章 8086/8088汇编语言(格式),47,ORG伪指令格式: ORG 表达式 格式2: ORG $+表达式其中表达式的值必须为常量。 功能:告知汇编程序,使其后的指令或数据从表达式的值所指定的偏移地址开始存放。,2018/11/16,第4章 8086/8088汇编语言(
34、格式),48,例:DATA SEGMENTORG 10VECT1 DW 47A5HORG 20VECT2 DW 0C596HDATA ENDS,A 5,4 7,VECT1,0AH,14H,9 6,C 5,VECT2,例:ORG 100H START: ,2018/11/16,第4章 8086/8088汇编语言(格式),49,5程序计数器(地址计数器)$在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编指令的偏移地址。当开始汇编或每一段开始时,将地址计数器初始化为,以后汇编过程中,每处理一条指令就增加一个值,此值为该指令所需字节数。地址计数器的值用$表示,汇编语言允许用户直接用$引
35、用地址计数器的值。,4.3.3 段定义伪指令,4.3 伪指令语句,2018/11/16,第4章 8086/8088汇编语言(格式),50,例: ARRAY DW 1,2,$+4,3,4,$+4, 又假定ARRAY分配的偏移地址为0074, 则存储区分配情况如图所示。,0 0,0 2,0 0,7 C,0 0,0 3,0 0,0 4,0 1,ARRAY,0074,0 0,8 2,0 0,0078,007E,2018/11/16,第4章 8086/8088汇编语言(格式),51,4.3.4 过程定义伪指令,4.3 伪指令语句,一个过程由伪指令PROC和ENDP来定义 格式:过程名 PROC 类型;过
36、程体RET过程名 ENDP,其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定。如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。,2018/11/16,第4章 8086/8088汇编语言(格式),52,4.3.5 汇编结束伪指令END,4.3 伪指令语句,格式: END 表达式 功能:该伪指令表示源程序的结束,令汇编程序停止汇编。 因此,任何一个完整的源程序均应有END指令。其中表 达式表示该汇编程序的启动地址。 例如: END START ;表明该程序的启动地址为START,源程序的最后必须有一条END语句 可
37、选的标号用于指定程序开始执行点,连接程序将据此设置CS : IP值,请同学们注意: 程序终止和汇编结束是两码事,2018/11/16,第4章 8086/8088汇编语言(格式),53,4.3 伪指令语句,4.2 汇编语言源程序书写格式,第4章 8086/8088汇编语言(格式),4.5 汇编语言的上机过程,4.1 汇编语言和汇编程序的基本概念,4.4 8086/8088汇编语言程序格式,2018/11/16,第4章 8086/8088汇编语言(格式),54,一般情况下,汇编语言的语句可以由以下几部分组成:名字 操作 操作数 ; 注释,变量 指令 寄存器 说明程序或语句标号 伪指令 标号 的功能
38、宏指令 变量常数表达式,2018/11/16,第4章 8086/8088汇编语言(格式),55,4.4.1 名字项和操作项,4.4 8086/8088汇编语言程序格式,名字项可以是标号或变量(LABEL/EQU) ,它们都是用来表示本语句的符号地址。标号:在代码段中定义,后面跟上“:”。它有三种属性,即段、偏移和类型。变量:在数据段或附加段中定义,后面不跟冒号,它也有三种属性,即段、偏移和类型。 段属性:标号和名字对应存储单元所在段的段地址。偏移属性:标号和名字对应存储单元所在段的偏移地址。类型属性:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是
39、BYTE(字节)、WORD(字)和DWORD(双字)等。,1) 名字项,2018/11/16,第4章 8086/8088汇编语言(格式),56,2) 操作项,操作项可以是指令、伪指令或宏指令助记符。 对于指令,汇编程序将其翻译成机器指令, 对于伪指令汇编程序将根据其所要求的功能进行处理。 对于宏指令,则根据定义展开。,4.4.1 名字项和操作项,4.4 8086/8088汇编语言程序格式,2018/11/16,第4章 8086/8088汇编语言(格式),57,4.4.2 操作数项,操作数项通常是由常量、寄存器、标号、变量或表达式组成。 表达式是由常量、变量、寄存器、标号和运算符构成。表达式是在
40、汇编过程中能够由汇编程序计算其值的表达式,其组成部分在汇编时就能完全确定。 常量表示一个固定的数值(1)十进制常数 例如:100、255D(2)十六进制常数 例如: 0FFh、0B800H(3)二进制常数 例如:01101100B(4)八进制常数 例如:12O(5)字符串常数 例如:d = 64H(6)符号常数 例如: D equ 2C = 13,4.4 8086/8088汇编语言程序格式,2018/11/16,第4章 8086/8088汇编语言(格式),58,4.4.2 操作数项,4.4 8086/8088汇编语言程序格式,运算符 算术运算符 + - * / MOD 逻辑运算符和移位运算符
41、AND OR XOR NOTSHL SHR 关系运算符 EQ NE GT LT GE LE 分析操作符TYPE LENGTH SIZE OFFSET SEG 综合运算符PTR THIS SHORT HIGH LOW 段属性前缀。,2018/11/16,第4章 8086/8088汇编语言(格式),59,ARRAY DW 1,2,3,4,5,6,7 ARYEND DW ?MOV CX, (ARYEND-ARRAY)/2,ADD AX, ARRAY+(6-1)*2 ; 符号地址常数 有意义; 时意义不明确 MOV AX, BX+1 ; ,MOV AX, BX+1 ; 寄存器相对寻址,4.4 8086
42、/8088汇编语言程序格式,4.4.2 操作数项,+(加)、-(减)、*(乘)、/(除)和MOD(取模)如:120+(321-90)mod 3,322*5/32,0abcdH+5,-590等,算术运算符,2018/11/16,第4章 8086/8088汇编语言(格式),60,【例】用算术运算符进行数值表达式运算。 NUM1 EQU 25*4 50 ;NUM1=50 NUM2 EQU NUM1 / 7 ;NUM2=7 NUM3 DB NUM1 MOD 7 ;NUM3=1 VAR1 DB 1,2,3,4,5 VAR2 DB 12345 NUM4 EQU VAR2-VAR1 ;NUM4=5 NUM5
43、 EQU 0FHMOV AL,NUM5 SHL 4 ;(AL)=11110000BMOV BL,NUM5 SHR 4 ; (BL)=00000000B,4.4 8086/8088汇编语言程序格式,4.4.2 操作数项,2018/11/16,第4章 8086/8088汇编语言(格式),61,OPR1 EQU 25 ;00011001B OPR2 EQU 7 ;00000111BAND AX, OPR1 AND OPR2,(2) 逻辑和移位运算符:逻辑运算符包括按位操作符和移位操作符。具体是:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(异或)、SHL(左移位)和SHR(右移位)。这
44、些逻辑运算符和常量、括号可组成数值表达式。,; AND AX,1,MOV AX, 0FFFFH SHL 2,; MOV AX,0FFFCH,4.4 8086/8088汇编语言程序格式,4.4.2 操作数项,2018/11/16,第4章 8086/8088汇编语言(格式),62,(3) 关系操作符:关系运算符包括符号:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)和GE(大于等于)。这些关系运算符和常量、括号也可组成数值表达式。该表达式的计算结果规定如下:若关系不成立,则该数值表达式的计算结果为0;否则,其结果为0FFFFH。【例】用关系运算符进行数值表达式运算。 NU
45、M1 DB 10 LT 5 ;NUM1=0 NUM2 DB 0AAAAH GT 7FFFH ;NUM2=0FFHMOV AX,A EQ 41H ;0FFFFHAXMOV BX,NUM2 LT NUM1 ;0BX,4.4 8086/8088汇编语言程序格式,4.4.2 操作数项,2018/11/16,第4章 8086/8088汇编语言(格式),63,(4) 分析操作符(数值回送操作符): OFFSET、SEG、TYPE、 LENGTH、SIZE,SIZE 变量 功能:LENGTH * TYPE,OFFSET / SEG 变量 / 标号 功能:回送变量或标号的偏址 / 段址,TYPE 变量 / 标
46、号 / 常数DB DW DD DF DQ DT NEAR FAR 常数1 2 4 6 8 10 -1 -2 0,LENGTH 变量 功能:回送由DUP定义的变量的单元数,其它情况回送1,4.4 8086/8088汇编语言程序格式,4.4.2 操作数项,2018/11/16,第4章 8086/8088汇编语言(格式),64,TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见下表所示。,例: ARRAY DW 1,2,3 ADD SI,TYPE ARRAY 则加法指令被汇编成
47、: ADD SI,2,4.4 8086/8088汇编语言程序格式,4.4.2 操作数项,2018/11/16,第4章 8086/8088汇编语言(格式),65, LENGTH运算符 格式:LENGTH 变量 功能:取出变量所含的数据存储单元个数。它返回重复操作符DUP中的重复数。如果有嵌套的DUP,则只返回最外层的重复数;如果没有操作符DUP,则返回1。 【例】取出变量占存储单元个数。DATA SEGMENTA DB ABCDEFB DW 10 DUP(1,2DUP(2)C DB 3,20 DUP(0)DATA ENDSMOV AX,LENGTH A ;1AXMOV BX,LENGTH B ;10BXMOV CX,LENGTH C ;1CX,