您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章 汇编语言及汇编语言程序设计1
第四章汇编语言及汇编语言程序设计教学目的与要求:掌握汇编语言的基本语法规则掌握程序调试的基本步骤和方法学习指令和伪指令的应用掌握子程序的设计方法和DOS功能调用的方法掌握三种基本结构的程序设计方法4.1概述机器语言用二进制数来表示指令和数据。如:B80200如:MOVAX,2助记符—反映指令的功能和主要特征,便于人们理解和记忆。汇编语言用助记符,符号地址以及标号等符号书写的程序。操作数是指令操作的对象,根据操作数的来源不同可分为寄存器操作数(寄存器名表示),立即数(十进制或16进制数表示)和存储器操作数(涉及存储器的地址)和转移类指令的转移地址(涉及地址转移)。用汇编语言编写的程序叫汇编语言源程序。三段式:堆栈段、数据段、代码段;一个汇编语言程序实例STACKSEGMENTDW256DUP(?)TOPLIBELWORDSTACKENDSDATASEGMENTBLOCKDB43H,0ABH,…PDATADB20DUP(?)NDATADB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKEXP1PROCFARMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPLEASI,BLOCKLEADI,PDATALEABX,NDATACLDMOVCX,PDATA-BLOCKGOON:LODSBTESTAL,80HJNZMINUSSTOSBSTART:MOVAX,DATAMOVDS,AXMOVES,AX代码段:初始化部分、功能部分、返回操作系统;JMPAGAINMINUS:XCHGBX,DISTOSBXCHGBX,DIAGAIN:LOOPGOONMOVAX,4C00HINT21HEXP1ENDPCODEENDSENDSTART8086/8088汇编语言的指令格式:MASM(宏汇编)、ASM(小汇编)[标号:]指令助记符操作数1[,操作数2][;注释]指令的功能说明指令操作的对象指令功能的符号表示,关键字,不可缺省该指令的符号地址,可选项。标号的命名规则:字母(大小写英文字母)或特殊符号(?、_、@)打头的字母数字系列。‘?’不能单独作标号。例:START,MY_CODE,LOOP1,?234是有效的命名。4LP1,MY$,?,STR-1等是无效的命名。4.2伪指令汇编语言的语句分为两类:•指令性语句,其格式为:标号:(前缀)指令助记符操作数;注释•指示性语句,又叫伪指令,其格式为:名字伪指令操作数;注释指令性语句是计算机可执行的,汇编后产生目标代码;而指示性语句不能执行,只是告诉汇编程序如何生成目标代码,一般用来定义变量,分配存储单元,指示程序开始和结束等。指示性语句的名字后不带‘:’!常用的伪指令有:•符号定义伪指令(赋值伪指令)•内存数据定义(变量定义)伪指令•段定义伪指令•子程序(过程)定义伪指令•定位伪指令•模块定义伪指令•外部符号定义伪指令•记录伪指令•结构伪指令•程序的开始和结束伪指令4.2.1符号定义伪指令1.赋值伪指令EQU(equal)格式为:符号名EQU表达式*用符号代表常量或数值表达式。例:CONSTANTEQU100NEW_PORTEQUPORT_VAL+1P8EQUDS:[BP+2]*用符号表示一个字符串。如:HELLOEQU‘Howareyou?’’*重新定义关键字或指令助记符。如:MOVEEQUMOVCOUNTEQUCX可以是地址表达式也可以是数据表达式。注意:用EQU指令定义的符号,不能一个符号多次定义,除非先用PURGE伪指令解除定义。2.等号(=)伪指令格式:符号名=数值表达式与EQU类似,但允许重新定义例:┇EMP=7;值为7┇EMP=EMP+1;值为8已用EQU定义的符号,可用PURGE解除,再重新定义。格式:PURGE符号1[,符号2][,…符号n]例:PURGENEW_PORTNEW_PORTEQUPOTR_VAL+83.解除伪指令PURGE4.2.2内存数据定义伪指令DB用来定义字节DW用来定义字DD用来定义双字DF用来定义6字节内容DQ用来定义4字内容DT用来定义10字节内容伪指令助记符有如下几种:例1:DATA_BYTEDB10,5,‘A’DATA_WORDDW100H,100,-4DATA_DWDD2*30,0FFFBH格式:[名称]伪指令助记符数据表;[注释]其中变量名用符号地址表示,后面不能跟冒号。汇编后如下图所示:0A054100016400FCFF3C000000FBFF0000DATA_BYTEDATA_DWDATA_WORD10541H100H100-4600FFFBHDATA_BYTEDB10,5,‘A’DATA_WORDDW100H,100,-4DATA_DWDD2*30,0FFFBH例2:操作数可以是字符串MASTERLIDB‘HELLO’汇编后如下:48454C4C4FMASTERLI‘H’‘E’‘L’‘L’‘O’DB’AB’DW’AB’41‘A’42‘B’42‘B’41‘A’高地址低地址存储器中数据分布:存储器中数据分布:注意下面的不同:操作数?用来保留存储空间,但不存入数据.例3:ABCDB0,1,?,?,?LPIDW?,54,?汇编后如下图示:0001╳╳╳╳╳3600╳╳ABCLPI01?????54高地址低地址存储器中数据分布:操作数字段还可以用复制操作符DUP来缩写,如上面ABC亦可写成:ABCDB0,1,3DUP(?)又如:DO_2DB2DUP(0,1,2,?)与DO_2DB0,1,2,?,0,1,2,?等价存储器中数据分布:0DO_212?012?高地址低地址4.2.3段定义伪指令(SEGMENT、ENDS)段定义伪指令的格式如下:段名SEGMENT[定位方式][连接方式][’类别名’]┇段名ENDS;本段定义结束;段内容这两个伪指令总是成对出现,二者前面的段名一致。二者之间的部分,对于数据段、附加段及堆栈段,一般是符号、内存数据定义等伪指令。对于代码段则是指令及伪指令。SEGMENT和ENDSSEGMENTENDS方括号中为可选项,规定了逻辑段的一些其他特性;分别为:[定位方式][连接方式][’类别名’]2)BYTE起始地址××××××××××××××××××××4)DWORD起始地址××××××××××××××××××005)PAGE起始地址××××××××××××000000001.定位方式(定位类型)(Align)说明如何确定逻辑段的边界。定位类型有四种:1)PARA(Paragraph)(缺省情况)起始地址××××××××××××××××00003)WORD起始地址×××××××××××××××××××02、连接方式(组合类型),6种。在模块化程序设计中,为连接程序提供模块间的连接信息。通知连接程序把不同模块中的段名相同的段组合到一起。连接方式PUBLIC:表示当前段与其它模块中组合类型为PUBLIC的同名段组合成一个段。组合的先后顺序取决于LINK程序中目标模块的排列次序。由于受同一个段地址的控制,组合时后续段的起始地址都作相应调整。连接方式COMMON:表示当前段与其它模块中的同名段重叠,即起始地址相同。段的长度取决于最长的段的长度,由于段覆盖,所以前一段中的初始化数据可能被后续同名段中的初始化数据所覆盖。连接方式STACK:表示当前段是堆栈段,组合类型同PUBLIC。连接方式NONE:表示本段与其它逻辑段没有关系,各自使用独立的段地址,这是系统隐含连接方式。连接方式MEMORY:指定该段分配在其它所有连接在一起的段的更高地址上面,若连接时遇到几个指定的MEMORY段,则遇到的第一个段为MEMORY段,其它为COMMON段(即段覆盖方式)。连接方式AT表达式:表示当前段应按绝对地址定位,起始地址即为表达式的值。这一连接方式不适合代码段。例:某源程序由两个模块构成,源程序如下:;程序名:T5_1.ASM;功能(略)DSEGSEGMENTPARACOMMONMESSDB‘HELLO’,0DH,0AH,’$’DSEGENDSCSEGSEGMENTPARAPUBLICASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVDX,OFFSETMESSMOVAH,9INT21HMOVAX,4C00HINT21CSEGENDSENDSTART;程序名:T5_2.ASM;功能(略)DSEGSEGMENTPARACOMMONMESSDB‘OK’DSEGENDS用单引号括起来的字符串,表示段的分类,连接程序总是使类别相同的段物理上相邻(但同名的段遵守组合类型的约定)。典型类别如下:‘DATA’、‘CODE’、‘STACK’3、类别CSEGSEGMENTPARAPUBLICMOVAX,4C00HINT21CSEGENDSEND先把这两个段分别汇编,最后用连接程序连接,命令如下:LINKT5_1T5_2所生成的目标代码中,模块2与模块1中的DSEG段重叠,模块2中的CSEG段与模块1中的CSEG段合并成一个段:0000:00004F4B4C4C0D0A24;两个段重叠后的结果OKLLO..$0000:00080000000000000000;CS段的定位类型PARA导致的间隔0001:0000MOVAX,26E2;模块T5_1的CS段0001:0003MOVDS,AX0001:0005MOVDX,00000001:0008MOVAH,090001:000AINT210001:000CMOVAX,4C000001:000FINT210001:0011000000000000000000000000000000;衔接间隔0001:0020MOVAH,4C0001:0022INT21;模块T5_2的CS段4.2.4段寄存器说明伪指令格式:ASSUME段寄存器:段名1,[段寄存器:段名2,…]ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。例:NAMESAMPLESTACKSEGMENTDW256DUP(?)TOPLIBELWORDSTACKENDSDATASEGMENTBLOCKDB43H,0ABH,…PDATADB20DUP(?)NDATADB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKEXP1PROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOP…LEASI,BLOCKLEADI,PDATALEABX,NDATACLDMOVCX,PDATA-BLOCKGOON:LODSBTESTAL,80HJNZMINUSSTOSBJMPAGAINMINUS:XCHGBX,DISTOSBXCHGBX,DIAGAIN:LOOPGOONMOVAX,4C00HINT21HEXP1ENDPCODEENDSENDSTART4.2.5定位伪指令1.起始定位伪指令ORG(origin)格式:ORG表达式伪指令ORG规定了段内的偏移地址,表达式的值即为段内的偏移地址,从此地址起连续存放程序或数据。例:DATASEGMENTORG1000HBLOCKDB43H,0ABH,…PDATADB20DUP(?)NDATADB20DUP(?)DATAENDS2.地址定位伪指令格式:EVEN功能:告诉汇编程序把EVEN指令之后的程序或数据从偶地址开始存放。例:DATASEGMENTXDB10HEVENYDB0200HORG06HZDB‘A’DATAENDS10H偏移地址0000H0001H0002H0003H0004H0005H0006H--00H02H----41H4.2.6子程序定义伪指令在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。使用格式:过程名PROC[NEAR/FAR]…(语句系列
本文标题:第4章 汇编语言及汇编语言程序设计1
链接地址:https://www.777doc.com/doc-3515782 .html