汇编语言的基本语法课件_第1页
汇编语言的基本语法课件_第2页
汇编语言的基本语法课件_第3页
汇编语言的基本语法课件_第4页
汇编语言的基本语法课件_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章汇编语言的基本语法本章主要内容1.汇编语言的主要特点2.汇编语言源程序的基本结构3.汇编语言的表达式和伪操作符4.汇编语言程序的上机过程5.1汇编语言的特点AssembleLanguage一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述),通常是为特定计算机或计算机系列专门设计的。采用汇编语言进行程序设计的优点:可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间。常用来编写实时控制程序、实时通信程序,有时也用来编制某些系统软件程序。缺点:1.编程效率低(与人们描述计算过程的需要差距大);2.与机器硬件的具体结构联系过于紧密——在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。示例程序DATASEGMENT

;数据段

NUMDW00111BNOTESDB‘Theresultis:’,’$’DATAENDSCODE

SEGMENT

;代码段ASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVDX,OFFSETNOTES;显示提示信息MOVAH,9HINT21HMOVBX,NUM;将数装入BXMOVCH,4;CH作循环计数器

示例程序(续)ROTATE:DISPLAY:MOVCL,4;CL中放移位位数MOVDL,AL;显示16进制数ROLBX,CLMOVAH,2MOVAL,BLINT21HANDAL,0FH;AL中为一位16进制数DECCHADDAL,30H;转换为ASCII码值JNZROTATECMPAL,’9’;是0~9的数码?MOVAX,4C00H;返回DOSJLEDISPLAYINT21HADDAL,07H;在A~F之间

CODE

ENDS

;代码段结束ENDBEGIN;模块结束5.1.2汇编语言源程序的组成1.伪指令语句和指令语句汇编语言源程序中除了包含机器指令外,还应包含说明性的“指令”。这些说明性的“指令”是面向汇编程序和连接程序的,称为伪指令(Directives)。宏汇编程序5.0版(MASMV5.0)规定,汇编语言源程序的每行只能写一个语句:指令语句或伪指令语句。行长不能超过128个字符。每个语句最多可由四个字段组成:名字字段、操作字段、操作数字段和注释字段。指令语句是可执行语句,其格式为:

[名字:]指令操作助记符[操作数表达式1[,操作数表达式2]][;注释]其中,指令操作助记符(指令名)是指令语句中不可缺少的主体,其余部分(方括号中的内容)有时可省略。名字只能是标号。

注释以分号开头,分号右边的内容将被汇编程序忽略。例

L:ADDAX,BX;注释

5.1.4汇编语言的表达式1.汇编语言的标识符2.汇编语言的操作对象(数据类型)

(1)常数、常量编程时已经确定其值,程序运行期间不会改变其值的数据对象称为常数。8086/8088CPU允许定义四种形式的常数:整数、字符串、“组合BCD码数”和实数(浮点数),但只能处理整数、字符串、“组合BCD码数”,不能处理实数(浮点数)。

常数表达式的名字称为常量。(程序员给出的一个名或助记名作为一个确定值的标识,其值在程序执行过程中保持不变。)常量可用伪指令说明符“EQU”或“=”定义。例如,AEQU7或A=7都可将常量A的值定义为常数7。

注意:伪指令说明符EQU左边的符号名不允许重复定义,而“=”左边的符号名可以重复定义。即,AEQU7

可以:A=7

AEQU8(不允许)A=8

(2)变量编程时只能确定其初始值,程序运行期间可修改其值的数据对象称为变量。变量是存储单元中的数据,可定义在任何段(DS、ES、SS、CS),但通常都定义在数据段(DS)和附加段(ES)。变量由伪指令说明符DB、DW、DD等定义。需要时可给变量的地址取名字,变量名就是变量地址的名字,可称为变量的符号地址。例如,在下列伪指令语句中,ADB50,60,70,80DW50,60,70,80DD50,60,70,80用DB、DW、DD说明符各定义了4个变量,并给出了每个变量的初始值。用DB定义的每个变量占一个字节单元,用DW定义的每个变量占两个连续的字节单元,用DD定义的每个变量占四个连续的字节单元,这些变量全部都按定义时的顺序依次存储,只是用DB定义的第一个变量赋予了名字A。A仅代表DB右边第一个变量(即DB右边初值为50的变量)的地址。

变量有如下的属性:

①段基值属性:指变量所在段的段基值;②偏移地址属性:指变量所在的存储单元的段内偏移地址;③类型属性:指变量所占存储单元的字节数。标号有如下的属性:

①段基值属性:指标号后面第一条指令所在的代码段的段基值;②偏移地址属性:指标号后面第一条指令首字节的段内偏移地址;③类型属性:也称距离属性,是指标号与引用该标号的指令之间允许距离的远、近。

(4)段名每一个段都必须用SEGMENT和ENDS标识段的开始和结束,SEGMENT和ENDS左边必须有名字,段名就是SEGMENT和ENDS左边的名字。对于同一个段,ENDS左边的名字必须与SEGMENT左边的名字相同。过程(子程序)的基本结构

Proc-A

PROC

NEAR(或FAR)____________过程名____________...____________RET

Proc-A

ENDP

(6)偏移地址计数器$汇编程序在对源程序进行汇编的过程中,用偏移地址计数器$来保存当前正在汇编的指令的偏移地址或伪指令语句中变量的偏移地址。用户可将$用于自己编写的源程序中。在每个段开始汇编时,汇编程序(汇编器)都将$清为0,以后,每处理一条指令或一个变量,$就增加一个值,此值为该指令或该变量所占的字节数。可见,$的内容就是当前指令或变量的偏移地址。

在指令中,$无论出现在指令的任何位置,都代表本条指令第一个字节的偏移地址。例如,“JZ$+6”的转向地址是该指令的首地址加上6,$+6还必须是另一条指令的首地址。再如,在下述指令序列中,DECCXJZ$+5MOVAX,2LAB:...因为$代表JZ指令的开始地址,而JZ指令占2个字节,这里的MOV指令占3个字节,所以,在发生转移时,JZ指令会将程序转向LAB标号处的指令,且标号LAB可省。3.汇编语言的伪操作(运算)符汇编语言中的操作符号很多,可分为算术操作符、逻辑操作符、关系操作符、重复置数(复制)操作符、取属性(分析)操作符、指定属性(合成)操作符、分离操作符、结构和记录中专用的操作符等几类。这些操作符都是面向汇编程序的,都由汇编程序解释并“执行”,而不是像指令那样由CPU去执行。通常称这些操作符为伪操作符,称对应的操作为伪操作。

(1)算术伪操作常见的有+、-、MOD、SHL、SHR、*、/共7个符号,分别表示加、减、取模(求余数)、逻辑左移、逻辑右移、乘、除。这些操作符都可用于数据之间的运算,+、-操作符还可用于地址之间、数据与地址之间的运算。

用于数据之间的运算时,按每个操作符的定义进行。例如,在字节操作时,“124MOD3”的结果为1“10110101BSHL2”的结果为11010100B注意:“MOVAL,00011010BSHL2”中的“SHL”是移位伪操作符“SHLAL,1”中的“SHL”是移位指令助记符

(2)关系伪操作关系伪操作对两个数据进行比较,有EQ、NE、LT、GT、LE、GE共6个符号,分别表示等于、不等于、小于、大于、小于或等于、大于或等于,操作的结果为逻辑值。若条件满足,则结果为“真”,若条件不满足,则结果为“假”。“真”用-1(n位全1)表示,“假”用0(n位全0)表示。例如,在字操作时:(60HLE70H)GE(60HLT30H)=FFFFHGE0000H=FFFFH。(3)逻辑伪操作有NOT、AND、OR、XOR共4个符号,分别表示非、与、或、异或,可用于对两个(或一个)数据进行操作。例如,在字操作时,1234HOR2AFEH=3AFEH,NOT0F0H=FF0FH;在字节操作时,NOT0F0H=0FH。(4)重复置数(复制)伪操作只有DUP一个符号,表示对其后(右边)的数据进行重复设置(复制),使用格式是:

重复次数DUP(初值1[,初值2[,……]])其中,重复次数为无符号整数(1~65535),初值1、初值2……为变量的初始值。例如,下面各行的写法都等效:

WDW25,8,2,3,2,3,6,8,2,3,2,3,6WDW25,2DUP(8,2,3,2,3,6)WDW1DUP(25),2DUP(8,2DUP(2,3),6)WDW1DUP(25),2DUP(1DUP(8),2DUP(2,3),1DUP(6))

第一行的写法将13个变量分为13组,每组重复1次。后三行的写法将13个变量分为两组,第一组将25重复一次,第二组将(8,2,3,2,3,6)重复两次。无论哪种写法,我们都将第一组变量的重复次数称为W的长度,将W的长度与W的类型之积称为W的大小。此处,W的长度为1,类型为2,大小为2。长度和大小也可看作变量的属性。练习:若定义ADB1,2,5DUP(0,1,2DUP(3)),则在A的存储区前6个字节单元的数据是.(5)取属性(也称分析)伪操作取属性伪操作可以取出运算对象的某个属性。常见的有SEG、OFFSET、TYPE、LENGTH、SIZE共5个符号,分别表示取段基值、取偏移地址、取类型、取长度、取大小,操作的结果都是数值常数。①格式:SEG变量名或标号返回变量或标号所在段的段基值。例如,若A为变量名或标号,则SEGA表示A所在段的段基值。②格式:OFFSET变量名或标号返回变量或标号的偏移地址部分。例如,若A为变量名或标号;则OFFSETA表示A的偏移地址部分。③格式:TYPE变量名或标号返回变量或标号的类型属性值。④格式:LENGTH变量名返回变量的长度,即以DUP形式表示的第一组变量被重复设置的次数。⑤格式:SIZE变量名返回变量的大小,即TYPE×LENGTH的值。也就是说,SIZE=TYPE×LENGTH。

关于TYPE、LENGTH和SIZE的含义举例对于“W1DW20DUP(3,10DUP(7))”,则TYPEW1=2,LENGTHW1=20,SIZEW1=40;对于“W2DW8,20DUP(3,10DUP(7))”,则TYPEW2=2,LENGTHW2=1,SIZEW2=2;对于“B1DB20DUP(3,10DUP(7))”,则TYPEB1=1,LENGTHB1=

,SIZEB1=

;对于“B2DB8,20DUP(3,10DUP(7))”,则TYPEB2=

,LENGTHB2=

,SIZEB2=

。(6)指定属性(也称合成)伪操作指定属性伪操作可用于指定存储器操作数或标号的属性,常见的有PTR、:、THIS共3个符号,其功能分别为:指定存储器操作数或标号的类型、指定存储器操作数的段归属、指定当地的变量或标号的类型。①格式:类型名PTR存储器操作数或标号例如,指令“MOV[BX],5”的含义是将常数5送入存储单元[BX]中。该存储单元的偏移地址由BX确定,段基值隐含为DS。但汇编程序无法确定常数5是字节还是字,也无法确定存储单元[BX]的内容是字节还是字,所以无法操作。②格式:段寄存器名:存储器操作数临时指定存储器操作数的段归属。例如,“MOVAX,ES:[BX]”表示该存储单元的段基值取自ES,而不是隐含的DS。③格式:THIS类型名临时指定当前地址处变量或标号的类型。例如,THISBYTE表示当前地址处变量的类型为字节,THISFAR表示当前地址处标号的类型为远。THIS操作符会在当前段内产生一个偏移地址与$的值相等的操作数,该操作数的类型由THIS右边的类型名确定。THIS可以像PTR一样建立一个指定类型(BYTE,WORD或DWORD)或指定距离(NEAR或FAR)的操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。THIS往往和伪指令说明符EQU连用,为当前存储单元定义一个指定类型的变量或标号,并为下一个能分配存储单元的变量和标号定义新的类型。例如:

AEQUTHISBYTE

BDD12345678H就是将一个双字类型变量B临时指定为字节类型变量,它与A具有相同的段地址和偏移量。

例:……….

AEQUTHISBYTEBDD12345678H………...CLDMOVSI,OFFSETALODSB;AL(DS:SI),SISI+1…………DATASEGMENT

AEQUTHISBYTEBDD12345678HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

CLDMOVSI,OFFSETALODSB

;AL(DS:SI),SISI+1MOVAX,4C00HINT21HCODEENDSENDSTART又如:STARTEQUTHISFARMOVCX,100

这样,MOV指令有一个FAR属性的地址START,这就允许其他段的JMP指令直接跳到START来。(7)分离操作符有SHORT、HIGH和LOW三个,其功能是从其后的操作数(或与其后的操作数有关的数据)中分离出一部分内容作为返回值。①格式:SHORT标号只取出标号与IP之差(标号-IP)的低字节,即将标号按短(距离)处理。②格式:HIGH字操作数从字操作数中分离出高字节。例如,HIGH1234H的操作结果为12H。③格式:LOW字操作数从字操作数中分离出低字节。例如,LOW1234H的操作结果为34H。4.汇编语言的表达式

(1)表达式及分类用伪操作符将操作对象组合起来即得到表达式,单个操作对象也可称为表达式。表达式可作为指令语句中的操作数或伪指令语句中的参数。按操作性质的不同可将表达式分为四类:

①算术表达式②逻辑表达式③关系表达式

④特殊表达式

(2)表达式的操作顺序

表达式中常用的伪操作符按以下顺序依次优先处理:

①(i)()、[]、〈〉(ii)LENGTH、WIDTH、SIZE、MASK(iii)·(结构字段名操作符)(iv):(段超越前缀的操作符)(v)PTR、OFFSET、SEG、TYPE、THIS(vi)HIGH、LOW②(i)+(正号)、-(负号)(ii)*、/(iii)MOD、SHL、SHR(iv)+、-③EQ、NE、LT、LE、GT、GE④(i)NOT(ii)AND(iii)OR、XOR⑤SHORT例如,因为“HIGH”运算优先于“+”运算,所以,

HIGH1234H+2=12H+2=14HHIGH(1234H+2)=HIGH1236H=12H5.1.5汇编语言的伪指令说明符

1.数据定义(存储单元分配)数据定义说明符用于定义变量,也就是为变量分配存储单元并可同时预置初始值,有DB、DW、DD、DF、DQ、DT共6种说明符。分别表示存储单元分配时以字节为单位、以字为单位、以双字为单位、以3字(远字)为单位、以4字为单位、以10字节为单位。

例如,在下述定义中,ADB12H,?BDW?,3456HCDD789ABCDEHDDB′A′,′B′,′C′,′D′EDB′ABCD′FDW′AB′,′CD′

上述各变量的存储情况如图5-4所示。显然,DB′AB′和DW′AB′的存储情况不同。A图5-4变量在存储器中的存储情况12???5634BDEBC9A78C41424344D41424344E42414443F程序例DATASEGMENTTABDW1,2,3,4,5,6ENTRYEQU3DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAL:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABADDBX,ENTRY;MOVAX,TAB+3MOVAX,[BX]CODEENDSENDL

上述程序执行后,AX=

2.符号定义(表达式赋值)有=、EQU、PURGE共3种说明符,含义分别是被赋予、被赋予、取消(释放)。(1)格式:符号名=表达式将表达式的值赋予符号名,以后即可用该符号名代表此表达式的值。(2)格式:符号名EQU表达式或另一组标识符将表达式的值或另一组标识符赋予符号名,以后即可用该符号名代表此表达式的值或代替另一组标识符。(3)格式:PURGE符号名1[,符号名2[,……]]取消(释放)被EQU定义的符号名,以后即可用EQU对该符号名再赋予不同的含义。3.段定义段定义说明符共有3种,即SEGMENT、ENDS和ASSUME,含义分别是段开始、段结束、指定段寄存器。(1)格式:段名SEGMENT[定位类型][组合类型][′类别′]从段名代表的段基值开始定义一个段。其中的定位类型、组合类型和′类别′一般都可省略,若不省略时各项的顺序不能变。①定位类型:连接时用于指定该段应开始于什么样的物理地址。可选择下列4种之一:BYTE:

从当前可用的字节地址XXXXXXXXXXXXXXXXXXXX(任一地址)开始;WORD:

从当前可用的字地址XXXXXXXXXXXXXXXXXXX0(偶数地址)开始;PARA(缺省):从当前可用的节地址XXXXXXXXXXXXXXXX0000(16的倍数)开始;PAGE:

从当前可用的页地址XXXXXXXXXXXX00000000(256的倍数)开始。其中,1节(paragraph)为16字节,1页为16节即256字节。

②组合类型:连接时用于指定同名的各段之间的组合方式。可选择下列6种之一:

PUBLICSTACKCOMMONMEMORYAT表达式NONE(缺省)若省略组合类型或说明为NONE类型,则表示各个段不组合,各有自己的段基值。对堆栈段,必须用STACK类型说明,不能省略。③′类别′:是要将组合后的各段按′类别′分类存放,同类别的段将被相邻地放在一起。′类别′是由用户定义的、用一对引号括起来的、长度不超过40个字符的名字(标识符)。(2)格式:段名ENDS表示该段到此结束。这里的段名必须与该段开始时SEGMENT左边的段名相同。(3)格式:ASSUME段寄存器名1:段名1[,段寄存器名2:段名2[,……]]该语句必须出现在有关的变量及标号使用之前,用于指定某段(用段名标识)中的变量、标号等数据项由哪个段寄存器寻址。4.指定段内的偏移地址常用的有ORG和EVEN两种说明符,是指定下一个要用的存储单元的偏移地址。(1)格式:ORG常数表达式指定当前可用的存储单元的偏移地址为常数表达式的值,就是将常数表达式的值送入$。(2)格式:EVEN将当前可用的存储单元的偏移地址调整为最近的偶数值,就是将当前可用的最小偶数偏移地址值送入$。

例如,在下述伪指令语句序列中,

ORG1000HADB47H,12H,45H

EVENBDB47H

ORG1000H将A的偏移地址部分指定为1000H,从A开始存放3个字节变量,占用地址1000H、1001H和1002H,B的偏移地址部分本应是1003H,但EVEN指令会将B的偏移地址部分调整为偶数地址1004H。对于字数组,为保证其从偶地址开始,可在它前面用EVEN伪操作来达到这一目的,形如:

DATA-SEGSEGMENT

EVEN

WORD-ARRAYDW100DUP(?)DATA-SEGENDS5.过程定义有PROC、ENDP两种说明符,含义分别是过程开始与过程结束,必须成对出现。(1)格式:过程名

PROC

类型属性名从过程名代表的地址开始定义一个过程,其中的类型属性名可选择NEAR或FAR两种之一,前者表示该过程为近过程,后者表示该过程为远过程。如果不给出类型属性名或给出NEAR,则视为近过程。(2)格式:过程名

ENDP表示该过程到此结束。这里的过程名必须与过程开始时PROC左边的过程名相同。过程(子程序)的基本结构

Proc-A

PROC

NEAR(或FAR)____________过程名____________...____________RET

Proc-A

ENDP

6.类型定义类型定义说明符只有一个,即LABEL,可用来给当前地址处的变量或标号取一个别名,并赋予另一种类型属性。格式:变量名或标号LABEL类型属性名“LABEL”和“EQUTHIS”的作用类似5.1.6宏定义、宏调用和宏扩展宏(MACRO)是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。宏定义是用伪指令来实现的。其格式为:MACROּּּENDM[dummyParameterList]宏指令名宏定义体形式参数(用逗号隔开)其中MACRO和ENDM是一对伪指令说明符,这对伪指令之间是宏定义体——一组有独立功能的程序代码Macro-name经宏定义定义后的宏指令就可以在源程序中调用,这种对宏指令的调用称宏调用,宏调用的格式为:Macro-name[actualparameterlist](每一项之间用逗号隔开)当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数一一取代宏定义的形式参数。例1.宏定义可以无变元宏定义:SAVEREGMACRO

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

ENDM宏调用:

SAVEREG宏展开:将宏定义体的内容(具有独立功能的代码段)全部列出。宏定义开始宏定义体宏定义结束宏指令例2

宏定义带形式参数宏定义:

FOOMACROP1,P2,P3

MOVAX,P1

P2P3

ENDM宏调用:

FOOWORD_VAR,INC,AX宏展开:+MOVAX,WORD_VAR

+INCAX子程序调用和宏调用工作方式的区别子程序调用工作方式:X←A,y←BCALLQx←C,y←DCALLQ主程序Q:...RET子程序Q(x,y)执行时调用宏调用工作方式:QA,BQC,D主程序汇编时展开Q(A,B)Q(C,D)QMACROx,yENDM子程序调用和宏调用工作方式的区别1.在处理时间上不同。2.用宏指令得到的目标代码长,占内存空间大,而且宏调用的次数越多,所占内存空间越大;用子程序占内存空间小,而且不会随调用次数的增加而增加,但执行时间长。3.传递参数的方式不同。5.1.7汇编语言程序的开发汇编语言程序的建立及汇编过程编辑程序Prog.asm文件汇编程序Prog.obj文件连接程序Prog.exe文件Edit.exeMasm.exeLink.exe汇编示意图调用MASM.EXE.ASM汇编.OBJ.LST.CRF可选汇编程序的主要功能汇编程序分两种:一种是基本汇编(ASM.EXE);一种是宏汇编(MASM.EXE),宏汇编功能比较强。检查源程序;测出源程序中的语法错误,并给出出错信息;产生目标文件(.OBJ),并可给出列表文件(同时列出汇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论