《第5章汇编语言程序设计初步课件.ppt》由会员分享,可在线阅读,更多相关《第5章汇编语言程序设计初步课件.ppt(96页珍藏版)》请在三一办公上搜索。
1、,2023/1/11,汇编语言程序设计,1,5.1 概述5.2 汇编语言程序框架结构5.3 MASM的基本伪指令5.4 常数、变量和标号5.5 宏指令5.6 段定义的简化,第5章 汇编语言程序设计初步,2022/9/24汇编语言程序设计15.1 概述第5章,2023/1/11,汇编语言程序设计,2,第5章 汇编语言程序设计初步,汇编语言是用指令助记符和符号地址来编写程序汇编程序将源源程序汇编成二进制代码汇编语言包括:指令助记符、数据和存放数据的变量、标号、伪指令,及相应的使用规则。源程序中一条汇编指令或伪指令均占一行指令语句:标号:助记符 Op1,Op2,;注释伪指令语句:符号 伪指令助记符
2、Op1,Op2,;注释,5.1 概述,2022/9/24汇编语言程序设计2第5章 汇编语言程序设计,2023/1/11,汇编语言程序设计,3,1.用编辑程序,如EDIT建立.ASM源程序;2.用汇编程序MASM把.ASM文件汇编成.OBJ文件;3.用连接程序LINK把.OBJ文件连接成.EXE文件;4.在DOS下直接键入可执行文件名即可运行该程序。5.用调试程序DEBUG调试该程序。,运行汇编语言程序的步骤:,5.1 概述,2022/9/24汇编语言程序设计31.用编辑程序,如EDI,2023/1/11,汇编语言程序设计,4,运行汇编语言程序的步骤:,5.1 概述,2022/9/24汇编语言程
3、序设计4运行汇编语言程序的步骤:,2023/1/11,汇编语言程序设计,5,1编辑,输入源程序;对源程序进行修改。,一定要用“纯文本”格式来储存源程序文件,否则无法汇编。产生的源程序文件应该以“.ASM”或“.TXT”为扩展名,最好使用“.ASM”扩展名。,编辑软件可以用记事本(Notepad)、Word以及命令行方式下的Edit。,5.1 概述,2022/9/24汇编语言程序设计51编辑 输入源程序;一,2023/1/11,汇编语言程序设计,6,2汇编,Microsoft公司的MASM(Macro Assembler)Borland公司的TASM(Turbo Assembler),常用的汇编
4、工具:,汇编阶段的任务是把汇编语言源程序“翻译”成为机器代码(称为“目标”),产生二进制的“目标文件”。,5.1 概述,2022/9/24汇编语言程序设计62汇编 Microso,2023/1/11,汇编语言程序设计,7,3连接,把几个程序模块产生的目标文件连接成一个完整的可执行程序;把“子程序库”中的子程序连接到程序中去。,如果程序里没有定义堆栈段,连接过程会产生警告信息“No stack”。如果程序比较小,这个警告信息不影响连接产生的可执行程序的使用。,连接阶段主要完成的操作是:,5.1 概述,2022/9/24汇编语言程序设计73连接把几个程序模块产,2023/1/11,汇编语言程序设计
5、,8,4运行和调试,“MYPRG1”,扩展名“.EXE”可以省略。如果同时存在文件MYPGM.EXE和MYPGM.COM,上面 的命令将执行程序MYPRG.COM而不是MYPGM.EXE。如果同时存在文件MYPGM.EXE和MYPGM.COM,执行 程序MYPGM.EXE时,需要在命令行打入它的全名。,由TLINK产生的“.EXE”或者“.COM”文件可以直接执行。,5.1 概述,2022/9/24汇编语言程序设计84运行和调试“MYPR,2023/1/11,汇编语言程序设计,9,汇编语言程序不包含输出结果的相关指令,操作者无法看到程序的运行结果。程序能够运行,但是不能得到预想的结果。,发生以
6、下两种情况之一的,需要对程序进行“调试”。,DEBUG MYPRG1.EXE TD MYPRG1,5.1 概述,2022/9/24汇编语言程序设计9 汇编语言程序不包含输,2023/1/11,汇编语言程序设计,10,第5章 汇编语言程序设计初步,5.2 源程序的基本框架结构,汇编语言程序对内存是分段使用的,一般情况下,内存被分为三种类型区:堆栈段区CS指向正当前运行的代码段数据段区DS指向当前的数据段代码段区SS指向当前的堆栈段,下面以一个简单的程序例子,来介绍汇编语言程序的基本框架结构。,2022/9/24汇编语言程序设计10第5章 汇编语言程序设,2023/1/11,汇编语言程序设计,11
7、,5.2源程序的基本框架结构,_STACKSEGMENT STACK STACK;定义堆栈段DB 256 DUP(0);堆栈区长度256字节_STACKENDS;堆栈段定义结束_DATASEGMENT;定义数据段MsgDBHello,World!,13,10,$_DATAENDS;数据段定义结束_TEXTSEGMENTCODE;定义代码段ASSUME CS:_TEXT,DS:_DATA,SS:_STACKStart:MOVAX,_DATA;取数据内存区段地址MOVDS,AX;设置数据段寄存器MOVDX,Offset MsgMOVAH,9INT21h;中断21h的9号功能,显示字符串MOVAX,
8、4C00hINT21h;运行结束,返回DOS_TEXTENDS;代码段定义结束ENDStart;源程序到此为止,2022/9/24汇编语言程序设计115.2源程序的基本框架,2023/1/11,汇编语言程序设计,12,5.2源程序的基本框架结构,1.内存的分段使用,完整的源程序应有:,(1)代码段至少有一个代码段,代码段含有指令,也可以含有伪指令和宏指令。(2)数据段为数据提供内存区。通常在数据段中定义变量、常量等。(3)堆栈段定义并分配供堆栈使用的内存区。如果没有堆栈段,仍可以使用系统提供的16个字节的堆栈空间。,2022/9/24汇编语言程序设计125.2源程序的基本框架,2023/1/1
9、1,汇编语言程序设计,13,5.2源程序的基本框架结构,2.源程序的结束与执行入口,完整的源程序应有:,(1)END为结束语句,表示源程序到此结束。(2)END后面可附带一个在程序中已定义的标号,用以说明程序的在调入时开始执行的第一条指令所在位置。源程序是一个独立的程序或主模块,那么伪指令END后面必须附带一个标号;源程序仅是一个普通模块,那么其END后面就不能附带标号,2022/9/24汇编语言程序设计135.2源程序的基本框架,2023/1/11,汇编语言程序设计,14,5.2源程序的基本框架结构,3.其它,完整的源程序应有:,(1)ASSUME语句ASSUME语句说明各分段与段寄存器之间
10、的对应关系。(2)装填DS、ES、SS必须装填DS、ES和SS,CS则由系统装填。只要定义完整,SS也可以由系统装。(3)返回DOS 运行于操作系统下的汇编语言程序,须在程序中通过操作系统的相关功能调用来结束其运行。,2022/9/24汇编语言程序设计145.2源程序的基本框架,2023/1/11,汇编语言程序设计,15,5.2源程序的基本框架结构,例5.1EP501.ASM 在显示器上输出文字“Hello,World!”。注意输出文字定义在代码段中。,2022/9/24汇编语言程序设计155.2源程序的基本框架,2023/1/11,汇编语言程序设计,16,5.2源程序的基本框架结构,例5.2
11、EP502.ASM 用BCD数进行运算:12345678+33445566。注意高地址高字节、低地址低字节存放。,2022/9/24汇编语言程序设计165.2源程序的基本框架,2023/1/11,汇编语言程序设计,17,5.2源程序的基本框架结构,NAME模块名符号定义区(EQU)EXTRN外部变量说明PUBLIC公共变量说明数据段附加段堆栈段代码段,汇编语言源程序的一般结构:,2022/9/24汇编语言程序设计175.2源程序的基本框架,数据段名SEGMENT变量定义数据空间预置数据段名ENDS堆栈段名SEGMENT PARA STACK STACK堆栈空间预置堆栈段名ENDS代码段名SEG
12、MENTASSUME段寄存器地址说明START:段地址装填主程序体返回DOS代码段名ENDSENDSTART,2023/1/11,18,汇编语言程序设计,数据段名SEGMENT2022/9/2418汇编语言程序设,代码段名SEGMENTASSUMEDS:数据段名,CS:代码段名ASSUMESS:堆栈段名START:MOVAX,数据段名MOVDS,AX主程序体MOVAH,4CHINT21H代码段名ENDSENDSTART,由于返回DOS的方法不同,代码段的结构有两种:,2023/1/11,19,汇编语言程序设计,代码段名SEGMENT由于返回DOS的方法不同,代码段的结,代码段名SEGMENTA
13、SSUMEDS:数据段名,CS:代码段名ASSUMESS:堆栈段名MAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,数据段名MOVDS,AX主程序体RETMAINENDP代码段名ENDSENDMAIN,2023/1/11,20,汇编语言程序设计,代码段名SEGMENT2022/9/2420汇编语言程序设,2023/1/11,汇编语言程序设计,21,第5章 汇编语言程序设计初步,5.3 MASM的基本伪指令,一、符号定义二、数据定义三、段定义四、过程定义五、开始和结束语句六、其它伪操作,2022/9/24汇编语言程序设计21第5章 汇编语言程序设,2023/1/11,汇编语
14、言程序设计,22,5.3 MASM的基本伪指令,1.等值语句 EQU2.等号语句=3.解除语句 PURGE,一.符号定义语句,2022/9/24汇编语言程序设计225.3 MASM的基,等值语句 EQU,格式nameEQUexpression功能给符号名定义一个常数值,可以求出常数值的表达式,已定义的别的符号名,或有效的助记符。例如CONSTANTEQU128ALPHAEQU3BETAEQUALPHA+5MOVEEQUMOV,2023/1/11,23,汇编语言程序设计,等值语句 EQU格式nameEQUexpression,等号语句=,格式name=expression功能同EQU语句类似。区
15、别EQU语句不允许重复定义=语句则允许重复定义,例如:EMP=8:EMP=EMP+1,注意:在同一源文件中,同一符号名不能同时使用EQU和“=”语句来分别定义。,2023/1/11,24,汇编语言程序设计,等号语句=格式name=expression例如注意,解除语句 PURGE,格式PURGE name1,name2,,nameN功能解除定义过的符号名。解除后的符号名可重新定义。,例如ALPHAEQU7BETAEQUALPHA-5PURGEALPHA,BETAALPHAEQU24,2023/1/11,25,汇编语言程序设计,解除语句 PURGE格式例如2022/9/2425汇编语言程,202
16、3/1/11,汇编语言程序设计,26,5.3 MASM的基本伪指令,DB伪指令:用来定义字节,其后的每个操作数占一个字节。DW字2字节DD双字4字节DQ四字8字节DT10字节,二.数据定义语句,为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,并可以赋初值。,2022/9/24汇编语言程序设计265.3 MASM的基,数据定义语句,格式:变量名DB 操作数1,操作数2,;注释变量名DW 操作数1,操作数2,;注释:其中,操作数字段可以是各种形式的数据,存入指定的存储单元;也可以只分配存储空间,而不存入确定的数据。,2023/1/11,27,汇编语言程序设计,数据定义语句格式:2022
17、/9/2427汇编语言程序设计,数据定义语句,例1BDATADB10,4,10HWDATADW100,100H,-5DDATADD3*20,0FFFDH汇编时,在相应的存储单元中存入数据。如右图所示。,1.操作数可以是常数或表达式,BDATAWDATADDATA,2023/1/11,28,汇编语言程序设计,数据定义语句例11.操作数可以是常数或表达式BDATA2,数据定义语句,例2MSGDBASTR1DBHow are you?STR2DBABSTR3DWAB汇编时,在相应的存储单元中存入数据。如右图所示。注意:两个以上字符的字符串只能用DB定义和初始化。,2.操作数可以是字符串,MSGSTR
18、1STR2STR3,2023/1/11,29,汇编语言程序设计,数据定义语句例22.操作数可以是字符串MSG2022/9,数据定义语句,例3ABCDB12H,?,?,?,0DEFDW?,569HGHIDD678H,?汇编时,在相应的存储单元中存入数据。如右图所示。注意:保留空单元就是不赋初值,并不是赋0值。,3.操作数为“?”,保留空单元,ABCDEFGHI,2023/1/11,30,汇编语言程序设计,数据定义语句例33.操作数为“?”,保留空单元ABC20,数据定义语句,格式:CNT DUP(OPR1,OPR2,)其中,CNT为重复次数,常数。例4ARY1DB2 DUP(0,1,2,?)AR
19、Y2DB1,3 DUP(1,0,2 DUP(6,?),5)ARY3DB10H,2 DUP(0,2 DUP(1,2,3),?)ARY4DB128 DUP(?)其中ARY3称为嵌套DUP,汇编时,在相应的存储单元中存入数据如右图所示。,4.操作数字段使用重复操作符DUP,ARY3,2023/1/11,31,汇编语言程序设计,数据定义语句格式:CNT DUP(OPR1,OPR2,),数据定义语句,用DW可以把变量或标号的偏移地址存人存储器用DW可以把变量或标号的整个地址存人存储器例5ADDRDWNUM;偏移地址NUMDB12H,56HADDBDDBRANCH;偏移地址,段地址:BRABCH:CMPA
20、X,0,5.操作数也可以为地址,2023/1/11,32,汇编语言程序设计,数据定义语句用DW可以把变量或标号的偏移地址存人存储器5.操,汇编语言程序设计 第四章 汇编语言程序格式,数据定义语句,数据定义语句前面的变量的值是该语句中第一个数据项在当前段内的第一个字节的偏移地址。每个存储单元与一种类型联系。例4.6OPER1DB12H,34HOPER2DW78H,56H:MOVAL,OPER1+1;AL=34HMOVAX,OPER2+1;AX=5600HMOVOPRE1+1,0;BMOVAL,BYTE PTR OPER2;AL=78H,OPER1OPER2,2023/1/11,33,汇编语言程序
21、设计,汇编语言程序设计 第四章 汇,2023/1/11,汇编语言程序设计,34,5.3 MASM的基本伪指令,段定义语句主要有:SEGMENT和ENDSASSUMEORG,三、段定义语句,实模式下存储器是分段的,所以需要有段定义语句按段来组织程序和使用存储器。,2022/9/24汇编语言程序设计345.3 MASM的基,段定义语句SEGMENT、ENDS,成对出现功能把汇编语言源程序分成段,相当于存储器段。有代码段、数据段、附加段、堆栈段。代码段中,存放指令、伪指令、宏指令。其它段中,存放伪指令。,2023/1/11,35,汇编语言程序设计,段定义语句SEGMENT、ENDS成对出现2022/
22、9/24,SEGMENT、ENDS,格式段名 SEGMENT 定位类型 组合类型 类别:段名 ENDS其中:定位类型:PAGE、PARA、WORD、BYTE组合类型:PRIVATE、PUBLIC、STACK、COMMON、MEMORY、AT 表达式类别:连接时组成段组的名字。,2023/1/11,36,汇编语言程序设计,SEGMENT、ENDS格式2022/9/2436汇编语言程,SEGMENT、ENDS,MYDATA SEGMENTPARAPUBLIC DATA XDB12HYDB34HZDB?MYDATAENDSMYSTACKSEGMENTPARASTACK STACKDB64 DUP(?
23、)MYSTACKENDSCODE1SEGMENTASSUMECS:CODE1,DS:MYDATA,SS:MYSTACK:MOVAL,XADDAL,YMOVZ,AL:CODE1ENDS,2023/1/11,37,汇编语言程序设计,SEGMENT、ENDSMYDATA SEGMENTPA,ASSUME语句,格式ASSUME段寄存器:段名,段寄存器:段名,其中:段寄存器必须是CS、DS、ES、SS中的一个;段名必须是由SEGMENT定义的段名;ASSUME NOTHING可取消前面由ASSUME所指定的段寄存器。例如:ASSUME CS:CODE,DS:DATA,SS:STACK,2023/1/11
24、,38,汇编语言程序设计,ASSUME语句格式2022/9/2438汇编语言程序设计,ASSUME语句,功能ASSUME语句指定某个段分配给哪个段寄存器,明确段和段寄存器之间的关系,使汇编程序在汇编指令时知道各段寄存器的值。同时可以在指令中省掉许多段超越前缀,即使段约定得以实现。,2023/1/11,39,汇编语言程序设计,ASSUME语句功能2022/9/2439汇编语言程序设计,ASSUME语句,说明1.ASSUME语句如果一行写不下,分行写时需再次使用ASSUME语句,如:ASSUME CS:MYCODE,DS:MYDATAASSUME SS:STACK2.ASSUME分配段寄存器,但并
25、不能把段地址装入段寄存器,所以在代码段中,还必须把段地址装入相应的段寄存器。,2023/1/11,40,汇编语言程序设计,ASSUME语句说明2022/9/2440汇编语言程序设计,装填段地址,MYDATA SEGMENT BUFDB12HMYDATAENDSMYSTACKSEGMENTPARASTACK STACKDW64 DUP(?)TOSLABELWORDMYSTACKENDSCODE1SEGMENTASSUMECS:CODE1,DS:MYDATA,SS:MYSTACKSTART:MOVAX,MYDATAMOVDS,AX;装填DSMOVAX,MYSTACKMOVSS,AX;装填SSMOV
26、SP,TOS:;CS不用装,由系统自动完成。CODE1ENDS,2023/1/11,41,汇编语言程序设计,装填段地址MYDATA SEGMENT 2022/9/2,其它说明,1.如果完整定义堆栈段,可以不用装填SS和SP。MYSTACKSEGMENTPARA STACK STACKDW64 DUP(?)MYSTACKENDS2.如果DS、ES没有用ASSUME说明,则在访问数据时需加段前缀。,2023/1/11,42,汇编语言程序设计,其它说明1.如果完整定义堆栈段,可以不用装填SS和SP。20,MYDATA SEGMENT XDB12HMYDATAENDSMYEXTRA SEGMENT Y
27、DB?MYEXTRAENDSCODE1SEGMENTASSUMECS:CODE1;没有说明DS、ESSTART:MOVAX,MYDATAMOVDS,AX;装填DSMOVAX,MYEXTRAMOVES,AX;装填ESMOVAL,DS:XMOVES:Y,AL:CODE1ENDS,2023/1/11,43,汇编语言程序设计,MYDATA SEGMENT 2022/9/2443汇编,其它说明,3.段内偏移地址从“段名 SEGMENT”以下,以0000H开始,每分配一个单元,偏移地址加1。DATASEGMENTXDB12HYDW34HZDD56HDATAENDSX的偏移地址为0000HY的偏移地址为00
28、01HZ的偏移地址为0003H4.为了给存储单元设置起始偏移地址,可以使用ORG命令。,2023/1/11,44,汇编语言程序设计,其它说明3.段内偏移地址从“段名 SEGMENT”以下,以0,ORG语句,格式ORG表达式其中,表达式必须是一个可以计算得到正整数,数值范围是065535。DATASEGMENTORG100HXDB12HYDW34HZDD56HDATAENDS这样,由于用ORG指令重新设置DATA段的起始偏移地址,所以,X单元的偏移地址为0100H、Y单元的偏移地址为0101H、Z单元的偏移地址为0103H。,2023/1/11,45,汇编语言程序设计,ORG语句格式ORG表达式
29、2022/9/2445,2023/1/11,汇编语言程序设计,46,5.3 MASM的基本伪指令,四、过程定义语句,过程又称子程序,是程序的一部分,可以被程序调用。调用过程和从过程返回的指令是CALL和RET,可以是段内的和段间的。段定义语句是:PROC和ENDP,需成对使用,2022/9/24汇编语言程序设计465.3 MASM的基,PROC、ENDP,格式过程名 PROC 属性:过程名ENDP其中:属性字段可以是NEAR或FAR;NEAR表示是段内CALL指令调用的过程,并且用段内的RET指令返回,该过程是NEAR过程;FAR表示是段间CALL指令调用的过程,并且用段间的RET指令返回,该
30、过程是FAR过程;如果不说明属性,默认为NEAR型。,2023/1/11,47,汇编语言程序设计,PROC、ENDP格式2022/9/2447汇编语言程序设计,PROC、ENDP,例MYCODESEGMENTUPCOUNTPROCNEARADDCX,1RET;段内返回UPCOUNTENDPSTART:CALLUPCOUNT;段内调用:CALLUPCOUNT;段内调用:MYCODEENDSENDSTART,2023/1/11,48,汇编语言程序设计,PROC、ENDP例2022/9/2448汇编语言程序设计,2023/1/11,汇编语言程序设计,49,5.3 MASM的基本伪指令,五、程序开始和
31、结束语句,用在程序开始NAME给模块取名TITLE指定每页上的打印标题结束语句END表示源程序结束,2022/9/24汇编语言程序设计495.3 MASM的基,NAME和TITLE,功能在程序的开始用NAME或TITLE为模块取名。格式NAMEmodulenameTITLEtext 其中:modulename为模块名;text标题最多可用60个字符,如果程序中没有NAME伪指令,则将text的前6个字符作为模块名;如果程序中既没有NAME又无TITLE伪指令,则汇编程序将源程序名作为模块名。,2023/1/11,50,汇编语言程序设计,NAME和TITLE功能2022/9/2450汇编语言程序
32、设,结束语句END,功能表示源程序结束格式ENDlabel其中:标号label指示程序开始执行的起始地址的标号;只有主程序要使用标号。,2023/1/11,51,汇编语言程序设计,结束语句END功能表示源程序结束2022/9/2451汇编,结束语句END,例5.3 EP503.ASM求两数和的绝对值。在例中,TITLE给出标题,END START表示程序结束,汇编程序将在遇到END时结束汇编,而程序将从START开始执行。,2023/1/11,52,汇编语言程序设计,结束语句END例5.3 EP503.ASM2022/9,2023/1/11,汇编语言程序设计,53,第5章 汇编语言程序设计初步
33、,5.4 常数、变量和标号,指令语句标号:操作码操作数,操作数;注释伪指令语句符号 定义符参数1,,参数n;注释宏指令语句 标号:宏指令名 参数1,,参数n;注释,名字项操作项操作数项注释项,2022/9/24汇编语言程序设计53第5章 汇编语言程序设,1.名字项,标号在代码段中定义,后跟冒号。在转移指令或CALL指令的操作数字段出现。变量在除代码段以外的其它段中定义。在操作数字段出现。,有效名字:字母、数字、特殊字符(_?等)组成不能使用保留字(指令助记符、伪指令名、寄存器名),2023/1/11,54,汇编语言程序设计,1.名字项 标号有效名字:字母、数字、特殊字符(_,变量与标号,相同表
34、示语句的符号地址不同标号表示指令的地址。变量表示数据的地址。,冒号的区别,2023/1/11,55,汇编语言程序设计,变量与标号 相同冒号的区别2022/9/2455汇编语言,标号的三个属性,段属性标号的段地址,在CS中。偏移属性标号的偏移地址,16位的无符号数。类型属性NEAR表示段内引用;FAR表示段间引用。,冒号的区别,2023/1/11,56,汇编语言程序设计,标号的三个属性 段属性冒号的区别2022/9/2456汇,变量的三个属性,段属性变量的段地址,在一个段寄存器中。偏移属性变量的偏移地址,是16位的无符号数。类型属性表示该变量所保留的字节数。BYTE(1)WORD(2)DWORD
35、(4)DQ(8)、DT(10),2023/1/11,57,汇编语言程序设计,变量的三个属性 段属性2022/9/2457汇编语言程序,2.操作码项,可以是指令、伪指令、宏指令的助记符,对于指令,汇编程序将其汇编成机器指令;对于伪指令,汇编程序将按其功能进行处理;对于宏指令,汇编程序将根据其定义展开。,2023/1/11,58,汇编语言程序设计,2.操作码项 可以是指令、伪指令、宏指令的助记符对于指令,3.操作数项,由一个或多个表达式组成,多个操作数项之间一般用逗号分开。,操作数项可以是常数、寄存器、标号、变量,或由表达式组成。,2023/1/11,59,汇编语言程序设计,3.操作数项 由一个或
36、多个表达式组成,多个操作数项之间,常数(常量),(1)数字常数,二进制数:以字母B结尾,如10110011B十进制数:以字母D结尾,如1234D 或无字母结尾,如1234十六进制数:以字母H结尾,如3AE5H注意:十六进制数以字母AF开头时,前面补0,如0A0B6H,0F0H。,2023/1/11,60,汇编语言程序设计,常数(常量)(1)数字常数二进制数:以字母B结尾,如10,常数(常量),(2)字符串常数,由单引号内的1至2以上ASCII字符构成。如:MOVAL,AMOVBX,ABSTRDBHello,2023/1/11,61,汇编语言程序设计,常数(常量)(2)字符串常数由单引号内的1至
37、2以上ASC,常数(常量),(3)符号常数,由EQU定义过的符号名。如:MOVCX,COUNT,2023/1/11,62,汇编语言程序设计,常数(常量)(3)符号常数由EQU定义过的符号名。202,表达式,表达式则由常数、寄存器、标号、变量与一些运算符和操作符及括号组合而成。有数字表达式和地址表达式两种。5类常用的运算符和操作符。,2023/1/11,63,汇编语言程序设计,表达式 表达式则由常数、寄存器、标号、变量与一些运算符和,运算符与操作符,(1)算术运算符,+、-、*、/、MOD例如:MOVDX,BLOCK+(6-1)2MOVCX,(END-ARRAY)/2,2023/1/11,64,
38、汇编语言程序设计,运算符与操作符(1)算术运算符+、-、*、/、MOD20,运算符与操作符,(2)逻辑运算符,AND、OR、NOT、XOR例如:MOVDX,PORT_VAL OR 30HANDCX,ARRAYAND OFEH,2023/1/11,65,汇编语言程序设计,运算符与操作符(2)逻辑运算符AND、OR、NOT、XO,运算符与操作符,(3)关系运算符,EQ、NE、LT、GT、LE、GE关系运算符要求的两个操作数必须都为数字或是同一段内的两个存储器地址。结果为真表示为全1,结果为假表示为0。例如:MOVBX,VAL EQ 5;当VAL等于5时,BX=0FFFFHMOVAX,(X LE Y
39、)AND X)+(Y LT X)AND Y);取X、Y中的小的数送AX。,2023/1/11,66,汇编语言程序设计,运算符与操作符(3)关系运算符EQ、NE、LT、GT、L,运算符与操作符,(4)数值回送操作符(分析操作符),OFFSET、SEG、TYPE、LENGTH、SIZE格式:OFFSETVariable或label SEGVariable或label TYPEVariable LENGTHVariable SIZEVariable功能:分别回送偏移地址、段地址、以字节数表示的类型值、使用DUP时的单元数、字节数。,2023/1/11,67,汇编语言程序设计,运算符与操作符(4)数值
40、回送操作符(分析操作符)OFFS,例4.174.19:FEESDW100 DUP(0)ARRYDW1,2,3TABLDBABCDMOVCX,LENGTH FEES;CX=100MOVCX,LENGTH ARRY;CX=1MOVCX,LENGTH TABL;CX=1MOVCX,SIZE FEES;CX=200MOVCX,SIZE ARRY;CX=2MOVCX,SIZE TABL;CX=1SIZE=LENGTH*TYPE,2023/1/11,68,汇编语言程序设计,例4.174.19:2022/9/2468汇编语言程序设计,运算符与操作符,(5)属性操作符(合成操作符),PTR、段操作符、SHOR
41、T、THIS段操作符:用来表示一个标号、变量或地址表达式的段属性。如:MOVAX,ES:BX+SISHORT:用来表明JMP指令中转移地址的属性,指出转移地址是下一条指令地址的-128127字节范围内。如JMPSHORTTAG:TAG:,2023/1/11,69,汇编语言程序设计,运算符与操作符(5)属性操作符(合成操作符)PTR、段操,PTR:用来建立一个符号地址,但本身并不分配存储器,只是用来给已分配的存储器地址赋于另一种属性。格式:typeptrexpression例4.22TWO_BYTEDW?ONE_BYTEEQUBYTEPTR TWO TWO_BYTE例MOVBX,5;类型不确定M
42、OVWORD PTR BX,5;存入字单元MOVBYTE PTR BX,5;存入字节单元,2023/1/11,70,汇编语言程序设计,PTR:用来建立一个符号地址,但本身并不分配存储器,只是用来,THIS:同PTR一样建立一个指定类型的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。格式:THISattribute或type例FIRST EQU THIS BYTEMYWORDDW100 DUP(?)例STARTEQU THIS FARMOVCX,100注意:THIS和PTR的不同。,2023/1/11,71,汇编语言程序设计,THIS:同PTR一样建立一个指定类型的地址操作数。
43、该操作数,运算符与操作符的优先级,1.圆括号、方括号、结构变量、LENGTH、SIZE2.名:(段取代)3.PTR、OFFSET、SEG、TYPE、THIS、段操作符4.HIGH、LOW5.*、/、MOD、SHL、SHR6.+、-7.EQ、NE、LT、LE、GT、GE8.NOT9.AND10.OR、XOR11.SHORT,2023/1/11,72,汇编语言程序设计,运算符与操作符的优先级 1.圆括号、方括号、结构变量、L,4.注释项,用来说明一段程序、一条或几条指令的功能。目的是提高程序的可读性。注意:应写出本条或本段指令在程序中的功能和作用。例:;*二进制转换为十进制*MOVCX,10;循环
44、次数INCSI;指向下一数据,2023/1/11,73,汇编语言程序设计,4.注释项 用来说明一段程序、一条或几条指令的功能。,2023/1/11,汇编语言程序设计,74,第5章 汇编语言程序设计初步,5.5 宏指令,汇编语言程序对内存是分段使用的,一般情况下,内存被分为三种类型区:堆栈段区CS指向正当前运行的代码段数据段区DS指向当前的数据段代码段区SS指向当前的堆栈段,下面以一个简单的程序例子,来介绍汇编语言程序的基本框架结构。,2022/9/24汇编语言程序设计74第5章 汇编语言程序设,汇编语言程序设计 第四章 汇编语言程序格式,为了简化源程序,一次定义多次使用。一、宏定义二、宏调用三
45、、宏展开四、宏指令与子程序的比较五、宏指令举例,4.3 宏指令(7.1),2023/1/11,75,汇编语言程序设计,汇编语言程序设计 第四章 汇编语言程,汇编语言程序设计 第四章 汇编语言程序格式,宏定义,宏定义在源程序中,用一条宏指令来代替一段有独立功能的程序段。格式:宏指令名MACRO 哑元表;形式参数表:(宏体)ENDM例如:SHIFTMACROX,YMOVCL,YSHLX,CLENDM,2023/1/11,76,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏定义,例7.1 计算RESULT=(OPR1)*(OPR2)MULTIPLYMA
46、CROOPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXPOPAXPOPDXENDM说明:1)MACRO、ENDM成对出现;2)宏体可由指令、伪指令、宏指令组成。,2023/1/11,77,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏调用,宏调用在源程序中,用宏指令名来调用经定义后的宏指令。格式:宏指令名;实参表其中:实元一般应与哑元一一对应,或舍去多余。例如:SHIFTMACROX,YMOVCL,YSHLX,CLENDM调用时,SHIFTAL,4SHIFTBX,4,2023/1
47、/11,78,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏调用,又如,有例7.1的定义,则调用时,MULTIPLYCX,VAR,XYZBXMULTIPLY240,BX,SAVE注意:实参取代形参后,应使语句合法。否则MASM将指示出错:MULTIPLYDX,120,1200 SHIFT4,AX,2023/1/11,79,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏展开,宏展开汇编时,用对应的宏体来代替该宏指令,产生目标代码。例如:SHIFTAL,4展开时将产生:+MOVCL,4+SHLAL,CL
48、汇编程序在所展开的指令前加上“+”号,以示区别。,2023/1/11,80,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令与子程序的比较,SHIFTMACROX,YMOVCL,YSHLX,CLENDMSHIFTPROCMOVCL,YSHLX,CLRETSHIFTENDP,2023/1/11,81,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令与子程序的比较,共同点:简化源程序不同点:宏指令没有简化目标代码,子程序的目标代码只有一个。子程序调用时,调用和返回需时间,宏指令没有。使用场合:代替的
49、程序段不长,速度是主要矛盾时用宏代替的程序段较长,空间是主要矛盾时用子程序,2023/1/11,82,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令举例,一、宏定义具有接收参数的能力,但有时可以没有参数例如:SHIFTMACROMOVCL,4SHLAL,CLENDM宏调用:SHIFT,2023/1/11,83,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令举例,二、变元可以是操作码例7.3FOOMACROP1,P2,P3MOVAX,P1P2P3ENDM宏调用:FOOWORD_VAR,INC,
50、AX,2023/1/11,84,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令举例,三、变元可以是操作码的一部分,但需分隔符&。例如:SHIFTMACROX,Y,ZMOVCL,XS&ZY,CLENDM宏调用:SHIFT4,AX,ALSHIFT2,AL,AL,2023/1/11,85,汇编语言程序设计,汇编语言程序设计 第四章 汇,汇编语言程序设计 第四章 汇编语言程序格式,宏指令举例,在上面的3个例子中,宏指令SHIFT的参数可以有0、1、2、3个,并可以出现在不同的位置。,2023/1/11,86,汇编语言程序设计,汇编语言程序设计 第四章