第四章 语言程序格式_第1页
第四章 语言程序格式_第2页
第四章 语言程序格式_第3页
第四章 语言程序格式_第4页
第四章 语言程序格式_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第四章汇编语言程序格式§4.1汇编语言语句种类及格式§4.2伪操作§4.4汇编语言的上机过程§4.1汇编语言语句种类及格式指令语句伪指令语句宏指令一、指令语句使CPU产生动作、并在程序执行时才处理的语句,就是第2章学习的处理器指令书写格式

[标号:]指令助记符[DEST[,SRC]][;注释] 标号:一条指令的符号地址。可以省略,如有必须以“:”作为结束标志。在程序段或子程序段的第一条指令处可使用标号,以在程序需要时转移到该处时,以标号的形式引用。指令语句—标号的命名标号的命名:根据用途,由字母、数字、专用符号?-$@ 约定:

最长31个字符

第一个字符不能是数字 ?-$@可出现在标号的任意位置,但?$不能单独使用 .只能出现在起始位置 一个程序中,每个标识符的定义是唯一的,且不能与任何保留字相同二、伪指令语句(Directive)——不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关[名字]伪指令[操作数][;注释]伪指令语句—格式说明符号名字段:与标号相区别,不带“:”可以是常量名、变量名、过程名、结构名、记录名等可视为指令语句中的操作数(如符号名就表示一个常量或存储地址命名规则与标号相同伪指令字段:规定这条语句要求汇编程序完成的具体操作§4.2伪操作一、数据定义及存储器分配伪操作二、表达式赋值伪操作三、段定义伪操作四、程序开始和结束伪操作五、地址计数器及对准伪操作六、基数控制伪操作七、处理器选择伪操作数据是语句中操作数的基本组成部分一般来讲数据具有数值和属性两个特征汇编语言能识别的数据项包括:常数、变量和标号一、数据定义及存储器分配伪操作变量:代表存储在某些存储单元中的数据,在程序运行期间可以修改;对变量的访问以变量名的形式进行;可认为变量名为存储单元的符号地址变量的定义与预置 由数据定义伪操作完成分配存储单元起名字赋初值一、数据定义伪指令的格式变量名DBDWDDDQ表达式1,表达式2,…段属性(SEG):表示变量存放在哪个逻辑段中,访问时要使之成为当前段偏移量属性(OFFSET):表示变量在所属逻辑段中距起始点的距离类型属性(TYPE):表示变量所占字节数一、数据定义伪指令(表达式)数值表达式 D1DB12H,34H,56H(D1)=12H,(D1+1)=34H,(D1+2)=56HD2DW1234H,5678H(D2)=1234H,(D2+2)=5678H?表达式:表示该单元的内容任意D3DB?,? ;表示分配2个字节D4DW?,? ;表示分配2个字一、数据定义伪指令(表达式)字符串表达式STR1DB‘ABCDE’ ;为每个字符分配1个单元 STR2DW‘AB’,’CD’ ;为由2个字符组成的字符串分配2个单元41H42H43H44H45HSTR142H41H44H43HSTR2一、数据定义伪指令(表达式)带DUP的表达式变量名DBDWDDDQ表达式1DUP(表达式2) D1DB20HDUP(?) ;预留20H个字节,内容任意次数内容 D2DB10HDUP(‘ABCD’) ;重复10H个‘ABCD’,共占40H字节 D3DW10HDUP(4) ;重复10H个字单元,内容0004H,共占20H字节一、数据定义伪指令(表达式)带DUP的表达式—DUP操作符可重复使用 D4DB10HDUP(4DUP(2),7)

;重复10H个(2,2,2,2,7),共占50H字节1)变量的属性:段属性(SEG)、偏移量属性(OFFSET)和类型属性对数据定义伪指令前面的变量还要注意它的类型属性问题。变量表示该伪指令中的第一个数据项的偏移地址,此外,它还具有一个类型属性,用来表示该语句中的每一个数据项的长度(以字节为单位表示),因此DB伪指令的类型属性为1,DW为2,DD为4,DQ为8,DT为10。变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令例:

OPER1DB?,?

OPER2DW?,?

.

.

.

MOVOPER1,0;字节指令

MOVOPER2,0;字指令

MOVAX,OPER1+1;错误指令:类型不匹配

MOVAL,OPER2;错误指令:类型不匹配

变量表达式OPER1+1为字节类型属性

OPER2为字类型属性5、变量和标号的属性:2)指定操作数的类型属性:PTR属性操作符:PTR指定操作数的类型属性,它优先于隐含的类型属性。其格式为:

类型PTR变量[±常数表达式]其中类型可以是BYTE、WORD、DWORD、FWORD、QWORD或TBYTE,这样变量的类型就可以指定了。

例:下例中的两条MOV指令把OPER1+1的类型属性指定为字,把OPER2的类型属性指定为字节,这样指令中两个操作数的属性就一致了,汇编时就不会出错了。

OPER1DB?,?

OPER2DW?,?

.

.

.

MOVAX,WORDPTROPER1+1

MOVAL,BYTEPTROPER2

LABEL伪指令

LABEL可以使同一个变量具有不同的类型属性。其格式为:

变量名LABEL类型

或标号LABEL类型

其中变量的数据类型可以是BYTE,WORD,DWORD,标号的代码类型可以是NEAR或FAR。例如:

BYTE_ARRAYLABELBYTE

WORD_ARRAYDW50DUP(?)

在50个字数组中的第一个字节的地址赋予两个不同类型的变量名:字节类型的变量BYTE_ARRAY和字类型变量WORD_ARRAY。

在程序中访问数组单元时,要按指令类型来选择变量,如下面两条指令:

MOVWORD_ARRAY+2,0;字指令,

;把该数组的第3个和第4个字节置0

MOVBYTE_ARRAY+2,0;字节指令,

;把该数组的第3个字节置0BYTE_ARRAY

WORD_ARRAY

均为变量名,他们具有相同的SEG OFFSET 属性,但TYPE属性不同BYTE_A:BYTEWORD_A:WORD标号指令的符号地址段属性(SEG)偏移量属性(OFFSET)距离属性(Distance类型):表示标号的转移特性类型: NEAR:本标号只能被标号所在段的指令访问(段内转 移、调用)

FAR:可被其他段的指令访问(段间调用、转移)标号设置标号距离属性的方法

1)隐含方式:在指令语句中使用标号后,其隐含为NEAR属性

SUB1:MOVAL,30H ;SUB1具有NEAR属性 ;该方式定义的标号只能具备NEAR属性标号设置标号距离属性的方法

2)用LABEL伪指令赋予标号距离属性

名称LABEL类型SEGOFFSETDistance 标识符标号NEAR/FAR

该伪指令一般与指令语句/数据定义伪指令连用,以补充或设置与值连用的标号/变量的距离/类型属性设置标号距离属性的方法(例1)

SUB1: MOVAL,30H标识符SUB1_FAR SUB1 均为指令的符号地址,他们具有SEG OFFSET 相同的属性,但Distance属性不同SUB1_FAR:FARSUB1:NEAR

段内转移/调用:

SUB1

SUB1_FAR LABELFAR

段间转移/调用:

SUB1_FAR变量的使用—在指令语句中对已经定义的变量直接引用其符号名DATASEGMENT DA1 DB0FEHDA2 DW52ACHDA3DB10HDUP(?)DA4DW10HDUP(1) …… MOVAL,DA1;AL=FEH MOVBX,DA2;BX=52ACH MOVSI,2 MOVDA3[SI],AL MOVDA4[SI],BX 直接寻址相对变址寻址FEAC5200010001DA1DA2DA3DA3+1DA3+2DA4DA4+252AC变量的使用—在伪指令语句中DATASEGMENT DA1 DB12HNUM DB75HHARRAYDW20HDUP(0)ADR1DWNUMADR2DDNUM ……DS=21FDH127500210100FDDA1NUMARRAYADR1ADR2000100

DW:定义的存储单元存放相应变量的偏移量DD:定义的存储单元存放相应变量的偏移量和段基值二、地址计数器及对准伪操作地址计数器$:汇编程序在为每条指令或变量分配内存时,使用当前位置计数器来指示下一指令或数据的偏移量,汇编语言允许用户直接用$来引用地址计数器的值

◆地址计数器与对准伪操作:地址计数器$:例如指令:

JMP$+6

它的转向地址是JMP指令的首地址加上6。当$用在指令中时,它表示本条指令的第一个字节的地址。在这里,$+6必须是另一条指令的首地址。否则,汇编程序将指示出错信息。当$用在伪指令的参数字段时,则和它用在指令中的情况不同,它所表示的是地址计数器的当前值。例如指令:

ARRAYDW1,2,$+4,3,4,$+4

00H01H00H02H00H

7CH

00H03H00H04H00H

82H

ARRAY007E007800740078H+4=007CH定位伪指令: ORG表达式 将表达式的值赋给当前位置计数器。即该伪指令后的指令或变量以表达式的值为偏移量例如:SEG1SEGMENTORG10HVAR1DW1234H;VAR1的偏移地址为10hORG20HVAR2DW5678HORG$+8VAR3DW1357HSEG1ENDS

EVEN

使下一指令或变量的偏移量为偶数例如:ADB‘morning’EVENBDW2DUP(?)五、地址计数器及对准伪操作(例)DATA SEGMENT ORG30HDB1 DB12H,34H ORG$+20HSTR DB‘ABC’CNT EQU$-STR EVENDW1 DW20HDUP(0)DATA ENDS ……CODE SEGMENT ASSUMECS:CODE,DS:DATA ORG10HSTART:MOVAX,DATA MOVDS,AX ……CODE ENDS ENDSTARTDATA30HDB143HDD1STRDW142H41H00123440H20H30H00三、表达式赋值伪操作等值语句符号EQU表达式;将表达式的值赋给左边的符号EQU是一个赋值伪操作(伪指令),它给一个数据标号赋于一个常数值,但这个常数不占用存储单元。当这个数据标号出现在程序中时,汇编程序即用它的常数值代替数据标号。EQU可以在数据段之外使用,甚至可用在代码段中间。在同一程序中,同一符号不能用EQU重复定义。表达式的形式1)常数或数值表达式

CNTEQU5 NUMEQU13+5+4 2)址表达式

ADR1EQUDS:[BP+14] 3)变量、标号或指令助记符

W0EQUWORDPTRDA_BYTE假定在数据段和代码段中要多次使用一个数据(如5),那么在编程时凡是用到5的地方都可用数据标号CNT来表示。如果程序想修改这个数据,那么只需修改EQU的赋值,而无须修改程序中其它部分。

等值语句符号=表达式;功能与EQU相同,但可重复定义

CNT=5 NUM=4 …… NUM=NUM+10H CBD=DDA …… CBD=ADD例如,TMPEQU5

TMPEQUTMP+1则是错误语句,因为TMP已赋值为5,就不能再把它定义为其它数值。

而TMP=5

TMP=TMP+1则是允许使用的,因为=伪操作允许重复定义。第一个语句TMP的值为5,第二个语句TMP的值就为6了。赋值伪操作"="的作用与EQU类似。它们之间的区别是,EQU伪操作中的标号名是不允许重复定义的,而=伪操作是允许重复定义的。表达式与运算符指令中的操作数可以以表达式的形式出现常数变量标号 通过操作运算符连接而成表达式汇编程序在汇编过程中计算表达式,最终得到一个数值程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性MASM对除伪指令外各种汇编时处理的指令统称为操作符(Operator)运算符算术操作(运算)符逻辑操作(运算)符关系操作(运算)符数值返回操作(运算)符属性修改操作(运算)符 运算符运算符—算术运算符+-*/MOD实现加、减、乘、除、取模、移位的运算

MOVAX,3*4+5 ;等价于MOVAX,17其中MOD也称为取模,它产生除法之后的余数,如19mod7=5加+和减-运算符还可以用于地址表达式除加、减外,其他运算符的参数必须是整数算术运算符—例NUM =11011011B MOVAL,NUMSHL3 MOVAL,11011000B MOVBL,NUMSHR2 MOVAL,00110110B ADDDL,NUMSHR6 ADDDL,00000011B MOVAL,ARRAY[BX][SI] MOVAL,ARRAY[BX+SI]运算符—逻辑运算符ANDORXORNOT实现按位相与、相或、异或、求反的逻辑运算

ORAL,03HAND45H 0RAL,01H

MOVAX,NOT0F0H MOVAX,0FF0FH

MOVBL,55HAND0F0H MOVBL,50H运算符—关系运算符EQNEGTLTGELE用于比较和测试符号数值表达式1 关系运算符表达式2表达式为常数时,按无符号数进行比较表达式为变量(同段内)时,比较其偏移量MASM用0FFH/0FFFFH(补码-1)表示条件为真MASM用0000H表示条件为假运算符—关系运算符(举例)MOVAX,0FHEQ1111B ←→MOVAX,0FFFFHMOVBX,0FHNE1111B ←→ MOVBX,0VARDWNUMLT0ABH;当已定义的常数NUM小于ABH时,则VAR←0FFH运算符—数值返回运算符操作对象:存储器操作数(变量/标号)格式: 运算符变量名/标号名SEG名字/标号返回名字或标号的段基值MOVAX,SEGK1OFFSET名字/标号返回名字或标号的段内偏移地址MOVSI,OFFSETVAR运算符—数值返回运算符TYPE名字/标号返回名字或标号的类型属性,以数字形式表示类型属性数字形式变量BYTE1WORD2DWORD4标号NEAR-1FAR-2运算符—数值返回运算符(例)V1 DB‘ABCD’V2 DW1234H,5678HV3 DDV2 …… MOVAL,TYPEV1 ;AL=1 MOVCL,TYPEV2 ;CL=2 MOVCH,TYPEV3 ;CH=4

运算符—数值返回运算符LENGTH名字/标号只用于变量,且为DUP所定义

如未用DUP定义则返回值为1如使用DUP定义则返回最外层之值运算符—数值返回运算符(例)K1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’

…… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1运算符—数值返回运算符SIZE名字 只用于变量,得到重复定义的变量的数组元素所占字节数=LENGTH*TYPEK1 DB10HDUP(0)K2 DB10H,20H,30HK3 DW20HDUP(0,1,2DUP(2))K4 DB‘ABCD’

…… MOVAL,LENGTHK1 ;AL=10HMOVBL,LENGTHK2 ;BL=1MOVCX,LENGTHK3 ;CX=20HMOVDX,LENGTHK4 ;DX=1MOVAL,SIZEK1 ;AL=10HMOVBL,SIZEK2 ;BL=1MOVCL,SIZEK3 ;CL=40HMOVDL,SIZEK4 ;DL=1 运算符—属性修改运算符对存储器操作数(名字/标号)的属性进行修改PTR运算符 类型PTR地址表达式

该修改是临时的,只在当前语句有效标号:NEAR/FAR变量:BYTE/WORD/DWORD 标号名作为地址指针的R变量名

运算符—属性修改运算符(例)DA_BYTE DB20HDUP(0)DA_WORDDW30HDUP(0) …… LEABXDA_WORD LEASI,DA_BYTE

MOVAX,WORDPTRBA_BYTE[10H] ADDBYTEPTRDA_WORD[20H],BL INCBYTEPTR[BX] SUBWORDPTR[SI],30H ANDAX,WORDPTR[BX][SI] JMPFARPTRSUB1运算符—THIS运算符THIS类型名利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型LABEL伪指令的功能等同于“EQUTHIS”D_BYTE EQUTHISBYTEW_WORD DW20HDUP(0);定义20H字单元,该区域可按字节访问,也可以按字访问JMP_FAR EQUTHISFARJMP_NEAR:MOVAL,30H运算符—HIGH/LOW运算符操作对象:常数/地址表达式功能:取其高/低8位

CONSTEQU0ABCDH MOVAH,HIGHCONST ;AH=0ABH 运算符的优先级1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT建议采用圆括号“()”显式表达,它可以极大地提高程序的可阅读性四、段定义伪操作程序的段结构段定义段寻址(指定当前段)段寄存器的装入◆段定义伪操作:完整的段定义格式datasegment;定义数据段…dataends;extrasegment;定义附加段…extraends;codesegment;定义代码段

assumecs:code,ds:data,es:extrastart:movax,datamovds,ax;段地址段寄存器…codeendsendstartPSPDSESSSCSEXE程序的内存映象图装入模块文件头四、段定义伪操作—完整段定义伪指令段名 SEGMENT定位组合段字'类别'

…… ;语句序列段名 ENDS段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型如果不指定,则采用默认参数;但如果指定,注意要按照上列次序四、段定义伪操作

—段定位(align)属性表示对逻辑段起始边界的选择,可为:PAGE 段从一个页边界开始 (XXX00H,256Bytes/Page)

PARA 段节边界开始(XXXX0H)DWORD 段从一个4倍数地址开始WORD 段从一个偶地址开始BYTE 段可以从任意单元开始完整段定义伪指令的默认定位属性是PARA四、段定义伪操作

—段组合(combine)属性指定多个逻辑段之间如何连接与定位,可为: PRIVATE

本段与其他段没有连接关系,这是完整段定义伪指令默认的段组合方式 PUBLIC

在满足定位关系的前提下,连接程序把本段与所有同名段相邻地连接在一起,形成新的逻辑段。(可在程序的不同位置及不同的文件中使用段定义语句定义一个逻辑段) COMMON

产生一覆盖段,两个同名段起始地址相同,用较长的段覆盖较短的段四、段定义伪操作

—段组合(combine)属性STACK

把所有的同类别段连接在一起,段基值→SS,且自动为SP初始化。在一个程序中一般应该有一个堆栈段。AT表达式表示本段定位在表达式所指示的节的边界上

AT0930H表示本段的物理地址从09300H开始MEMORY

表示本段定位在所有其它段的最高地址四、段定义伪操作

—段类别(class)属性当连接程序组织段时,将所有的同类别段相邻分配段类别可以是任意名称,但必须位于单引号中大多数MASM程序使用'code'、'data'和'stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续DA1 SEGMENTPARA‘DATA’DD1 DB10DUP(12H)DA1 ENDSSTA1 SEGMENTSTACK‘STACK0’ DW20HDUP(?)STA1 ENDSDA2 SEGMENTPARA‘DATA’DD2 DB20HDUP(13H)DA2 ENDSSTA2 SEGMENTSTACK‘STACK0’ DW30HDUP(?)STA2 ENDSCODE SEGMENT ……CODE ENDSDA11213DA2CODEDD1DD260HSTA1131212STA240H20H10四、段定义伪操作—段寻址指明当前段

ASSUME段寄存器名:段名,段寄存器名:段名,……CSDSSSES

已经定义的段

在程序运行过程中,可重新设置当前段,也可以删除原有的设置

ASSUMEES:NOTHING ;删除对ES的设置 ASSUMENOTHING ;删除对所有段的设置四、段定义伪操作

—段寄存器的装入ASSUME只说明了已哪些段为当前段,具体的段基值并没有装入DS与ES的装入 用ASSUME将DS/ES与相应的段建立联系后,用数据传送指令

MOV AX,段名

MOV DS/ES,AX四、段定义伪操作

—段寄存器的装入SS的装入 在定义段时,用组合类型STACK说明

STACK1 SEGMENTPARASTACK DW20HDUP(0) STACK1 ENDS CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……

SS获得STACK1的段基值,且SP=40H四、段定义伪操作

—段寄存器的装入SS的装入(类似于DS/ES的方法)

STACK1 SEGMENT DW40HDUP(0) TOP LABELWORD STACK1 ENDS …… CODE SEGEMNT ASSUMECS:CODE …… MOVAX,STACK1 MOVSS,AX MOVSP,OFFSETTOP ;SP=80H ……

中间不得插入其他指令四、段定义伪操作

—段寄存器的装入CS的装入 用结束伪指令:每个源程序都必须以END伪指令结束

END起始地址

功能:标志源程序的结束 指定程序运行的起始地址标号表达式不一定是指令语句四、段定义伪操作

—段寄存器的装入CS的装入

CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 START: …… …… ENDSTART

将后面的语句全部略去 将START所对应的程序在内 存中的位置装入CS和IP五、程序开始和结束伪操作开始:

NAMEmodul_name

TITLEtext

程序终止和汇编结束是两码事结束:

END

起始地址六、基数控制伪操作汇编语言源程序默认使用十进制,其他用标注表示(B,O,H)格式: RADIX表达式功能:把默认的基数改为2、8、16等 除指定进制外,其他加标注MOVBX,0FFHMOVBX,178RADIX16MOVBX,0FFMOVBX,178D例:设x,y,sum均为内存单元的符号地址,编写一源程序实现x+y的运算,并把结果存入sum单元。(x,y均为16位数据)。datasegmentxdw?ydw?sumdw?dataend

温馨提示

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

评论

0/150

提交评论