配色: 字号:
第4章_2 基本语法(2)
2012-05-16 | 阅:  转:  |  分享 
  
第四章汇编语言程序设计汇编语言程序设计概述汇编语言基本语法汇编语言程序设计BIOS及DOS功能调用汇编语言程序设计实
例格式:符号EQU表达式功能:将表达式的值赋给EQU左边的符号。表达式可以是常量、变量、标号、数值或地址表达式。在
程序中使用这里定义的符号名,则在汇编后将代换成表达式计算的实际数值。说明:EQU指令定义的符号是不可以被再定义的,除非使用PUR
GE伪指令将此定义撤销后重新定义。汇编语言程序伪指令(指示性语句)符号定义伪指令EQU伪指令如:某程序段包含以下两条指
令 NUM EQU 20 …… NUM EQU 30 NUM EQU 20 …… PURGENU
M NUM EQU 30格式:符号=表达式功能:与EQU伪指令的功能完全相同说明:与EQU指令的区别在于用“=”
定义的符号可被再定义,即允许修改,使用更加方便灵活,但也增加了风险。用“=”定义符号如:某程序段包含以下两条指令 NUM
= 20 …… NUM = 30在汇编语言程序设计中,需要将存储器分成若干段。段定义伪指令有SEGMENT、
ENDS、ASSUME和ORG等。格式:段名 SEGMENT[定位方式][组合方式][类别名] …… ;(段
体) 段名 ENDS说明:任何一个逻辑段都是从SEGMENT开始,以ENDS结束。伪指令SEGMENT和ENDS是段定义语
句的关键字,不能省略,且总是成对出现。语句中段名是必选项,而[定位方式][组合方式][类别名]为可选项,相互之间应隔开。段定
义伪指令段定义语句SEGMENT和ENDS定位方式:说明该段的起始地址边界规则 PAGE——指定起始地址的低8位是0,称
页边界 XXXXXXXXXXXX00000000B PARA——指定起始地址的低4位是0,称段边界(缺省) XX
XXXXXXXXXXXXXX0000B WORD——指定起始地址的低2位是0,称字边界 XXXXXXXXXXXX
XXXXXX00B BYTE——指定起始地址为任意值。 XXXXXXXXXXXXXXXXXXXXB(PARA缺
省方式下可以省略)组合方式:连接程序时设定本段与其它同名段的连接方式,适用于模块化程序设计 PUBLIC ——同名段依次连接
起来,形成一个连续的段。 COMMON——同名段共用同一起始地址,相互重叠段的长度,取最长段的长度 AT表达式——定位在表
达式所指定的段地址(代码段例外) STACK ——同名段构成一个连续的堆栈段,自动初始化SP。 MEMORY——表示本段定位在
所有段的地址之上,高地址处。 无(NONE)——不与任何段相连,各段有独立段基址(缺省方式)类别名:用单引号括起来的字符串。
类别名不超过40个字符,用于控制段的存放次序。MASM将所有类别名相同的逻辑段按上述组合方式进行连接。【例】DATA
SEGMENTPARAPUBLIC''DATASEG''…DATA ENDSSTAK SEGMENTSTAC
K…STAK ENDS定义了三个段,段名分别为DATA、STACK、CODE。CODE SEGMENT''CODESE
G''…CODE ENDS段分配伪指令用来完成逻辑段与段寄存器的分配。格式:ASSUME段寄存器
:段名[,段寄存器:段名,…]功能:说明源程序中定义的逻辑段由哪个段寄存器去寻址。段寄存器可以是CS,SS,DS,ES。说明:
ASSUME是伪指令,是语言中的关键字,不可省缺;段寄存器名后面须有冒号。如果分配的段名不止一个,则应用逗号分开。段名应是用SEG
MENT/ENDS伪指令定义过的段名。 ASSUME语句放在代码段内,作为代码段的第一条指令。 ASSUME语句只是将逻辑段与
段寄存器关联起来,并没有给段寄存器赋值。段寄存器的赋值应在程序中用指令显式指定。段分配伪指令语句ASSUMEDATA SE
GMENT ;定义一个名为DATA的逻辑段 VAR1 DB 00H,11H,22H,33H;定义字节型变量VAR1
DATA ENDS ;逻辑段DATA结束STAK SEGMENTSTACK ;定义一个名为STAK的堆栈
段 DW 100 DUP(0) ;段长度为100字STAK ENDS ;STAK段结束 CODE
SEGMENT ;定义一个名为CODE的逻辑段 ASSUMECS:CODE,DS:DATA,SS:STAK
;对各段进行段寄存器分配 START: MOV AX,DATA …… ;CODE
段内程序 ……CODE ENDS ;CODE段结束 END START (1)CS的装入
CS和IP用于指向程序中即将执行的指令地址,由汇编程序负责装入,但需要在编程时在代码段第一行加入一个标号,并在最后一行用EN
D伪指令结束该标号。CODE SEGMENT ;定义逻辑段CODE ASSUMECS:CODE,…… ;分
配段寄存器START: ;定义标号START ……CODEENDS ;CODE段结束
END START ;定义标号START结束段寄存器的装入(2)DS、ES的装入DS、ES的装入方式相同,即
直接将段基址通过通用寄存器装入段寄存器。DATAl SEGMENT ;定义逻辑段DATA1 ……DATAl END
SDATA2 SEGMENT ;定义逻辑段DATA2 ……DATA2 ENDSCODE SEGMENT ;定
义逻辑段CODE ASSUMECS:CODE,DS:DATAl,ES:DATA2;分配段寄存器START: ;C
ODE段值将自动存入CS MOV AX,DATAl MOV DS,AX ;将DATA1段基址装入DS MOV AX,
DATA2 MOV ES,AX ;将DATA2段基址装入ES ……CODE ENDS ENDS
TART(3)SS的装入SS段寄存器的装入有两种方法。①在段定义时将组合方式定义为STACK,并在ASSUM
E语句中,将堆栈段分配给段寄存器SS。汇编程序将该堆栈段的基址自动装入到SS段寄存器中。SACK SEGMENT STACK
DW 100 DUP(?)SACK ENDS……CODE SEGMENT ASSUMECS:C
ODE,SS:SACK ;自动装入SS,SP……SACK2 SEGMENT DW 100 DUP(?) TOP
LABELWORDSACK2 ENDS……CODESEGMENT ASSUMECS:CODE,SS:S
ACK2START: …… MOV AX,SACK2 MOV SS,AX ;装入SS MOV SP,OFFSET
TOP ;装入SP ……②如果在段定义伪指令的组合类型中未选用“STACK”参数,则可用程序实现对SS和SP的装入。在程
序设计中,常把具有一定功能的程序段设计成一个子程序,或称为过程。格式: 过程名PROC [NEAR/FAR]
…… RET …… 过程名ENDP功能:定义一个过程,名字由“过程名”指定说明:过程名不可省缺,
其命名规则同标识符。过程的开始(PROC)和结束(ENDP)应使用同一个过程名。NEAR表示近过程,FAR表示远过程,缺省为NEA
R。过程定义伪指令AddProc PROCNEAR XORAX,AX AD
DAX,[SI] ADDAX,[SI+2] RETAddProcENDP(1)LABEL伪指令
LABEL伪指令用于给已定义的变量或标号取一个别名,并可重新定义它的类型或距离属性。格式:名称LABEL
类型/距离别名功能:VARB LABEL BYTEVARW DW 1234H,5678H改变调用距离:
FNEXT LABEL FARNEXT: MOV AX,[BX]其它伪指令(2)属性指定操作伪指令(THIS)
格式:THIS类型功能:用来给后续数据定义新的类型。(3)定位伪指令(ORG)和当前位置计数器($
)在汇编程序时,为了指示程序中指令或数据在相应段中的偏移地址,可使用定位伪指令和当前位置计数器。①定位伪指令
ORG格式:ORG表达式功能:指定后续代码或数据的起始(偏移)地址。DATA SEGME
NT ORG 1000H VAR1 DB00H,10H,20H,30H ORG 2000H VAR2 DW
10DUP(?)DATA ENDSVARB EQU THIS BYTEVARW DW 1234H,5678
H②当前位置计数器$在汇编程序时,用$表示当前位置计数器(偏移地址),方便程序编写和地址计算。DATA SEGM
ENT STRING1 DB “BCDEFGHIACDFEB” COUNT=$-STRING1DATA E
NDS(4)END伪指令格式:END标号名称功能:表明源程序结束说明:一般放在源程序的最
后一行,一个程序模块只允许有一个END语句格式:.MODEL模式类型功能:指定数据和代码允许使用的长度。说明:模式
类型也称为内存模式、寻址模式,它表示如何在内存中为程序、数据、堆栈等分配空间并存取它们。共有7种模式类型。TINY:微模式(C
S=DS=SS=ES)。所有数据及代码放在同一个物理段中,数据访问都为NEAR类型,整个程序小于64KB,生成的可执行文件扩展名为
.COM,只在DOS操作系统下使用。SMALL:小模式(SS=DS=ES≠CS)。所有数据放在一个64KB的物理段中(包括数据和
堆栈),所有代码则放在另一个64KB的物理段中。简化段伪指令内存模式语句.MODELMEDIUM:中模式(数据小,程序大
)。所有数据放在一个64KB的物理段中,代码超过64KB时可以放在多个物理段中,程序中转移或调用类型可以为FAR型。COMPAC
T:紧凑模式或压缩模式(数据大,程序小)。所有代码放在一个64KB的物理段中,程序中的转移或调用类型为NEAR。数据超过64KB时
可以放在多个物理段中。LARGE:大模式(数据大,程序大)。代码和数据都可以超过64KB,可放在多个物理段中,数据和代码都可以是
远程访问类型。HUGE:巨模式(数据巨大,程序大)。数据段中单个数据项的大小可以超过64KB,代码段允许超过64KB,即有多个代
码段和数据段,都允许远程访问。FLAT:平面模式。所有代码和数据被放在一个段中,但段内地址不再是16位,而是32位,所以整个程序
可达4GB大小。MASM6.0以上汇编程序支持,可以在WINDOWS操作系统下使用。简化段程序的段定义语句用伪指令方式
定义不同类型的段,段不需要使用ENDS指令结束,由下一段定义开始或程序结束来表示。简化段定义语句①代码段定义格式
:.CODE[段名]功能:表明其下面的指令是代码段部分。段名用于区分不同的代码段,省略情况下默认段名为_TEXT。
②堆栈段定义格式:.STACK[字节数]功能:定义一个用户自己的堆栈段。说明:堆栈段的默认段名为STA
CK,“字节数”如果不写则默认为1KB。③数据段定义格式:.DATA[段名] .DATA?[段名]
.CONST[段名]功能:表明其下面内容是数据段定义的变量或存储空间预留。说明:一个源程序中可以有多个“.DA
TA”定义的数据段,相当于完整段程序中定义多个同名的数据段。 “.DATA?”指令定义未初始化的数据段。 “.CONST”指令
定义一个常数数据段。 段名用于与其他数据段区分,省略情况下默认段名分别是_DATA/_BSS/CONST。格式:.EXIT
功能:退出本程序,返回DOS操作系统。说明:其功能可以用 MOV AH,4CH INT 21H 两条指令来代替。
程序开始伪指令.STARTUP格式:.STARTUP功能:用于指示程序开始位置,自动对DS,SS,SP寄存器进行初始
化程序返回伪指令.EXIT宏是程序设计的一种方式,它把一段程序代码用一个特定标识符(宏名)来表示。在编写程序时
,程序员可以使用该标识符(宏名)来代替这一段程序,从而减少重复代码的编写工作。(1)宏的定义宏定义语句与过程定义语句
相似。其格式与功能如下:格式: 宏名 MACRO[形参1,形参2,……] ;定义宏名 …… ;宏体 E
NDM ;宏定义结束功能:定义一个宏说明:宏体可以是汇编语言所允许的任何指令或伪指令语句汇编语言宏指令AD
DTHREE MACRO V0,V1,V2 ;定义名为ADDTHREE的宏,带三个参数 MOVAX,V0 ;将第一个
参数值赋给AX ADDAX,V1 ;将AX与V1相加 ADDAX,V2 ;将AX与V2相加
ENDM ;宏定义结束(2)宏的引用宏可以在程序中被引用,引用时其格式如下:格式:宏名[实参1,实参
2,……]功能:引用宏名对应的相应代码,并传递相关参数。ADDTHREE [SI],20,[DI] MOVAX
,[SI] ADDAX,20 ADDAX,[DI](3)宏的嵌套定义宏嵌套可以有两种形式,一种是在宏定义内引用其它宏,另一种是宏定义内定义其他宏。①宏定义内引用其它宏【例】 MULTI MACROCOND ;外层宏定义 …… ABSCOND ;引用前面已经定义过的宏ABS …… ENDM②宏定义内定义其他宏【例】 THREEOPMACRO MNAME,OP ;外层宏定义 MNAME MACROOP1,OP2,OP3;内层宏定义 MOV AX,OP2 OP AX,OP3 MOV OP1,AX ENDM ENDM
献花(0)
+1
(本文系依米荷阳首藏)