1、2022-10-19汇编语言程序设计15.1 概述概述5.2 汇编语言程序框架结构汇编语言程序框架结构5.3 MASM的基本伪指令的基本伪指令5.4 常数、变量和标号常数、变量和标号5.5 宏指令宏指令5.6 段定义的简化段定义的简化第第5 5章章 汇编语言程序设计初步汇编语言程序设计初步2022-10-19汇编语言程序设计2第5章 汇编语言程序设计初步汇编语言是用指令助记符和符号地址来编汇编语言是用指令助记符和符号地址来编写程序写程序汇编程序将源源程序汇编程序将源源程序汇编汇编成二进制代码成二进制代码汇编语言包括:指令助记符、数据和存放汇编语言包括:指令助记符、数据和存放数据的变量、标号、伪
2、指令,及相应的使数据的变量、标号、伪指令,及相应的使用规则。用规则。源程序中一条汇编指令或伪指令均占一行源程序中一条汇编指令或伪指令均占一行指令语句:标号:助记符 Op1,Op2,;注释伪指令语句:符号 伪指令助记符 Op1,Op2,;注释5.1 概述概述2022-10-19汇编语言程序设计31.1.用编辑程序,如用编辑程序,如EDITEDIT建立建立.ASM.ASM源程序;源程序;2.2.用汇编程序用汇编程序MASMMASM把把.ASM.ASM文件汇编文件汇编成成.OBJ.OBJ文件;文件;3.3.用连接程序用连接程序LINKLINK把把.OBJ.OBJ文件连接文件连接成成.EXE.EXE文
3、件;文件;4.4.在在DOSDOS下直接键入可执行文件名即可运下直接键入可执行文件名即可运行该程序。行该程序。5.5.用调试程序用调试程序DEBUGDEBUG调试该程序。调试该程序。运行汇编语言程序的步骤:运行汇编语言程序的步骤:5.1 概述2022-10-19汇编语言程序设计4运行汇编语言程序的步骤:运行汇编语言程序的步骤:MYPRG1.ASMMYPRG2.ASMMYPRG1.OBJMYPRG2.OBJMYLIB.LIBMYPRG.EXE编辑编辑汇编汇编连接运行、调试5.1 概述2022-10-19汇编语言程序设计51编辑 输入源程序;对源程序进行修改。一定要用“纯文本”格式来储存源程序文件
4、,否则无法汇编。产生的源程序文件应该以“.ASM”或“.TXT”为扩展名,最好使用“.ASM”扩展名。编辑软件可以用记事本(Notepad)、Word以及命令行方式下的Edit。5.1 概述2022-10-19汇编语言程序设计62汇编 Microsoft公司的MASM(Macro Assembler)Borland公司的TASM(Turbo Assembler)常用的汇编工具:汇编阶段的任务是把汇编语言源程序“翻译”成为机器代码(称为“目标”),产生二进制的“目标文件”。5.1 概述2022-10-19汇编语言程序设计73连接把几个程序模块产生的目标文件连接成一个完整的可执行程序;把“子程序库
5、”中的子程序连接到程序中去。如果程序里没有定义堆栈段,连接过程会产生警告信息“No stack”。如果程序比较小,这个警告信息不影响连接产生的可执行程序的使用。连接阶段主要完成的操作是:5.1 概述2022-10-19汇编语言程序设计84运行和调试“MYPRG1”扩展名“.EXE”可以省略。如果同时存在文件MYPGM.EXE和MYPGM.COM,上面 的命令将执行程序MYPRG.COM而不是MYPGM.EXE。如果同时存在文件MYPGM.EXE和MYPGM.COM,执行 程序MYPGM.EXE时,需要在命令行打入它的全名。由TLINK产生的“.EXE”或者“.COM”文件可以直接执行。5.1
6、概述2022-10-19汇编语言程序设计9 汇编语言程序不包含输出结果的相关指令,操作者无法看到程序的运行结果。程序能够运行,但是不能得到预想的结果。发生以下两种情况之一的,需要对程序进行“调试”。DEBUG MYPRG1.EXE TD MYPRG1 5.1 概述2022-10-19汇编语言程序设计10第5章 汇编语言程序设计初步5.2 源程序的基本框架结构源程序的基本框架结构汇编语言程序对内存是分段使用的,一般汇编语言程序对内存是分段使用的,一般情况下,内存被分为三种类型区:情况下,内存被分为三种类型区:堆栈段区堆栈段区CSCS指向正当前运行的代码段指向正当前运行的代码段数据段区数据段区DS
7、DS指向当前的数据段指向当前的数据段代码段区代码段区SSSS指向当前的堆栈段指向当前的堆栈段下面以一个简单的程序例子,来介绍汇编下面以一个简单的程序例子,来介绍汇编语言程序的基本框架结构。语言程序的基本框架结构。2022-10-19汇编语言程序设计115.2源程序的基本框架结构_STACK_STACK SEGMENT STACK STACKSEGMENT STACK STACK;定义堆栈段定义堆栈段DB 256 DUP(0)DB 256 DUP(0);堆栈区长度堆栈区长度256256字节字节_STACK_STACK ENDSENDS;堆栈段定义结束堆栈段定义结束_DATADATASEGMENT
8、SEGMENT;定义数据段定义数据段MsgMsgDBDBHello,World!,13,10,$Hello,World!,13,10,$_DATA_DATAENDSENDS;数据段定义结束数据段定义结束_TEXTSEGMENTCODE;定义代码段ASSUME CS:_TEXT,DS:_DATA,SS:_STACKStart:MOVAX,_DATA;取数据内存区段地址MOVDS,AX;设置数据段寄存器MOVMOVDX,Offset MsgDX,Offset MsgMOVMOVAH,9AH,9INTINT21h21h;中断21h的9号功能,显示字符串MOVAX,4C00hINT21h;运行结束,返
9、回DOS_TEXTENDS;代码段定义结束ENDENDStartStart;源程序到此为止2022-10-19汇编语言程序设计125.2源程序的基本框架结构1.内存的分段使用内存的分段使用完整的源程序应有:完整的源程序应有:(1)代码段至少有一个代码段,代码段含有指令,也可以含有伪指令和宏指令。(2)数据段为数据提供内存区。通常在数据段中定义变量、常量等。(3)堆栈段定义并分配供堆栈使用的内存区。如果没有堆栈段,仍可以使用系统提供的16个字节的堆栈空间。2022-10-19汇编语言程序设计135.2源程序的基本框架结构2.源程序的结束与执行入口源程序的结束与执行入口完整的源程序应有:完整的源程
10、序应有:(1 1)ENDEND为结束语句,表示源程序到此结束。为结束语句,表示源程序到此结束。(2 2)ENDEND后面可附带一个在程序中已定义的标后面可附带一个在程序中已定义的标号,用以说明程序的在调入时开始执行的第一号,用以说明程序的在调入时开始执行的第一条指令所在位置。条指令所在位置。源程序是一个独立的程序或主模块,那么伪指令源程序是一个独立的程序或主模块,那么伪指令END后面必须附带一个标号;后面必须附带一个标号;源程序仅是一个普通模块,那么其源程序仅是一个普通模块,那么其END后面就不能附后面就不能附带标号带标号 2022-10-19汇编语言程序设计145.2源程序的基本框架结构3.
11、其它其它完整的源程序应有:完整的源程序应有:(1)ASSUME语句ASSUME语句说明各分段与段寄存器之间的对应关系。(2)装填DS、ES、SS必须装填DS、ES和SS,CS则由系统装填。只要定义完整,SS也可以由系统装。(3)返回DOS 运行于操作系统下的汇编语言程序,须在程序中通过操作系统的相关功能调用来结束其运行。2022-10-19汇编语言程序设计155.2源程序的基本框架结构 例例5.15.1EP501.ASMEP501.ASM 在显示器上输出文字在显示器上输出文字“Hello,World!”。注意输出文字定义在代码段中。注意输出文字定义在代码段中。2022-10-19汇编语言程序设
12、计165.2源程序的基本框架结构 例例5.25.2EP502.ASMEP502.ASM 用用 B C D 数 进 行 运 算:数 进 行 运 算:12345678+33445566。注意高地址高字节、低地址低注意高地址高字节、低地址低字节存放。字节存放。2022-10-19汇编语言程序设计175.2源程序的基本框架结构NAMENAME 模块名模块名符号定义区(符号定义区(EQUEQU)EXTRNEXTRN外部变量说明外部变量说明PUBLICPUBLIC公共变量说明公共变量说明数据段数据段附加段附加段堆栈段堆栈段代码段代码段汇编语言源程序的一般结构:汇编语言源程序的一般结构:数据段名数据段名SE
13、GMENTSEGMENT变量定义变量定义数据空间预置数据空间预置数据段名数据段名ENDSENDS堆栈段名堆栈段名SEGMENT PARA STACK STACKSEGMENT PARA STACK STACK堆栈空间预置堆栈空间预置堆栈段名堆栈段名ENDSENDS代码段名代码段名SEGMENTSEGMENTASSUMEASSUME段寄存器地址说明段寄存器地址说明STARTSTART:段地址装填段地址装填主程序体主程序体返回返回DOSDOS代码段名代码段名ENDSENDSENDENDSTARTSTART2022-10-1918汇编语言程序设计代码段名代码段名SEGMENTSEGMENTASSUM
14、EASSUMEDS:DS:数据段名,数据段名,CS:CS:代码段名代码段名ASSUMEASSUMESS:SS:堆栈段名堆栈段名STARTSTART:MOVMOVAXAX,数据段名,数据段名MOVMOVDSDS,AXAX主程序体主程序体MOVMOVAHAH,4CH4CHINTINT21H21H代码段名代码段名ENDSENDSENDENDSTARTSTART由于返回由于返回DOSDOS的方法不同,代码段的结构有两种:的方法不同,代码段的结构有两种:2022-10-1919汇编语言程序设计代码段名代码段名SEGMENTSEGMENTASSUMEASSUMEDS:DS:数据段名,数据段名,CS:CS:
15、代码段名代码段名ASSUMEASSUMESS:SS:堆栈段名堆栈段名MAINMAINPROCPROCFARFARPUSHPUSHDSDSMOVMOVAXAX,0 0PUSHPUSHAXAXMOVMOVAXAX,数据段名,数据段名MOVMOVDSDS,AXAX主程序体主程序体RETRETMAINMAINENDPENDP代码段名代码段名ENDSENDSENDENDMAINMAIN2022-10-1920汇编语言程序设计2022-10-19汇编语言程序设计21第5章 汇编语言程序设计初步5.3 MASM的基本伪指令的基本伪指令一、符号定义一、符号定义二、数据定义二、数据定义三、段定义三、段定义四、过
16、程定义四、过程定义五、开始和结束语句五、开始和结束语句六、六、其它伪操作其它伪操作2022-10-19汇编语言程序设计225.3 MASM的基本伪指令1.1.等值语句等值语句 EQUEQU2.2.等号语句等号语句 =3.3.解除语句解除语句 PURGEPURGE一一.符号定义语句符号定义语句等值语句等值语句 EQUEQU格式格式namename EQUEQU expressionexpression功能功能给符号名定义一个常数值,可以求出给符号名定义一个常数值,可以求出常数值的表达式,已定义的别的符号名,常数值的表达式,已定义的别的符号名,或有效的助记符。或有效的助记符。例如例如CONSTAN
17、TCONSTANTEQUEQU128128ALPHAALPHAEQUEQU3 3BETABETAEQUEQUALPHA+5ALPHA+5MOVEMOVEEQUEQUMOVMOV2022-10-1923汇编语言程序设计汇编语言程序设计等号语句等号语句 =格式格式namename=expressionexpression功能功能同同EQUEQU语句类似。语句类似。区别区别EQUEQU语句不允许重复定义语句不允许重复定义=语句则允许重复定义语句则允许重复定义例如例如:EMP=8EMP=8:EMP=EMP+1EMP=EMP+1注意:在同一源文件注意:在同一源文件中,同一符号名不能中,同一符号名不能同时
18、使用同时使用EQU和和“=”语句来分别定义语句来分别定义。2022-10-1924汇编语言程序设计汇编语言程序设计解除语句解除语句 PURGEPURGE格式格式PURGE name1PURGE name1,name2,name2,,nameNnameN功能功能解除定义过的符号名。解除后解除定义过的符号名。解除后的符号名可重新定义。的符号名可重新定义。例如例如ALPHAALPHAEQUEQU7 7BETABETAEQUEQUALPHA-5ALPHA-5PURGEPURGEALPHAALPHA,BETABETAALPHAALPHAEQUEQU24242022-10-1925汇编语言程序设计汇编语言
19、程序设计2022-10-19汇编语言程序设计265.3 MASM的基本伪指令DBDB伪指令:用来定义字节,其后的伪指令:用来定义字节,其后的每个操作数占一个字节。每个操作数占一个字节。DWDW字字2 2字节字节DDDD双字双字4 4字节字节DQDQ四字四字8 8字节字节DTDT1010字节字节二二.数据定义语句数据定义语句为一个数据项分配存储单元,用一个符号为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,并可以赋初值。名与这个存储单元相联系,并可以赋初值。数据定义语句数据定义语句格式格式:变量名变量名DB DB 操作数操作数1 1,操作数,操作数2 2,;注释注释变量名变量名DW
20、DW 操作数操作数1 1,操作数,操作数2 2,;注释注释:其中,操作数字段可以是各种形式的数据,存其中,操作数字段可以是各种形式的数据,存入指定的存储单元;也可以只分配存储空间,入指定的存储单元;也可以只分配存储空间,而不存入确定的数据。而不存入确定的数据。2022-10-1927汇编语言程序设计汇编语言程序设计数据定义语句数据定义语句 例例11BDATABDATADBDB10,4,10H10,4,10HWDATAWDATADWDW100,100H,-5100,100H,-5DDATADDATADDDD3 3*20,0FFFDH20,0FFFDH汇编时,在相应的存储单元中存汇编时,在相应的存
21、储单元中存入数据。如右图所示。入数据。如右图所示。1.1.操作数可以是常数或表达式操作数可以是常数或表达式BDATAWDATADDATA0AH04H10H64H00H00H01HFBHFFH3CH00H00H00HFDHFFH00H00H2022-10-1928汇编语言程序设计汇编语言程序设计数据定义语句数据定义语句 例例22MSGMSGDBDBAASTR1STR1 DBDBHow are you?How are you?STR2STR2 DBDBABABSTR3STR3 DWDWABAB汇编时汇编时,在相应的存储单元中存在相应的存储单元中存入数据。如右图所示。入数据。如右图所示。注意:两个以
22、上字符的字符串注意:两个以上字符的字符串只能用只能用DBDB定义和初始化。定义和初始化。2.2.操作数可以是字符串操作数可以是字符串MSGSTR1STR2STR341H48H6FH77H20H61H72H65H20H79H6FH75H3FH41H42H42H41H2022-10-1929汇编语言程序设计汇编语言程序设计数据定义语句数据定义语句 例例33ABCABCDBDB12H,?,?,?,012H,?,?,?,0DEFDEFDWDW?,569H?,569HGHIGHIDDDD678H,?678H,?汇编时汇编时,在相应的存储单元中存在相应的存储单元中存入数据。如右图所示。入数据。如右图所示。
23、注意:保留空单元就是不赋初注意:保留空单元就是不赋初值,并不是赋值,并不是赋0 0值。值。3.3.操作数为操作数为“?”,保留空单元,保留空单元ABCDEFGHI12H?00H?69H05H78H06H00H00H?2022-10-1930汇编语言程序设计汇编语言程序设计数据定义语句数据定义语句格式:格式:CNT DUP(OPR1,OPR2,CNT DUP(OPR1,OPR2,)其中,其中,CNTCNT为重复次数,常数。为重复次数,常数。例例44ARY1ARY1 DBDB2 DUP(0,1,2,?)2 DUP(0,1,2,?)ARY2ARY2 DBDB1,3 DUP(1,0,2 DUP(6,?
24、),5)1,3 DUP(1,0,2 DUP(6,?),5)ARY3ARY3 DBDB10H,2 DUP(0,2 DUP(1,2,3),?)10H,2 DUP(0,2 DUP(1,2,3),?)ARY4ARY4 DBDB128 DUP(?)128 DUP(?)其中其中ARY3ARY3称为嵌套称为嵌套DUP,DUP,汇编时汇编时,在相应的存在相应的存储单元中存入数据如右图所示。储单元中存入数据如右图所示。4.4.操作数字段使用重复操作符操作数字段使用重复操作符DUPDUPARY310H0123123?0123123?2022-10-1931汇编语言程序设计汇编语言程序设计数据定义语句数据定义语句用
25、用DWDW可以把变量或标号的偏移地址存人存储器可以把变量或标号的偏移地址存人存储器用用DWDW可以把变量或标号的整个地址存人存储器可以把变量或标号的整个地址存人存储器 例例55ADDRADDRDWDWNUMNUM;偏移地址偏移地址NUMNUMDBDB12H,56H12H,56HADDBADDBDDDDBRANCHBRANCH;偏移地址偏移地址,段地址段地址:BRABCH:BRABCH:CMPCMPAX,0AX,05.5.操作数也可以为地址操作数也可以为地址2022-10-1932汇编语言程序设计汇编语言程序设计汇编语言程序设计 第四章 汇编语言程序格式数据定义语句数据定义语句数据定义语句前面的
26、变量的值是该语句中数据定义语句前面的变量的值是该语句中第一个数据项在当前段内的第一个字节的偏移第一个数据项在当前段内的第一个字节的偏移地址地址。每个存储单元与一种。每个存储单元与一种类型类型联系。联系。例例4.64.6OPER1OPER1DBDB12H12H,34H34HOPER2OPER2DWDW78H78H,56H56H:MOVMOVALAL,OPER1+1OPER1+1;AL=34HAL=34HMOVMOVAXAX,OPER2+1OPER2+1;AX=5600HAX=5600HMOVMOVOPRE1+1OPRE1+1,0 0;B BMOVMOVALAL,BYTE PTR OPER2BYT
27、E PTR OPER2;AL=78HAL=78H12H34H78H00H56H00HOPER1OPER22022-10-1933汇编语言程序设计2022-10-19汇编语言程序设计345.3 MASM的基本伪指令段定义语句主要有:段定义语句主要有:SEGMENTSEGMENT和和ENDSENDSASSUMEASSUMEORGORG三、段定义语句三、段定义语句实模式下存储器是分段的,所以实模式下存储器是分段的,所以需要有段定义语句按段来组织程序和需要有段定义语句按段来组织程序和使用存储器。使用存储器。段定义语句段定义语句SEGMENTSEGMENT、ENDSENDS成对出现成对出现功能功能把汇编
28、语言源程序分成段,相当把汇编语言源程序分成段,相当于存储器段。有代码段、数据段、附于存储器段。有代码段、数据段、附加段、堆栈段。加段、堆栈段。代码段中,存放指令、伪指令、代码段中,存放指令、伪指令、宏指令。宏指令。其它段中,存放伪指令。其它段中,存放伪指令。2022-10-1935汇编语言程序设计汇编语言程序设计SEGMENTSEGMENT、ENDSENDS格式格式段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别:段名段名 ENDS其中:其中:定位类型:定位类型:PAGE、PARA、WORD、BYTE组合类型:组合类型:PRIVATE、PUBLIC、STACK、COMMO
29、N、MEMORY、AT 表达式表达式类别类别:连接时组成段组的名字。:连接时组成段组的名字。2022-10-1936汇编语言程序设计汇编语言程序设计SEGMENTSEGMENT、ENDSENDSMYDATA SEGMENTPARAPUBLIC DATA XDB12HYDB34HZDB?MYDATAENDSMYSTACKSEGMENTPARASTACK STACKDB64 DUP(?)MYSTACKENDSCODE1SEGMENTASSUMECS:CODE1,DS:MYDATA,SS:MYSTACK:MOVAL,XADDAL,YMOVZ,AL:CODE1ENDS2022-10-1937汇编语言程
30、序设计汇编语言程序设计ASSUMEASSUME语句语句格式格式ASSUME段寄存器段寄存器:段名段名,段寄存器段寄存器:段名段名,其中:其中:段寄存器必须是段寄存器必须是CS、DS、ES、SS中的一个;中的一个;段名必须是由段名必须是由SEGMENT定义的段名;定义的段名;ASSUME NOTHING可取消前面由可取消前面由ASSUME所所指定的段寄存器。指定的段寄存器。例如:例如:ASSUME CS:CODE,DS:DATA,SS:STACK2022-10-1938汇编语言程序设计汇编语言程序设计ASSUMEASSUME语句语句功能功能ASSUMEASSUME语句指定某个段分配给语句指定某个
31、段分配给哪个段寄存器,明确段和段寄存器哪个段寄存器,明确段和段寄存器之间的关系,使汇编程序在汇编指之间的关系,使汇编程序在汇编指令时知道各段寄存器的值。令时知道各段寄存器的值。同时可以在指令中省掉许多同时可以在指令中省掉许多段段超越超越前缀,即使前缀,即使段约定段约定得以实现。得以实现。2022-10-1939汇编语言程序设计汇编语言程序设计ASSUMEASSUME语句语句说明说明1.1.ASSUMEASSUME语句如果一行写不下,分行语句如果一行写不下,分行写时需再次使用写时需再次使用ASSUMEASSUME语句,如:语句,如:ASSUME CS:MYCODEASSUME CS:MYCODE
32、,DS:MYDATADS:MYDATAASSUME SS:STACKASSUME SS:STACK2.ASSUME2.ASSUME分配段寄存器,但并不能把分配段寄存器,但并不能把段地址装入段寄存器段地址装入段寄存器,所以在代码段中所以在代码段中,还必须把段地址装入相应的段寄存器。还必须把段地址装入相应的段寄存器。2022-10-1940汇编语言程序设计汇编语言程序设计装填段地址装填段地址MYDATA SEGMENT BUFDB12HMYDATAENDSMYSTACKSEGMENTPARASTACK STACKDW64 DUP(?)TOSLABEL WORDMYSTACKENDSCODE1SEG
33、MENTASSUMECS:CODE1,DS:MYDATA,SS:MYSTACKSTART:MOVAX,MYDATAMOVDS,AX;装填;装填DSMOVAX,MYSTACKMOVSS,AX;装填;装填SSMOVSP,TOS:;CS不用装,由系统自动完成。不用装,由系统自动完成。CODE1ENDS2022-10-1941汇编语言程序设计汇编语言程序设计其它说明其它说明1.1.如果完整定义堆栈段,可以不用装填如果完整定义堆栈段,可以不用装填SSSS和和SPSP。MYSTACKSEGMENTPARA STACK STACKDW64 DUP(?)MYSTACKENDS2.2.如果如果DSDS、ESES
34、没有用没有用ASSUMEASSUME说明,则在访说明,则在访问数据时需加段前缀。问数据时需加段前缀。2022-10-1942汇编语言程序设计汇编语言程序设计MYDATA SEGMENT XDB12HMYDATAENDSMYEXTRA SEGMENT YDB?MYEXTRAENDSCODE1SEGMENTASSUMECS:CODE1;没有说明没有说明DS、ESSTART:MOV AX,MYDATAMOV DS,AX;装填;装填DSMOV AX,MYEXTRAMOV ES,AX;装填;装填ESMOV AL,DS:XMOV ES:Y,AL:CODE1ENDS2022-10-1943汇编语言程序设计汇
35、编语言程序设计其它说明其它说明3.3.段内偏移地址从段内偏移地址从“段名段名 SEGMENTSEGMENT”以下以下,以以0000H0000H开始开始,每分配一个单元每分配一个单元,偏移地址加偏移地址加1 1。DATADATA SEGMENTSEGMENTX XDBDB12H12HY YDWDW34H34HZ ZDDDD56H56HDATADATA ENDSENDSX X的偏移地址为的偏移地址为0000H0000HY Y的偏移地址为的偏移地址为0001H0001HZ Z的偏移地址为的偏移地址为0003H0003H4.4.为了给存储单元设置起始偏移地址为了给存储单元设置起始偏移地址,可以使用可以
36、使用ORGORG命令命令。2022-10-1944汇编语言程序设计汇编语言程序设计ORGORG语句语句格式格式ORGORG表达式表达式其中,其中,表达式必须是一个可以计算得到正整数,表达式必须是一个可以计算得到正整数,数值范围是数值范围是065535。DATADATA SEGMENTSEGMENTORGORG 100H100HX XDBDB12H12HY YDWDW34H34HZ ZDDDD56H56HDATADATA ENDSENDS这样,由于用这样,由于用ORGORG指令重新设置指令重新设置DATADATA段的起始偏移段的起始偏移地址,所以,地址,所以,X X单元的偏移地址为单元的偏移地址
37、为0100H0100H、Y Y单元的单元的偏移地址为偏移地址为0101H0101H、Z Z单元的偏移地址为单元的偏移地址为0103H0103H。2022-10-1945汇编语言程序设计汇编语言程序设计2022-10-19汇编语言程序设计465.3 MASM的基本伪指令四、过程定义语句四、过程定义语句过程又称子程序,是程序的一部过程又称子程序,是程序的一部分,可以被程序调用。分,可以被程序调用。调用过程和从过程返回的指令是调用过程和从过程返回的指令是CALLCALL和和RETRET,可以是段内的和段间的。,可以是段内的和段间的。段定义语句是:段定义语句是:PROCPROC和和ENDPENDP需成
38、对使用需成对使用PROCPROC、ENDPENDP格式格式过程名过程名 PROC 属性属性:过程名过程名ENDP其中:其中:属性字段可以是属性字段可以是NEARNEAR或或FARFAR;NEARNEAR表示是表示是段内段内CALLCALL指令调用的过程,并且指令调用的过程,并且用段内的用段内的RETRET指令返回,该过程是指令返回,该过程是NEARNEAR过程;过程;FARFAR表示是表示是段间段间CALLCALL指令调用的过程,并且用指令调用的过程,并且用段间的段间的RETRET指令返回,该过程是指令返回,该过程是FARFAR过程;过程;如果不说明属性,默认为如果不说明属性,默认为NEARN
39、EAR型。型。2022-10-1947汇编语言程序设计汇编语言程序设计PROCPROC、ENDPENDP例例MYCODESEGMENTUPCOUNTPROCNEARADDCX,1RET;段内返回;段内返回UPCOUNTENDPSTART:CALLUPCOUNT;段内调用;段内调用:CALLUPCOUNT;段内调用;段内调用:MYCODEENDSENDSTART2022-10-1948汇编语言程序设计汇编语言程序设计2022-10-19汇编语言程序设计495.3 MASM的基本伪指令五、程序开始和结束语句五、程序开始和结束语句用在程序开始用在程序开始NAMENAME给模块取名给模块取名TITLE
40、TITLE指定每页上的打印标题指定每页上的打印标题结束语句结束语句ENDEND表示源程序结束表示源程序结束NAMENAME和和TITLETITLE功能功能在程序的开始用在程序的开始用NAMENAME或或TITLETITLE为模块取名。为模块取名。格式格式NAMENAMEmodulenamemodulenameTITLETITLEtexttext 其中:其中:modulenamemodulename为模块名;为模块名;texttext标题最多可用标题最多可用6060个字符,如果程序中没有个字符,如果程序中没有NAMENAME伪指令,则将伪指令,则将texttext的前的前6 6个字符作为模块名;
41、个字符作为模块名;如果程序中既没有如果程序中既没有NAMENAME又无又无TITLETITLE伪指令,则伪指令,则汇编程序将源程序名作为模块名。汇编程序将源程序名作为模块名。2022-10-1950汇编语言程序设计汇编语言程序设计结束语句结束语句ENDEND功能功能表示源程序结束表示源程序结束格式格式ENDEND labellabel其中:其中:标号标号labellabel指示程序开始执行的指示程序开始执行的起始地址的标号;起始地址的标号;只有主程序要使用标号。只有主程序要使用标号。2022-10-1951汇编语言程序设计汇编语言程序设计结束语句结束语句ENDEND 例例5.35.3 EP50
42、3.ASMEP503.ASM求两数和的绝对值。求两数和的绝对值。在例中,在例中,TITLETITLE给出标题,给出标题,END STARTEND START表示程序结束,汇编表示程序结束,汇编程序将在遇到程序将在遇到ENDEND时结束汇编,时结束汇编,而程序将从而程序将从STARTSTART开始执行。开始执行。2022-10-1952汇编语言程序设计汇编语言程序设计2022-10-19汇编语言程序设计53第5章 汇编语言程序设计初步5.4 常数、变量和标号常数、变量和标号指令语句指令语句标号标号:操作码操作码操作数操作数,操作数操作数;注释;注释伪指令语句伪指令语句符号符号 定义符定义符参数参
43、数1,,参数,参数n;注释;注释宏指令语句宏指令语句 标号标号:宏指令名宏指令名 参数参数1,,参数,参数n;注释;注释名字项操作项操作数项注释项1.名字项名字项 标号标号在代码段中定义,后跟冒号。在代码段中定义,后跟冒号。在转移指令或在转移指令或CALLCALL指令的操作数字指令的操作数字段出现。段出现。变量变量在除代码段以外的其它段中定义。在除代码段以外的其它段中定义。在操作数字段出现。在操作数字段出现。有效名字:字母、数字、特殊字符(有效名字:字母、数字、特殊字符(_?等)组成等)组成不能使用保留字(指令助记符、伪指令名、寄存器名)不能使用保留字(指令助记符、伪指令名、寄存器名)2022
44、-10-1954汇编语言程序设计汇编语言程序设计变量与标号变量与标号 相同相同表示语句的符号地址表示语句的符号地址不同不同标号表示指令的地址。标号表示指令的地址。变量表示数据的地址。变量表示数据的地址。冒号的区别冒号的区别2022-10-1955汇编语言程序设计汇编语言程序设计标号的三个属性标号的三个属性 段属性段属性标号的段地址,在标号的段地址,在CSCS中。中。偏移属性偏移属性标号的偏移地址,标号的偏移地址,1616位的位的无符号数。无符号数。类型属性类型属性NEARNEAR表示段内引用;表示段内引用;FARFAR表示段间引用。表示段间引用。冒号的区别冒号的区别2022-10-1956汇编
45、语言程序设计汇编语言程序设计变量的三个属性变量的三个属性 段属性段属性变量的段地址,在一个段寄存器中。变量的段地址,在一个段寄存器中。偏移属性偏移属性变量的偏移地址,是变量的偏移地址,是1616位的无符号数。位的无符号数。类型属性类型属性表示该变量所保留的字节数。表示该变量所保留的字节数。BYTEBYTE(1 1)WORDWORD(2 2)DWORDDWORD(4 4)DQDQ(8 8)、)、DTDT(1010)2022-10-1957汇编语言程序设计汇编语言程序设计2.操作码项操作码项 可以是指令、伪指令、宏指令的助记符可以是指令、伪指令、宏指令的助记符对于指令,汇编程序将其汇编成机器指令;
46、对于指令,汇编程序将其汇编成机器指令;对于伪指令,汇编程序将按其功能进行处理;对于伪指令,汇编程序将按其功能进行处理;对于宏指令,汇编程序将根据其定义展开。对于宏指令,汇编程序将根据其定义展开。2022-10-1958汇编语言程序设计汇编语言程序设计3.操作数项操作数项 由一个或多个表达式组成,多个操由一个或多个表达式组成,多个操作数项之间一般用逗号分开。作数项之间一般用逗号分开。操作数项可以是操作数项可以是常数常数、寄存器、标、寄存器、标号、变量,或由号、变量,或由表达式表达式组成。组成。2022-10-1959汇编语言程序设计汇编语言程序设计常数(常量)常数(常量)(1)(1)数字常数数字
47、常数二进制数:以字母二进制数:以字母B结尾,如结尾,如10110011B十进制数:以字母十进制数:以字母D结尾,如结尾,如1234D 或无字母结尾,如或无字母结尾,如1234十六进制数:以字母十六进制数:以字母H结尾,如结尾,如3AE5H注意:十六进制数以字母注意:十六进制数以字母AF开头时,前开头时,前面补面补0,如,如0A0B6H,0F0H。2022-10-1960汇编语言程序设计汇编语言程序设计常数(常量)常数(常量)(2)(2)字符串常数字符串常数由单引号内的由单引号内的1至至2以上以上ASCII字符构成。字符构成。如:如:MOVAL,AMOVBX,ABSTRDBHello2022-1
48、0-1961汇编语言程序设计汇编语言程序设计常数(常量)常数(常量)(3)(3)符号常数符号常数由由EQU定义过的符号名。定义过的符号名。如:如:MOVCX,COUNT2022-10-1962汇编语言程序设计汇编语言程序设计表达式表达式 表达式则由常数、寄存器、标表达式则由常数、寄存器、标号、变量与一些号、变量与一些运算符和操作符运算符和操作符及及括号组合而成。括号组合而成。有数字表达式和地址表达式两有数字表达式和地址表达式两种。种。5类常用的运算符和操作符。类常用的运算符和操作符。2022-10-1963汇编语言程序设计汇编语言程序设计运算符与操作符运算符与操作符 (1)(1)算术运算符算术
49、运算符+、-、*、/、MODMOD例如:例如:MOVMOV DXDX,BLOCK+(6-1)BLOCK+(6-1)2 2MOVMOV CXCX,(END-ARRAY)/2(END-ARRAY)/22022-10-1964汇编语言程序设计汇编语言程序设计运算符与操作符运算符与操作符 (2)(2)逻辑运算符逻辑运算符ANDAND、OROR、NOTNOT、XORXOR例如:例如:MOVMOV DXDX,PORT_VAL PORT_VAL OROR 30H 30HANDAND CXCX,ARRAYARRAYAND AND OFEHOFEH2022-10-1965汇编语言程序设计汇编语言程序设计运算符与
50、操作符运算符与操作符 (3)(3)关系运算符关系运算符EQEQ、NENE、LTLT、GTGT、LELE、GEGE关系运算符要求的两个操作数必须都为数字或是关系运算符要求的两个操作数必须都为数字或是同一段内的两个存储器地址。结果为真表示为全同一段内的两个存储器地址。结果为真表示为全1 1,结果为假表示为结果为假表示为0 0。例如:例如:MOVMOVBXBX,VAL EQ 5;VAL EQ 5;当当VALVAL等于等于5 5时,时,BX=0FFFFHBX=0FFFFHMOVMOVAXAX,(X LE Y)AND X)+(Y LT X)AND Y)(X LE Y)AND X)+(Y LT X)AND