A4-1-汇编语言语法(全)-白底

上传人:沙** 文档编号:243154641 上传时间:2024-09-17 格式:PPT 页数:93 大小:413KB
返回 下载 相关 举报
A4-1-汇编语言语法(全)-白底_第1页
第1页 / 共93页
A4-1-汇编语言语法(全)-白底_第2页
第2页 / 共93页
A4-1-汇编语言语法(全)-白底_第3页
第3页 / 共93页
点击查看更多>>
资源描述
单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 汇编语言,汇编语言概念,汇编语言的编程过程,汇编语言程序结构,汇编语言语法,汇编语言伪指令,汇 编: 将汇编语言编写的程序翻译成机器代码组成的目标程序的过程 成为汇编,汇编程序: 实现自动完成汇编过程的软件叫汇编程序或汇编器,如,MASM.EXE,。,源 程 序: 按汇编语言语法规则编写的文本文件叫汇编语言源程序或汇编语言程序,如,ASM,文件。,目标程序: 由源程序经过汇编而得到的一组机器代码叫目标程序,如,OBJ,文件。,链接程序: 将目标文件与库文件或其它目标文件连接形成可执行文件的软件叫连接程序,可执行程序:由机器代码组成的可提供操作系统执行的文件叫可执行程序或可执行文件,典型的如,COM,文件、,EXE,文件。,名词解释,汇编过程,汇编语言源程序,.,asm,目标程序,.,obj,可执行程序,.com / .exe,汇编程序,MASM.EXE,链接程序,LINK.EXE,汇编,链接,汇编程序(即汇编器)总的功能就是将用,ASCII,码形式的汇编源文件转换成二进制机器代码组成的目标文件。,其具体功能包括以下几方面:,1),检查源程序中的语法错误,并给出错误信息,2),产生源程序的目标程序,并给出列表文件,3),支持地址和数据的符号变量表示,4),支持对内存的管理,5),支持多种类型的数据表示,6),支持程序的模块化组织,7),支持宏汇编、条件汇编等高级操作,汇编程序的主要功能,一般来说,开发汇编语言程序有以下面五个步骤:,1),设计,根据任务要求,设计程序结构、算法,画出流程图。,2),编辑,根据设计方案,创建汇编语言源程序。,它由程序员通过文本编辑器来完成。,DOS,下常用的有,Edit,、,PE2,等。,3),汇编,将汇编语言源程序源程序转化为机器可以理解的目标程序。,汇编器用于完成这步工作。汇编器可以发现源程序中的语法错误,如格式错误、非法指令、操作数类型不匹配等,提示程序员对源程序加以修改,并重新汇编。,常用的汇编器有,Masm,、,Turbo ASM,等。,汇编语言程序的开发过程和工具,4),连接,汇编后生成的目标程序虽然记载了,CPU,可理解的机器代码,但它缺少,DOS,所需要的重定位信息,所以并不能直接运行。目标程序必须经过连接器连接,生成附带重定位信息的可执行程序(,EXE,文件或,COM,文件)才能运行。,连接器的一个任务就是从目标模块中产生一个运行模块,并使其具有可重定位性。,连接器的第二个任务是可将几个目标模块结合成一个可执行的模块。并同样使其具有可重定位性。这样,你可以一次编写程序的一部分,通过结合,将几个目标模块合并,产生一个完整的运行模块。,连接器可以发现源程序中的连接错误,如段的溢出或覆盖,不存在或不匹配的模块、不存在或不匹配的标号、变量等。,常用的连接程序是,LINK.EXE,,,它在,DOS,系统和,Microsoft,Masm,5.0,软件包中都有提供。,汇编语言程序的开发过程和工具,汇编源程序,.,asm,目标程序,.,obj,可执行程序,.com/.exe,汇编程序,MASM.EXE,链接程序,LINK.EXE,算法,编辑程序,EDIT.EXE,交付使用,.com/.exe,调试程序,DEBUG.EXE,编辑,/,修改,汇编,链接,调试,修改,逻辑错误,修改,链接错误,语法错误,5),调试,完成设计、编辑、汇编、连接后得到的可执行程序中可能存在一些错误,(Bug),,,这些错误可能是设计缺陷或编辑时的笔误,它们可能使程序运行出现结果错误、死机甚至其它无法预测的后果。我们称这类错误为逻辑错误,它们是汇编器和连接器都无法发现的。这类错误只能靠程序员凭借调试器对可执行程序进行耐心细致的跟踪调试,才能逐一排除。,典型的调试器有,DOS,中的,Debug,,,Borland,公司的,Turbo Debug,,,Microsoft,公司的,Code View,。,它们都具有程序加载、运行、单步跟踪、断点跟踪、查看修改存储器、查看修改寄存器、反汇编等基本功能。后两种还具备源程序级调试等高级功能,使用起来更加得心应手。,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,汇编语言源程序示例,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,stack segment,para,stack stack,;,定义堆栈段,db 1024 dup (?),stack ends,data segment,para,data,;,定义数据段,hello db Hello, world !, 0dh, 0ah, $,data ends,code segment,para,code,;,定义代码段,assume,cs:code,ds:data,es:data,ss:stack,main proc far,start:,push,ds,xor,ax, ax,push ax,mov,ax, data,mov,ds, ax,lea,dx, hello,mov,ah, 9,int,21h,ret,main,endp,code ends,end main,;,程序起始地址,汇编语言源程序示例,汇编语言源程序采用分段结构,由若干个段构成一个源程序。而一个段又是由若干个语句组成的,语句是汇编语言源程序的基础。源程序的一般格式为,NAMEl,SEGMENT,语句,.,.,.,NAMEl,ENDS,NAME2 SEGMENT,语句,.,.,.,NAME2 ENDS,END,程序起始地址标号,每个段有一个名字,以,SEGMENT,语句作为段的开始,以,ENDS,语句作为段的结束。这两者都必须有名字,而且名字必须相同。,整个源程序以,END,语句作为结束。,汇编语言源程序的结构,汇编语言语句的类型,1,、指令语句,指令语句,就是,8086/8088,的机器指令,它们告诉,CPU,做什么。汇编程序把它们翻译成机器代码。每一条指令语句产生一条,8086/8088,指令,由,CPU,执行操作。如,MOV,,,ADD,,,JMP,等等,2,、指示语句,指示性语句,又称伪语句、伪操作,其构成主体是伪指令,它们告诉汇编程序做什么。汇编程序并不把伪语句翻译成机器代码,它们只是用来指明汇编程序在汇编期间需要做的一些操作,如定义符号,分配存储单元,初始化存储器等等。例如:,COUNT DB,?,指令语句的格式为,标号: 指令助记符 操作数,,,操作数 ;注释,它由四部分组成,各部分之间用空格或制表符,(TAB),分隔。,标号:不是必须的,只有当某条指令作为转移指令的目标时,该条指令才需要加上标号,标号和指令之间必须用冒号,(,:,),分隔。一个语句行可以只由一个标号构成。,指令助记符:可以是,8086/8088,所有合法指令。,操作数:其个数和类型由指令助记符决定。,注释:以分号,(,;,),开始,是对该语句行的文字解释,从分号开始到本行结束的内容全部被汇编器忽略,对程序的汇编及执行都没有影响。,汇编语言语句的基本格式,汇编语言语句的基本格式,2),指示性语句的格式为,名称 伪指令 操作数,,,操作数 ;注释,它由四部分组成,各部分之间用空格或制表符,(TAB),分隔。,名称:可能是必须的,任选的或禁止的,取决于不同的伪指令的要求。,伪指令:说明该行的操作任务。,操作数:其个数和类型由伪指令决定。,注释:以分号,(,;,),开始,是对该语句行的文字解释,从分号开始到本行结束的内容全部被汇编器忽略,对程序的汇编及执行都没有影响。一个语句行可以只由注释构成,称为独立注释行。,汇编语言保留字,下列符号在汇编语言中有特殊的意义,称为,保留字,。,保留字不能作为标号或变量的名字。, 指令助记符,AAA,CLD,ESC,JAE,JNA,JNP,LDS,MOV,POPF,RET,STC,AAD,CLI,HLT,JB,JNAE,JNS,LEA,MOVS,PUSH,ROL,STD,AAM,CMC,IDIV,JBE,JNB,JNZ,LES,MUL,PUSHF,ROR,STI,AAS,CMP,IMUL,JCXZ,JNBE,JP,LOCK,NEG,RCL,SAHF,STOS,ADC,CMPS,IN,JE,JNE,JPE,LODS,NIL,RCR,SAL,SUB,ADD,CWD,INC,JG,JNG,JPO,LOOP,NOP,REP,SAR,TEST,AND,DAA,INT,JGE,JNGE,JS,LOOPNE,OR,REPNE,SCAS,XCHG,CBW,DEC,IRET,JLE,JNLE,JO,LOOPNZ,OUT,REPNZ,SHL,XLAT,CLC,DIV,JA,JMP,JNO,LAHF,LOOPZ,POP,REPZ,SHR,XOR, 寄存器名,AH,BH,CH,DH,AL,BL,CL,DL,AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES, 伪指令,ASSUME,END,EXTRN,NOSEGFIX,PUBLIC,MACRO,CODEMACRO,ENDM,GROUP,ORG,PURGE,ENDM,DB,ENDP,LABEL,PROC,RECORD,DD,ENDS,MODRM,RELB,SEGFIX,DW,EQU,NAME,RELW,SEGMENT, 其它,ABS,EQ,INPAGE,MASK,NOHING,PROCLEN,STACK,AT,FAR,LE,MEMORY,OFFSET,PTR,THIS,BYTE,GE,LENGTH,MOD,PAGE,SEG,TYPE,COMMON,CT,LOW,NE,PARA,SHORT,WIDTH,DUP,HIGH,LT,NEAR,PREFIX,SIZE,常量,源程序中的固定值,(,在程序运行期间不会变化,),,称为,常量,。,常量包括数字常量、字符串常量、符号常量。,1,)数字,(,整数,),常量, 二进制常量,以字母,B,结尾的一串由“,0”,和“,1”,组成的序列。例如,,00101100B,。,十进制常量,由若干个,0,到,9,的数字组成的序列,可以以字母,D,作结尾,或没有任何字母作结尾。例如,,1234D,或,1234,。, 八进制常量,以字母,Q(,或字母,O),结尾,由若干个,0,到,7,的数字组成的序列。例如,255Q,,,377Q,等。, 十六进制常量,以字母,H,结尾,由若干个,09,的数字或,AF,的字母所组成的序列。为了避免与标识符相混淆,十六进制数在语句中必须以数字开头。所以,凡是以字母,AF,开始的十六进制数,必须在前面加上数字,0,。例如,56H,,,0BA3FH,等。,2,)字符串常量,用单引号括起来的字符串称为,字符串常量,。,如:,A,,,AB,,,ABCD,等。汇编之后,单引号中的每个字符转换成相应的,ASCII,码,形成一个字节序列。例如,A,等价于,41H,,,AB,等价于,4142H,。,在可以使用单字节立即数的地方,可以使用单个字符组成的字符串常量;在可以使用字立即数的地方,可以使用两个字符组成的字符串常量。,多于两个字符的字符串常量只有在,DB,伪指令中才是合法的。,3,)符号常量,在汇编语言源程序中,常量或常量表达式可以用伪指令“,EQU”,或等号伪指令“”定义为符号的形式,我们称之为,符号常量,。,符号常量一经定义,就可以像数字常量和字符串常量一样使用。如:,COUNT EQU 16,PORT,3F8H + 1,MOV CX,,,COUNT,;,CX,16,MOV DX,,,PORT,;,DX,3F9H,使用符号常量与直接使用数字常量和字符串常量相比更具有通用性和更便于修改,有利于程序调试,也增加了程序的可读性。,标号和变量,1),物理意义,标号和变量都是由一串字符命名的符号,代表一条指令或一个数据的内存单元地址,我们称之为符号地址。,标号代表一条指令的目标代码所存放的存储单元首地址,为转移和调用指令提供目标地址,可以作为,JMP,、,CALL,等指令的目标操作数。,变量代表内存操作数的存储地址,或者说变量名就代表某个内存单元。它为数据移动和计算指令提供操作数。,2),属性,标号被定义在代码段,变量被定义在数据段、附加段,,标号和变量都有三个属性,它们是:, 段属性:即标号或者变量所在段的段基址,用,SEG,运算符即可求出。, 偏移属性:即标号或者变量所在的单元,相对于段首址之间的地址偏移量,用,OFFSET,运算符可以求出。, 类型属性,i),变量的类型,指变量中每个元素包含的字节数。,如果每个元素都是字节数据,该变量的类型属性是字节型;如果每个元素都是 双字节数据,该变量的类型属性是字型;如果每个元素都是四字节数据,该变量的类型属性是双字型。,ii),标号的类型,标号是转移指令的目标地址。如果某个标号是本段中转移指令的目标地址,那么这个标号是近程标号,它的类型属性为,NEAR(,近,),,只能实现段内转移。如果某个标号是其他代码段转移指令的目标地址,那么这个标号是远程标号,它的类型属性为,FAR(,远,),。,3),标号和变量的命名规则,标号和变量均由字母,(A-Z),、,数字,(0-9),及特殊字符,(?,_$),组成。汇编器不区分大小写。,长度任意,但只有前,31,个字符被汇编器认为是有效字符。,不能以数字开头,(,以免与十六进制数相混淆,),。,不能使用保留字。,上述四条是标号和变量命名的语法规则,是必须严格遵守的。同时,为了使源程序更具可读性,建议在命名时也要遵循以下原则:,应具有明确的逻辑意义。如,TOTAL,、,COUNT,比,TTT,、,CCC,更容易理解。,在合理的前提下,标号越短越好。如,MPH,是,MILES_PER_HOUR,的合理缩写。,标号要使打字简易不出错。一般打字在一行中有几个相同的字母,(,如,HHHH),和相似的字符,(,如字母,O,和数字,0,,字母,I,和数字,1,,字母,S,和数字,5),就容易出问题。应避免之。,不要使用互相混淆的标号,如,XXXX,和,XXYX,。,表达式,表达式是由操作数(常量、寄存器、标号、变量)和运算符组合的序列。,表达式可分为数值表达式和地址表达式。,在汇编时,汇编器按照一定的规则对它们进行计算,前者得到一个数值,后者得到一个存储器地址。,1),数值表达式,数值表达式是常量或是表示常量的标识符,(,符号,),和运算符组合的序列。数值表达式返回一个数值,在指令语句中只能产生立即寻址方式的指令。,2),地址表达式,地址表达式定义存储器中的一个位置。该位置根据其表达式的类型可以是一个变量,也可以是一个标号。,根据涉及的寻址方式的不同,地址表达式有以下几种形式:,简单地址表达式:,由一个变量名或标号名及一个数值表达式构成,返回与变量或标号有同样的段和类型的偏移量,在汇编时生成直接寻址指令。下列语句中画线部分即为这类表达式。,ADD DX,,,COUNT,;,COUNT,是简单的地址表达式,ADD DX,,,COUNT+2,;,在这种情况下,地址表达式同,COUNT,有同样的段和类型,但偏移量大,2,ADD DX,,,COUNT2,;,等价于,COUNT+2,寄存器地址表达式:,由基址寄存器、变址寄存器及数值表达式构成,它返回的不是操作数的有效地址偏移量,而是寻址方式的代码,在汇编时可生成寄存器间址、变址、基址加变址等寻址方式的指令,操作数的有效地址在运行时由,CPU,根据所用的寄存器内容计算出来。,这里,,,BX,和,BP,可以用作基址寄存器,(Base,Reg,),,,SI,和,DI,可以用作变址寄存器,(Index,Reg,),。,8,位或,16,位常数偏移量,(,Disp,),可以同基址或变址寄存器一起使用。,可能的形式有:,Base_Reg,或,Index_Reg,Base_Reg+Index_Reg,Base_Reg+Disp,或,Index_Rreg+Disp,Base_Reg+Index_Reg+Disp,例如:,BX,;,简单变址,BX+2,;变址加位移量,BX+SI,;,双变址,在上述类型的表达式中,可以用方括号代替,+,号。,例如,,BX+SI,同,BXSI,是一样的。,当寄存器表达式作为一个操作数时,因为没有显式指明引用的类型,(,字节、字等,),,所以称为,匿名引用,。,在一个操作数是寄存器的双操作数指令中,汇编器将根据寄存器的类型决定引用类型。例如:,MOV CX, BX,;,传送,BX,指向的字,在所有其它使用匿名引用的情况下,都必须用,PTR,运算符指定所引用的类型。,例如:,MOV WORD PTR DI, 5,;,将,5,赋值给一个字,INC BYTE PTR BX,;,字节增一,在使用寄存器表达式时还要注意以下规则:,只有,BX,、,BP,、,SI,、,DI,四个寄存器可以在方括号中出现;,BX,和,BP,,,SI,和,DI,不能同时出现在方括号中;,方括号中的寄存器值只能进行加法运算,或者加、减一个常数;,方括号中含有,BP,的表达式约定寻址堆栈段。,根据以上规定,下列地址表达式均是非法的:,BX+BP,,,SI+DI,,,BX+CX,,,50-SI,。, 数组地址表达式:,简单地址表达式与寄存器地址表达式结合可以形成更复杂的数组地址表达式,数组名为变量名或标号名,数组的下标可以是常数、数值表达式或,BX,、,BP,、,SI,、,DI,寄存器中的内容,其一般形式为:,nameexp,。,如,:,BUFDB12,,,34,,,56,,,78,,,90,MOVAL,,,BUF0 ; AL = 12,MOVAL,,,BUF2*2; AL = 90,MOVSI,,,3,MOVAL,,,BUFSI ; AL = 78,运算符,1),算术运算符,算术运算符有,+,、,-,、*、和,MOD,。,算术运算符可用于数值表达式或地址表达式。,当其用于地址表达式时,只有当结果有明确的的物理意义时,运算才是有效的。,例如,两个存储器地址相乘或相除是没有意义的。,在相同段的两个存储器地址相减,是这两个存储单元之间的距离,即它们的地址偏移量的差,是有意义的。,对存储器地址经常使用的算术运算是加或减一个数字量。,SUM+1,是指,SUM,字节单元的下一个字节单元的地址,SUM-1,是指,SUM,的前一个字节单元的地址,2),逻辑运算符,逻辑运算符有,AND,、,OR,、,XOR,和,NOT,。,它们是按位操作的,并且只能用于数值表达式。,注意:,AND,、,OR,、,XOR,和,NOT,,,也是,8086/8088,指令的助记符。,运算符是在程序汇编时计算的,而作为指令助记符,则是在程序执行时计算的。例如下列指令:,AND DX,,,PORT_VAL AND 0FEH,在程序汇编时,计算,PORT_VAL AND 0FEH,,,产生一个立即数;在程序执行时,这个立即数与寄存器,DX,的内容作“与”运算,结果送至,DX,。,3),关系运算符,关系运算符有,EQ,(,相等)、,NE,(,不等,),、,LT,(,小于,),、,GT,(,大于,),、,LE,(,小于或等于,),、,GE,(,大于或等于,)6,种。,关系运算的两个操作数必须都是数字或是同一个段内的两个存储器地址。结果是一个数值。,若关系是假,则结果为,0,;若关系是真,则结果为,0FFFFH,。,例如:,MOV BX,(PORT_VAL LT 5) AND 20 ) OR (PROT_VAL GE 5) AND 30),当,PORT_VAL=5,时,汇编的结果是:,MOV BX, 30,4),数值回送运算符,数值回送运算符有,TYPE,、,LENGTH,、,SIZE,、,OFFSET,、,SEG,和,$,。,它们返回标号或变量的属性值。,格式:,TYPE,varlab,这里,varlab,:,是变量、结构或标号的名字。,说明:,TYPE,运算符返回表示操作数类型的值。该值在某些指令序列中是有用的,在这些序列中操作数的类型用以计算增加指针所使用的值。下面是每一种操作数类型返回的值。,TYPE,运算符,操作数类型,返回值,BYTE,l,WORD,2,DWORD,4,QWORD,8,TBYTES,10,STRUCTURE,结构中的字节数,RECORD,记录中的字节数,(1,,,2,或,4),NEAR,一,1,FAR,一,2,格式:,LENGTH,varlable_name,说明:,LENGTH,返回为变量分配的数据单元数。这个运算符对于为存取数组元素的循环设置计数器是很有用的。例如:,WORDARRAY DW l50 DUP(0),;,LENGTH,l50,BYTEARRAY DB 1,,,2,,,3,,,4,,,5,,,6,,,7,;,LENGTH,7,LENGTH,运算符,格式:,SIZE variable_name,说明:,SIZE,运算符返回为变量分配的字节数。此值是,LENGTH,值和,TYPE,值的乘积,即,SIZE,LENGTH * TYPE,。,例如:,WORDARRAY DW l50 DUP(0),;,SIZE,300,BYTEARRAY DB 1,,,2,,,3,,,4,,,5,,,6,,,7,;,SIZE,7,MOV AX,,,SIZE WORDARRAY,;,AX,300,ASIZE DB SIZE BYTEARRAY,;,ASIZE,初始化为,7,SIZE,运算符,格式:,OFFSET,varlab,varlab,是在当前段中定义的变量或标号的名字。,说明:该运算符返回变量或标号的偏移量,这个偏移量是由定义变量或标号的段基址算起的。偏移量的值是,16,位,在大多数情况下,返回的值到链接时才设置。即它是可再定位的数。,OFFSET,运算符主要用于初始化间接寻址所使用的变量或寄存器。,例如:,MOV BX, OFFSET SUM,汇编器将,SUM,的偏移地址作为立即数回送给指令,而在执行时将该地址装如,BX,寄存器中。该指令与下面的指令,LEA BX, SUM,是等价的,OFFSET,运算符,格式:,SEG,varlab,varlab,:,是变量或标号的名字。,说明:,SEG,运算符返回变量或标号的段值。,例如:,MOV AX,,,SEG COUNT,MOV DS,,,AX,;用,COUNT,段初始化,DS,SEG,运算符,格式:,$,说明:,$,运算符返回当前地址计数器值。,汇编的过程中,汇编程序使用地址计数器来保存当前正在进行操作的地址。汇编语言允许程序员通过,$,运算符来引用地址计数器的值。在应用中应注意区分下列两种情况:,i),当,$,用在指令中时,它表示本条指令的第一个字节的地址。,例如,下面指令向前跳转,5,字节,即转向,JMP,指令的首地址加上,5,。,JMP $+5,注意,,$+5,必须是另一条指令的首地址,否则,汇编程序将指示出错信息。,$,运算符,ii),当,$,用在伪指令的操作数字段时,它表示的是地址计数器的当前值。,例如:,ARRAY DW $,,,1,,,2,,,3,,,4,,,$,如汇编时,ARRAY,分配的偏移地址为,0094H,,,则汇编后的存储区将如下所示:,注意,,ARRAY,数组中的两个,$,得到的结果是不同的,其值与,$,所在的位置有关。而在指令中用到,$,时,它只代表该指令的首地址,与,$,本身所在的位置无关。,可以理解为,上述一条语句等效为下列一组语句:,ARRAY DW $,DW 1,DW 2,DW 3,DW 4,DW $,地址,0094,0095,0096,0097,0098,0099,009A,009B,009C,009D,009E,009F,数据,94,00,01,00,02,00,03,00,04,00,9E,00,5),属性运算符,包括段超越、,PTR,、,SHORT,、,THIS,、,HIGH,和,LOW,。,属性运算符用于重新指定标号或变量的属性。,格式:,CS,:,varlab,DS,:,varlab,SS,:,varlab,ES,:,varlab,varlab,:,是变量名、标号名或地址表达式。,说明:段超越用于超越变量或标号的段属性。,段超越的一种用法是用段寄存器作为存储器地址的段。在这种情况下,程序员用段寄存器指定存取的变量或标号。,段超越的比任何,ASSUME,命令更优先。,段超越的另一个用途是超越只包含基址或变址寄存器,而不包含变量名的操作数中的缺省段寄存器。例如,,MOV AL,,,BX ;,使用,DS,寄存器,MOV AL,,,ES:BX ;,使用,ES,寄存器, 段超越运算符,格式:,type PTR exp,type,是,BYTE,、,WORD,、,DWORD,、,NEAR,或,FAR,等类型符号。,exp,是一个地址表达式。,说明:,PTR,运算符用于临时修改变量或标号名的类型,也可用于将类型赋给隐含有效地址表达式,例如,BX,。,PTR,返回属性的类型由,type,决定。,PTR,运算符,如果源操作数是立即数,目标是用间址、变址、基址加变址寻址的内存单元,则目标寻址方式表达式必须用,PTR,说明类型。,MOV BYTE PTR DI,,,99,MOV WORD PTR DI,,,99,ADD WORD PTR DI,,,99,对于用间址、变址、基址加变址寻址的内存单元,若要运行单操作指令,(,如,INC,,,DEC,,,NOT),,,必须用,PTR,说明操作数的类型。,INC BYTE PTR BX,DEC WORD PTR SI,NOT WORD PTR BX,指明间接跳转的类型,JMP DWORD PTR BX,;,段间转移,,BX,指向,2,字节偏移量及,2,字节段地址,JMP WORD PTR BX,;,段内转移,,BX,指向,2,字节偏移量,常见的,PTR,用法:,从字节阵列中得到字,或者从字阵列中得到字节。,W_ARRAY DW l00 DUP(? ),B_ARRAY DB 200 DUP(? ),ADD AL, BYTE PTR W_ARRAY101 ;,将,W_ARRAY+101,地址的字节加到,AL,上,ADD DX, WORD PTR B_ARRAY20 ;,将,B_ARRAY+20,开始的字加到,DX,上,在段的给定偏移量位置上建立一个匿名变量:,MOV AL, DS:BYTE PTR 5 ;,将,DS,段的字节,5,传送到,AL,,即直接寻址,等同于:,MOV AL, DS:BYTE PTR 5,注意:以上两行必须加,DS:,,否则将变成下述情况:,MOV AL, BYTE PTR 5,或,MOV AL, BYTE PTR,5,;,将立即数,5,送给,AL,超越变量或标号的类型属性:,MOV CL,,,BYTE PTR AWORD,;,得到字变量的第一个字节,MOV DL,,,BYTE PTR AWORD+1,;得到第二个字节,MOV AL,,,BYTE PTR APROC+5,;,读程序代码的一个字节,常见的,PTR,用法:,格式:,SHORT label_exp,label_exp,是被汇编指令在同一段内定义的标号或标号表达式。,说明:,SHORT,运算符指定由,JMP,或条件跳转所引用的标号是在指令结尾的,+127,到,-128,字节范围之内。,使用,SHORT,能节省代码字节。,例,:,JMP FWDLAB,;,产生,3,字节指令代码,JMP SHORT FWDLAB,;,只产生,2,字节指令代码,FWDLAB,:,SHORT,运算符,格式:,THIS type,type,是,BYTE,、,WORD,、,DWORD,、,NEAR,或,FAR,等类型符号。,说明:,THIS,运算符在当前汇编位置定义一个变量或标号。,变量或标号的段属性是当前正在被汇编的段,它的偏移量是当前位置计数器的值。它的类型由操作数给运算符指定。,该运算符的应用类似于,LABEL,命令。,该运算符可同,EQU,命令一起应用,或者作为指令操作数的一部分。,它可为数据项定义一个具有改变了类型的另一个名字。例如:,AWORD EQU THIS WORD,;,在当前位置定义标号,AWORD,BYTEl,DB 0,BYTE2 DB 0,它等效于,AWORD LABEL WORD,BYTEl,DB 0,BYTE2 DB 0,使用位置计数器符号,($),相当于,THIS NEAR,。,THIS,运算符,格式:,HIGH expl6,LOW exp16,exp16,是,l6,位的数值表达式。,说明:,HIGH,和,LOW,运算符分别返回作为操作数给出的,16,位数的高字节和低字节。,举例:,MOV AH,,,HIGH l234H,;,AH,12H,VAL EQU LOW l234H,;,VAL,34H,HIGH,、,LOW,运算符,运算符的优先级别,优先级别,运 算 符,高,低,( ) LENGTH SIZE,PTR THIS OFFSET SEG TYPE,段超越前缀,HIGH LOW,*,/ MOD,+,EQ NE GT GE LT LE,NOT,AND,OR XOR,SHORT,同一表达式内可进行多种运算,没有括号时,按优先级别进行运算,同一优先级的运算,按从左到右的顺序进行,汇编语言伪指令,1,、,符号定义伪指令:,EQU,、,PURGE,2,、,数据定义伪指令:,DB,、,DW,、,DD,、,DQ,、,DT,3,、,段定义伪指令:,SEGMENT,、,ENDS,、,ASSUME,4,、,过程定义伪指令:,PROC,、,ENDP,5,、源程序结束伪指令:,END,6,、地址定位伪指令:,ORG,、,EVEN,7,、辅助伪指令:,.RADIX,、,NAME,、,TITLE,8086,汇编语言主要有以下七类伪指令:,1.,符号定义伪指令,1),等价伪指令,EQU,功能:,EQU,伪指令给符号名定义一个数值,或定义为另一个符号名,甚至可定义为一条可执行的指令等。在定义之后,就可以在需要的任何地方使用所起名称。,格式:,符号名,EQU ,表达式,或,符号名,EQU,已定义符号名,应用:,用,EQU,伪指令将数字、复杂地址组合和其他在程序中反复输入的内容等价为一个符号名,方便使用。,举例:,K EQU l024,;给一常数起名,TABLE EQU DS:BPSI,;给一地址组合起名,SPEED EQU RATE,;,给,RATE,起另一个名,COUNT EQU CX,;给一寄存器起名,CBD EQU AAD,;给一指令助记符起名,DBL_SPEED EQU 2*SPEED,MINS_PER_DAY EQU 60*24,1.,符号定义伪指令,1.,符号定义伪指令,2),解除定义伪指令,PURGE,功能:,已经用,EQU,命令定义的符号,在未解除定义前,不能重新定义。若要重新定义可以用,PURGE,伪指令来解除。,格式:,PURGE,符号,1,, 符号,2,,,, 符号,n,应用:,用,PURGE,伪指令解除后的符号可以重新定义。,举例:,PURGE NEW_VAL,NEW_PORT EQU PORT_VAL+10,1.,符号定义伪指令,3),等号伪指令,功能:,功能与,EQU,伪指令类似,不同点是:,1,可以重新定义用定义过的符号,2,EQU,可用于文本中或数字表达式,而只能用于数字表达式。,格式:,符号名,= ,表达式,或,符号名,=,已定义符号名,应用:,同,EQU,举例:,EMP,6,EMP,7,EMP,EMP,1,2.,数据定义,伪指令,功能:,为内存变量分配内存并设置初值,格式:,变量,伪指令符 操作数,,,操作数,;注释,其中:,变量,字段是可选的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序使其记以第一个字节的偏移地址。,注释,字段也是可选的。,伪指令符,字段主要有以下几种,DB,伪指令用来定义字节,其后的每个操作数都占有一个字节。,DW,伪指令用来定义字,其后的每个操作数占有,2,个字节,DD,伪指令用来定义双字,其后的每个操作数占有,4,个字节。,DQ,伪指令用来定义四个字,其后的每个操作数占有,8,个字节。,DT,伪指令用来定义十字节,其后的每个操作数占有,10,个字节。,应用:,数据定义伪指令可以把其后跟着的数据存入指定的存储单元;,或者只分配存储器空间而并不存入确定的数值;,DW,伪指令可以存储,16bit,偏移地址,;,DD,伪指令可以存储,32bit,完整的逻辑地址。,2.,数据定义,伪指令,应用举例:,1),操作数可以是常数,或者是常数表达式,如,:,2.,数据定义,伪指令,DATA_BYTE DB l0,,,4,,,10H,DATA_WORD DW 100,,,100H,,,-5,DATA_DW DD 3*20, 0FFFDH,2),操作数也可以是字符串,如:,MESSAGE DB HELLO,DB AB,DW AB,2.,数据定义,伪指令,3),操作数,?,可以保留存储空间,但不存入数据。如:,ABC DB 0,,,?,,,?,,,?,,,0,DFF DW ?,,,52,,,?,2.,数据定义,伪指令,4),操作数字段还可以使用复制操作符,(duplication),来复制某个,(,或某些,),操作数。,DUP,操作符的格式为:,repeat_count,DUP,(operand,,,,,operand),其中,repeat_count,可以是一个常数或常数表达式,,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。,2.,数据定义,伪指令,例:,ARRAYl,DB 2 DUP(0,,,l,,,2,,,?),等效于:,ARRAY1 DB 0,,,1,,,2,,,?,,,0,,,1,,,2,,,?,ARRAY2 DB 100 DUP(?),等效于:,ARRAY1 DB ?, ?, ?, ?, ?, ,2.,数据定义,伪指令,DUP,可嵌套使用,ARRAY DB 100 DUP(0,,,2 DUP(1,,,2),,,0,,,3),等效于:,ARRAY DB 100 DUP (0,,,1,,,2,,,1, 2, 0,,,3),2.,数据定义,伪指令,3.,段定义伪指令,功能:,SEGMENT,和,ENDS,伪指令定义逻辑段,源程序中每一个逻辑段都必须用段定义伪指令定界。,格式:,段名,SEGMENT ,定位类型, ,组合类型, ,分类名,段体,段名,ENDS,说明:,一个逻辑段从,SEGMENT,语句开始,到,ENDS,语句结束。,段名不能代表段体的性质,但是为了阅读方便,习惯上总是根据段体的性质起一个适当的段名。通常用,DATA,做为数据段的段名,用,STACK,做为堆栈段的段名,,CODE,为代码段的段名。,定位类型,组合类型,分类名是段定义语句的三个属性参数,可以选用一到三个,也可以全部省略。,1),SEGMENT,和,ENDS,伪指令,定位类型,(align_type),定位类型参数通知链接程序,该逻辑段在存储器中的起始边界。,定位类型有,5,种描述方式可供选择:,BYTE,:,字节定位,表示该逻辑段可以从任意地址开始;,WORD,:,字定位,表示该逻辑段从字边界,(,偶地址,),开始;,DWORD,:,字定位,表示该逻辑段从双字边界,(4x,地址,),开始;,PARA,:,节定位,表示该逻辑段从,16,的整数倍地址开始;,PAGE,:,页定位,表示该逻辑段从,256,的整数倍地址开始。,缺省定位类型参数为,PARA,。,3.,段定义伪指令,组合类型,(combine_type),组合类型参数又称链接参数,有,6,种描述方式可供选择:,PRIVATE,:,该段是独立的,不可与其它段组合;,PUBLIC,:,该段与其它模块中具有,PUBLIC,属性的同名段,按照先后顺序连接在一起,组成一个物理段;,COMMON,:,该段与其它模块具有,COMMON,属性的同名段具有相同的起始物理地址,即按照“覆盖”方式组合成一个物理段。组合之后的物理段大小,等于所有,COMMON,属性同名段中最大的段体;,MEMORY,:,该段必须放在同名段的最后,即在同名段中具有最高起始物理地址。如果有多个指定,MEMORY,的同名段,则第一个段作为,MEMORY,段,其他则作为,COMMON,段。,3.,段定义伪指令,STACK,:,用于说明堆栈段,表示该段与其它模块中的同名段采用,覆盖,的方式连接,但它的覆盖方式与,COMMON,不同,是从高地址开始覆盖的,即各个同名堆栈段具有相同的栈底物理地址。,AT,表达式:,该段的段地址被直接指定为,AT,之后的表达式,AT,常和,ORG,伪 指令配合,例如:,DATA SEGMENT AT 0040H,ORG 0017H,KEYFLAG DB ?,DATA ENDS,它定义,BIOS,通讯区键标志单元,(,变量,KEYFLAG),的物理地址为,00417H,,,以便代码段中可以使用变量名,KEYFLAG,访问这个单元。,除在裸机上运行的程序外,,AT,参数不能用于代码段,!,3.,段定义伪指令,3.,段定义伪指令,示例:,NAME MOD1,DATA1 SEGMENT PARA PUBLIC DATA,D1 DB 1, 2, 3, 4,DATA1 ENDS,NAME MOD2,DATA1 SEGMENT PARA PUBLIC DATA,D2 DB 4, 5,DATA1 ENDS,3.,段定义伪指令,示例:,3.,段定义伪指令,示例:,NAME MOD1,DATA1 SEGMENT BYTE PUBLIC DATA,D1 DB 1, 2, 3, 4,DATA1 ENDS,NAME MOD2,DATA1 SEGMENT BYTE PUBLIC DATA,D2 DB 4
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!