1、第第 4 章章 汇编语言程序汇编语言程序第第 4 章章 汇编语言程序汇编语言程序4.1 汇编语言语句格式汇编语言语句格式4.2 伪指令语句伪指令语句4.3 汇编语言程序设计的过程汇编语言程序设计的过程习题例习题例汇编语言程序的指令汇编语言程序的指令8086/8088汇编语言源程序由三类指令组成:汇编语言源程序由三类指令组成:执行指令(符号指令)执行指令(符号指令)提供给汇编程序提供给汇编程序“翻译翻译”成机器能成机器能直接执行的指令直接执行的指令。伪指令(伪指令(汇编指示指令汇编指示指令)提供给汇编程序提供给汇编程序指示汇编操作的指令指示汇编操作的指令。宏指令宏指令提供给汇编程序的扩展的提供给
2、汇编程序的扩展的“功能宏大功能宏大”的指令的指令。汇编语言源程序的语句格式汇编语言源程序的语句格式 ;名字项名字项是一个用户是一个用户自定义的自定义的标识符标识符。操作符操作符项项是是(执行执行/伪伪/宏)宏)指令的指令的助记符号助记符号保留字保留字。操作数项操作数项是指令是指令的的操作对象操作对象(多个(多个用用“,”分隔)分隔)。注释项注释项是开始于是开始于“;”的提供的的提供的阅读信息阅读信息。注意:注意:各项之间用空格键符,或各项之间用空格键符,或TAB键符分界。键符分界。操作符操作符项项必须有,其它项可选择有必须有,其它项可选择有/无。无。例如,执行例如,执行指令的语句格式:指令的语
3、句格式:;标识符标识符标识符标识符由字母由字母A/aZ/z,09,特殊字符,特殊字符?、.、_、$等字符(少于等字符(少于32个字符,第个字符,第1个字符不能是个字符不能是数字数字,“.”只能做第只能做第1个字符)组成。个字符)组成。标识符标识符在在名字项名字项中被定义,中被定义,可以是可以是标号(结束于标号(结束于“:”)、)、变量名、符号常数名、段名、过程名变量名、符号常数名、段名、过程名等等。定义了的定义了的标识符标识符可以可以在在操作数项操作数项中被使用。中被使用。*标号、过程名标号、过程名作为作为转移地址转移地址使用。使用。*变量名变量名作为内存单元的作为内存单元的偏移地址(偏移地址
4、(EA)使用。使用。*符号常数名符号常数名作为作为立即数立即数使用。使用。*段名段名作为作为段基址立即数段基址立即数使用。使用。操作数表达式操作数表达式操作数操作数是指令操作的具体是指令操作的具体操作对象操作对象,可以是,可以是操作数据操作数据,也,也可以是可以是转移地址。转移地址。操作数个数操作数个数有有0个个操作数(无操作数,或者是隐含的固定寻操作数(无操作数,或者是隐含的固定寻址操作数)、址操作数)、1个个操作数、操作数、多个多个操作数(多个操作数之间操作数(多个操作数之间用用“,”分割)。分割)。操作数操作数可以用规定的可以用规定的汇编表达式汇编表达式描述。描述。汇编表达式汇编表达式是
5、由是由寄存器、常量、变量、标号寄存器、常量、变量、标号,以及,以及运算符运算符组成的,能被汇编程序计算出结果的操作数表达式。组成的,能被汇编程序计算出结果的操作数表达式。汇编表达式汇编表达式分为分为数值表达式数值表达式和和地址表达式地址表达式两种。两种。数值表达式数值表达式数值表达式数值表达式:由常数和数值运算符组成,计算结果是由常数和数值运算符组成,计算结果是字节字节/字整数数字整数数据据的表达式。的表达式。数字常数数字常数(立即数)(立即数):常量常量直接给出直接给出2#/10#/16#数数、ASCII字符数值字符数值常量常量给常数起一个符号名的给常数起一个符号名的符号常数符号常数数值运算
6、符数值运算符(运算对象和结果是(运算对象和结果是整数常数整数常数):):P66,表表4.1 算术运算符算术运算符:+、*、/、MOD逻辑运算符逻辑运算符:NOT、AND、OR、XOR、SHL、SHR 关系运算符关系运算符:EQ、NE、GT、GE、LT、LE (真值为(真值为-1,即全,即全1,假值为,假值为0)地址表达式地址表达式 地址表达式地址表达式:由常量、变量、标号、:由常量、变量、标号、BP、BX、SI、DI,以及运,以及运算符组成的,计算结果为算符组成的,计算结果为内存地址数值内存地址数值表达式。表达式。地址的属性:地址的属性:段基址、偏移址、类型段基址、偏移址、类型(BYTE、WO
7、RD、DWORD、NEAR,FAR)地址运算符(常用):地址运算符(常用):P67,表,表4.2地址算术运算符地址算术运算符:+、;取偏移址的相对位移量取偏移址的相对位移量属性定义运算符属性定义运算符:(段超越前缀)、(段超越前缀)、PTR(类型运算)(类型运算)分析运算符分析运算符:SEG(取段基址值)(取段基址值)OFFSET(取偏移址值)(取偏移址值)TYPE(取地址类型值,(取地址类型值,1/2/4/-1/-2)LENGTH(取变量单元数)(取变量单元数)SIZE(取变量总字节数)(取变量总字节数)用运算符用运算符TYPE、LENGTH和和SIZE作用在变量名上,能分别得到变量作用在变
8、量名上,能分别得到变量的的类型类型、单元数单元数和和总字节数总字节数。SIZE=TYPE LENGTH汇编运算符的优先级汇编运算符的优先级运算符号运算符号优先级优先级LENGTH、SIZE、(、()、)、高高低低:、:、PTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(短距离转移)(短距离转移)地址运算符应用例地址运算符应用例;P68,【例【例4.2】(设】(设DATA段地址为段地址为2000H)DATA SEGMENTD1 DB 41H,6DHD2 DW 803AH,104
9、FHD3 DD 12345678H,0ABCDEF9HD4 DW 40 DUP(1)DATA ENDSMOV AX,SEG D1;AX=2000HMOV BX,OFFSET D2;BX=2MOV DX,OFFSET D3;DX=6MOV DX,TYPE D3;DX=4MOV AX,LENGTH D4;AX=40MOV BX,SIZE D4;BX=80MOV AL,HIGH 1234H;AL=12H汇编语言程序的伪指令汇编语言程序的伪指令提供给提供给汇编程序汇编程序的指示汇编操作控制的指令语句的指示汇编操作控制的指令语句,称为称为伪指令伪指令。常用的常用的伪指令伪指令分成五组:分成五组:符号定义
10、符号定义、内存数据定义内存数据定义、段定义段定义、过程定义过程定义和和模块定义模块定义。常用的伪指令语句:常用的伪指令语句:EQU、=(符号定义)(符号定义)DB、DW、DD(变量定义)(变量定义)SEGMENT、ENDS、ASSUME(段定义)(段定义)ORG(段内偏移址指针(段内偏移址指针$设置)设置)PROC、ENDP(过程(过程子程序定义)子程序定义)NAME、END(模块定义)(模块定义)1.符号定义伪指令符号定义伪指令符号等值伪指令符号等值伪指令EQU格式:格式:EQU 等号伪指令等号伪指令=格式:格式:=与与EQU的不同的不同:=只能是合法的汇编表达式。只能是合法的汇编表达式。=
11、的的可以重复定义。可以重复定义。符号定义伪指令例符号定义伪指令例count EQU 9 b=20b=b+10;可以重新定义,可以重新定义,b=30d=(count+4)*2;d=26 f EQU 123456H;正确,正确,“123456H”为正文为正文g=123456H;错误,数值超范围(错误,数值超范围(16位位2#)例如:例如:addr EQU es:bx+si如果,指令如果,指令mov ax,addr;即为;即为mov ax,es:bx+si2.内存变量定义伪指令内存变量定义伪指令内存变量定义伪指令内存变量定义伪指令DB、DW 和和 DD 格式:格式:DB/DW/DD 功能:定义内存变
12、量和类型,分配和初始化内存单元数据。功能:定义内存变量和类型,分配和初始化内存单元数据。伪指令伪指令内存单元类型内存单元类型字节数字节数数值数值范围范围DBBYTE10255 /-128127DWWORD20 65535/-3276832767DDDWORD4内存变量定义的内存变量定义的数据表数据表内存变量定义的内存变量定义的数据表数据表,给出了顺序存放在内存单元的数据给出了顺序存放在内存单元的数据,多个数据,多个数据之间之间用用“,”分隔。分隔。数据表的数据项数据表的数据项可以是:可以是:数值表达式数值表达式DB(8位数值)位数值)DW(16位数值)位数值)DD(32位数值)位数值)地址表达
13、式地址表达式DW(16位位偏移址偏移址值)值)DD(16位位偏移址偏移址值,值,16位位段基址段基址值)值)字符串字符串:用单用单/双引号界定的双引号界定的字符串字符串(ASCII码码值)。值)。?:分配内存单元,不分配内存单元,不给出给出数据。数据。DUP:数据重复定义子句(可嵌套使用)。数据重复定义子句(可嵌套使用)。格式:格式:DUP()内存变量内存变量定义例定义例数组是若干个连续的同类型的内存单元数据,具有唯一的名字数组是若干个连续的同类型的内存单元数据,具有唯一的名字。数组常用数组常用DUP伪操作表达式定义。伪操作表达式定义。例如:例如:ARA DW 20 DUP(0)P71,图,图
14、4.2:DATA1 DB 0,45H,0FFH,?DATA2 DB HELLO!DATA3 DB 10,2 DUP(2 DUP(1,2),3)P72,图,图4.3:ARRAYW DW -1,1234H,2 DUP(-32768)ADDR DW ARRAYW+2STRING DW EH,LL,!03.段定义伪指令段定义伪指令段定义伪指令段定义伪指令SEGMENT格式:格式:SEGMENT 段结束伪指令段结束伪指令ENDS格式:格式:ENDS(SEGMENT语句与对应的语句与对应的ENDS语句的语句的段名段名必须一致。)必须一致。)段基址说明伪指令段基址说明伪指令 ASSUME 格式:格式:ASS
15、UME segreg:,.(segreg可以是可以是CS、DS、ES和和SS,段名是已定义的。),段名是已定义的。)偏移址指针偏移址指针$设置伪指令设置伪指令 ORG格式:格式:ORG ;数值数值065535程序的代码段结构程序的代码段结构:SEGMENT ;段开始;段开始 ASSUME CS:,DS:ENDS;此段结束;此段结束程序的数据段结构:程序的数据段结构:SEGMENT ;段开始;段开始 ENDS;此段结束;此段结束程序的段结构程序的段结构4.过程(子程序)定义伪指令过程(子程序)定义伪指令过程定义伪指令过程定义伪指令 PROC格式:格式:PROC NEAR/FAR(过程的类型:(过
16、程的类型:NEAR 段内过程,段内过程,FAR 段间过程段间过程。)。)过程结束伪指令过程结束伪指令ENDP格式:格式:ENDP(PROC语句与对应的语句与对应的ENDP语句的语句的过程名过程名必须一致。)必须一致。)过程(子程序)结构过程(子程序)结构必须在代码段结构内。必须在代码段结构内。SEGMENT ;段开始;段开始 ASSUME CS:,DS:CALL ;调用过程指令;调用过程指令 PROC;过程开始;过程开始 RET;过程返回指令;过程返回指令 ENDP;过程结束;过程结束 ENDS;段结束;段结束过程(子程序)的结构过程(子程序)的结构5.程序模块定义伪指令程序模块定义伪指令程序
17、模块开始伪指令程序模块开始伪指令NAME格式:格式:NAME (程序模块开始于(程序模块开始于NAME伪指令伪指令,可省略可省略。)。)程序模块结束伪指令程序模块结束伪指令END格式:格式:END (程序模块结束于(程序模块结束于END伪指令伪指令,不可省略不可省略。)。);P63,【例【例4.1】NAME EXAMPLEDSEG SEGMENT data1 db 4 dup(1),10h,11,0ah,0,0bh sum db?count egu 9DSEG ENDSSSEG SEGMENT STACKdw 100H dup(?)SSEG ENDSCSEG SEGMENT ASSUME CS
18、:CSEG,DS:DSEG,SS:SSEGSTART:MOV AX,DSEG MOV DS,AX ;设置;设置DS MOV AX,4C00H ;返回;返回DOSINT 21HCSEG ENDS END START汇编语言源程序结构例汇编语言源程序结构例汇编语言程序设计的处理软件汇编语言程序设计的处理软件汇编语言程序设计的系统软件汇编语言程序设计的系统软件:编辑程序编辑程序EDIT.EXE/记事本记事本汇编程序汇编程序MASM.EXE/TASM.EXE连接程序连接程序LINK.EXE/TLINK.EXE 调试程序调试程序DEBUG.EXE/TD.EXE*上述系统软件是在上述系统软件是在MS-DO
19、S环境环境下使用!下使用!汇编语言程序设计过程汇编语言程序设计过程源文件源文件(例:(例:EX1.ASM)执行文件执行文件(例:(例:EX1.EXE)目标文件目标文件(例:(例:EX1.OBJ)执执 行行编辑程序编辑程序汇编程序汇编程序连接程序连接程序调试程序调试程序4.4 根据以下数据段定义,执行指令,给出相关寄存器内容。根据以下数据段定义,执行指令,给出相关寄存器内容。(设(设DATA段地址为段地址为1000H)DATA SEGMENTD1 DB 61H,52HD2 DW 3456H,0123HD3 DB 20 dup(0)DATA ENDSMOV AX,SEG D2;AX=1000HMO
20、V BX,OFFSET D3;BX=6 MOV CX,TYPE D1;CX=1MOV DH,SIZE D2;DH=4习题习题4.4习题习题4.54.5 根据以下数据段定义,指出指令中的错误。根据以下数据段定义,指出指令中的错误。DATA SEGMENTNUM=48X DB NUMY DB 56Z DW 300 DATA ENDSMOV DS,DATA;立即数不能直接送给段立即数不能直接送给段RMOV AX,X;数据类型不匹配数据类型不匹配MOV NUM,BX;目的数不能是立即数目的数不能是立即数MOV AL,Z;数据类型不匹配数据类型不匹配MOV Y,BX;数据类型不匹配数据类型不匹配MOV X,Y;不能不能2个数都是内存寻址个数都是内存寻址