整个备考过程:
九、80X86宏汇编语言的伪指令语
(一)基本宏汇编语言的伪指令语句
8086/8088宏汇编有近60条伪指令,其大体分类如下表所示。
表8086/8088伪指令分类
类别 伪指令 类别 伪指令
符号定义伪操作 EQU,=,LABEL
宏处理伪操作 MACRO,ENDM,EXITM LOCAL,REPT,IRPC,IRP,PURGE
变量定义伪操作 DB,DW,DD,DQ,RECORD,STRUC 条件伪操作 IF,ENDIF,IF1,IF2,IFNB,IFE,IFDIF,IFNDFE IFIDN,ELSE
段定义伪操作 SEGMENT,
ENDS GROUP,
ASSUME,ORG
过程定义伪操作 PROC,ENDP 列表伪操作 PAGE,TITLE, SUBTTL,LIST, XLIST,%OUT
模块定义与通信 EXTRN,PUBLIC
NAME,END 其他 COMMENT,RADIX INCLUDE EVEN
1.符号定义
符号定义伪指令可用于为表达式赋予一个符号名,表达式可以是常量、变量、标号、指令语句和字符等。在程序中,任何需要这种表达式的地方都可以用被赋予的符号名来代替它。常用的符号定义语句有等值语句(EQU)和等号语句(“=”)。
(1)等值语句
格式:符号名 EQU 表达式
功能:用符号名代替右边的表达式的值。
说明:表达式可以是一个值、新符号名、可执行的命令或表达式的值。
注意:在同一个源程序中,EQU语句定义的符号不能再赋予不同的值,即不能再重新定义。
(2)等号语句
格式:符号名=表达式
功能:等号语句的功能和EQU语句类似,不同之处是它允许对符号名再定义。
2.变量定义
变量定义语句使用伪指令DB、DW、DD、DF、DQ和DT。格式:变量名 {DB|DW|DD|DF|DQ|DT}表达式
功能:在内存中分配一块以变量名为名字的一个或多个字节/字/双字/长字/4字/10字的数据储区,并填入由伪指令给出的数据。说明:
①变量名是可选择的,它表示定义的一块内存单元数据区的名字。
②花括号{}中的项是可选择的伪指令,每次定义只能选择其中一种。各伪指令的意义为:
●DB 定义字节数据存储区
●DW 定义字数据存储区
●DD 定义双节数据存储区
●DF 定义长字数据存储区
●DQ 定义4字数据存储区
●DT 定义10字压缩BCD码数据存储区
③表达式是伪指令的操作
数,它可以是数值表达式、地址表达式、ASCII码表达式、?表达式或n DUP表达式。说明如下:
●数值表达式
数据在存储区中存放时,左边的数据项占较小地址,右边的数据项占较大的地址;对于非DB定义的数据,高位字节占据较大地址,低位字节占据较小地址。
●地址表达式
地址表达式的运算结果是一个地址,因而只能使用伪指令DW和DD。这时,存储单元中存放的是存储器的地址值。如果使用DW,则存放的是段内地址偏移量;如果使用DD,则存放段地址和地址偏移量。
●ASCII码字符串表达式
使用伪指令DB可以定义用单引号括起来的字符串,它为字符串的每个字符分配一个存储单元,并依字符串从左到右的顺序,将字符的ASCII码按地址递增顺序放在内存中
●?表达式
表达式?号时,表示符号名无确定值。汇编程序遇到?号时,它仍然为数据项分配存储单元,但不对它初始化。
●n DUP(?)
格式:数值表达式 DUP 项或项表
数值表达式的值表示重复的次数,其各项必须预先定义。项或项表表示重复内容,可以是?、数值、数值表达式、字符或重复子句。项表中的各项用逗号隔开。
当重复子句为DB、DW、DD、DQ和惟一操作数且项为?时,将不初始化数据区,该数据氏的原存信息保持不变。当重复句是惟一操作数时,定义的变量具有LENGTH和SIZE属性。
3.标号定义伪指令
格式:符号名 LABEL 类型
功能:将紧跟在本伪指令语句后的标号、操作码、过程或变量建立新的符号名,并刷新其类型属性。对标号、操作码或过程,其类型为NEAR、FAR;对变量,其类型为BYTE、WORD、DWOBD、FWORD、QWORD或TBYTE。
说明:LABEL伪指令提供了另一种定义标号或变量名的方法,但它并不为符号名分配存储空间 。
4.段定义语句
8086/8088的存储器是分段的,因此使用段定义语句来组织程序和利用存储器。常用的段定义伪
指令有:SEGMENT、ENDS、ASSUME、ORG、PAGE、PUBLIC、TITLE、SUBTTL等。
(1)SEGMENT和ENDS
SEGMENT和ENDS语句将汇编语言源程序分成段。
格式:
段名 SEGMENT[定位类型][组合类型][‘类别’]
┆
语句段
┇
段名 ENDS
说明:段名是由自己指定的为该段起的名字。定位类型、组合类型是给段名的属性,用来指出汇编程序为该段分配的存储器的起始地址;类别名则指出段的类别。用方括号括起来的项可以缺省。
①定位类型
用于指定该段地址中的5种可供选择段起点的边界类型,如下表所示。
定位类型
定位类型 含 义
BYTE(字节) 段的起始地址可以任意
WORD(字)
段的起始地址必须为偶数,即该地址的最低二进制位应为0
DWORD(双字) 段的起始地址必须为4的倍数,即该地址的最后2位二进制位应为0,通常总是把DWORD用于80386的32位段中
PARA(节) 段的起始地址必须为16的倍数,即该地址的最后4位二进制位应为0
PAGE(页) 段的起始地址必须为256的倍数,即该地址的最后8位二进制位应为0
这个类型可以为标号或变量赋予绝对地址,以便程序以标号或变量的形式存取这些存储器单元的内容。通常情况下,在AT类型的段中不定义指令或数据,只是说明一个地址结构。②组合类型
用来告诉连接程序LINK,本段与其他模块中同名段的组合连接关系。共有下表所示的5种可供选择的组合类型。如果此属性缺省,则表示该段是独立的,不与其他同名段发生联系,并有自己的段起始地址。
组合类型
组合类型 含 义
PUBLIC 链接程序LINK将不同模块中具有该类型且段名相同的段连接到同一个物理存储段中,使它们公用一个段地址
STACK 与PUBLIC的处理方式一样,只是连接后的段为堆栈段,链接程序LINK在链接过程中自动将新段的段地址送到堆栈段寄存器SS,将新段的长度送到堆栈指针寄存器SP。如果在定义堆栈时没有将其说明为STACK类型,在这种情况下就需要在程序中用指令给堆栈段寄存器SS、堆栈指针寄存器SP置值,这时链接程序LINK会给出一个警告信息
COMMON 产生一个覆盖段。链接程序LINK为该类型的同名段指定相同的段地址。段的长度取决于最长的COMMON段的长度。段的内容为所连接的最后一个模块中COMMON段的内容及其没有被覆盖到的前面COMMON段的部分内容
MEMORY 链接程序LINK不单独区分MEMORY类型,它把MEMORY与PUBLIC类型同等对特。MASM程序允许使用它,主要是为了与其他支持Intel MEMOˉRY类型的连接程序兼容
AT表达式 链接程序LINK将具有AT类型的段装在表达式值所指定的段地址边界上
③类别
用于控制段的存放次序。它可以是任何合法的名称,但必须用单引号括起来。连接程序LINK只使同类别的段发生关系,并将它们存放在连续的存储空间中。若“类别”选择项缺省,则表明该段类别为空。
(2)ASSUME语句
格式:ASSUME 段寄存器:段名[,段寄存器:段名,]
功能:告诉汇编程序,程序的段结构和在各种指令执行时访问哪一段。段寄存器只能是CS、SS、DS、ES中的一个,段名是由伪指令SEGMENT/ENDS语句中定义的段名。注意:
●代码段寄存器CS只能用于有程序的段。代码段寄存器CS所对应的段名必须在该语句之前有定义,因此,ASSUME语句一般都设置于代码段内,放在段定义语句之后。
●堆栈段寄存器SS只能与堆栈段相对应。
●ASSUME语句是说明性语句,除主程序的代码段及最后一个椎栈段外,其余段寄存器的初值均由用户在程序中设置。
(3)组定义伪指令 GROUP
格式:组名GROUP 段名[,段名,……]
功能:将GROUP定义符后指定的所有段分配在一个64KB的物理存储器段中,并赋予该段一个名字———组名。说明:
●组名是用户自己定义的名字,是指出组的起始地址的一种符号。这个符号必须是惟一的,不能与任何标号、段名及变量名等同名。
●段名是用SEGMENT语句定义的或者由SEG运算符得到的段名。
●组定义语句不影响各段的次序,因此组内各段不一定要连续存放,但它们都必须包含在64KB物理存储器段中。
●当源程序结构需要多个逻辑段时,使用该语句可节省段寄存器。
●实际应用中最好是让代码段为一组,堆栈段为一组,数据段为一组或两组,但组中各段所占用的内存储器的总量不超过64KB。
(4)指定地址伪指令 ORG格式:ORG 表达式
ORG $+偏移地址
功能:指定该语句之后程序段或数据块的起始地址的偏移量,即语句表达式的值作为起始地址,连续存放程序和数据,直到下一个ORG语句为止。
5.过程定义伪指令
在程序设计中,常把具有一定功能的程序段设计成为一个过程。过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程定义语句的格式:
过程名 PROC [NEAR或FAR]
┇
(语句)
┇ RET
过程名 ENDP说明:
●过程名是给过程起的名字,调用过程时,过程名起标号的作用。
●伪指令PROC和ENDP必须成对出现,限定一个过程,并说明该过程是NEAR过程还是FAR过程。
●在宏汇编中,过程调用和从过程返回使用CALL和RET。
●有两种调用方式:段内调用和交*调用。如果以用段内CALL指令调用过程则必须用段内RET指令返回,这样的过程是NEAR过程,用段交*CALL指令调用过程,则必须做段交*RET指令返回,这样的过程是FAR过程。
●在一个过程中可以有多于一个的RET指令,并且过程中最后一条指令可以不是RET,但必须是一条转移过程中某处的转移指令。
●主程序和子程序都可以作为一个过程。
6.结束语句
格式:END 表达式
功能:结束整个源程序。
说明:表达式必须产生一个存储器地址。这个地址是当程序执行时,程序第一条要执行指令的地址。
#p#
(1)格式控制伪指令
格式控制伪指令有PAGE,TITLE和SUBTTL。①PAGE
一般为程序的第一语句,它指定汇编程序所产生的列表文件每页的行数和每行的字符数。格式:PAGE 参数1,参数2
说明:参数1表示每页行数,参数2表示每行字符数。②TITLE
用来为程序指定一标题,以后的列表文件会在每页第一行打印这个标题。格式:TITLE 正文③SUBTTL
用于为程序指定一个小标题,打印在每一页的标题之后。格式:SUBTTL 正文
(2)列表控制伪指令
列表控制伪指令很多,主要有:
①.LALL,.SALL和.XALL这是针对宏指令的伪指令。格式:.LALL/.SALL/.XALL说明:
●.LALL 伪指令用于对所有宏汇编列出完整的文本。
●.SALL 伪指令用于删除宏指令所产生的所有列表。
●.XALL 只将宏扩展中产生目的代码的源程序列表。
②.LIST和.XLIST格式:.LIST/.XLIST说明:
●.LIST 是默认伪指令,对所有源程序进行列表直到遇到.XLIST伪指令止。
●.XLST 对所有源程序不产生列表直到遇到.LIST伪指令为止。上述伪指令只用于汇编产生.LST文件时起作用。
8.模块定义伪指令和通信伪指令
在程序设计中,可以将一个复杂的程序分成若干个程序模块,每个模块在物理上和逻辑上都是相对独立的,可对它们分别进行编写和调试。即对所有模块汇编完后,再由链接装配程序LINK连接成一个完整的可执行程序。模块定义和通信指令则是实现模块划分、命名及不同模块中数据共享等的说明和记号。
(1)模块定义语句
模块定义使用NAME和ENDD两条伪指令。语句格式:
NAME 模块名 (语句)ENDD 表达式说明:
●模块名是任选的为本次汇编产生的目的模块所起的名字,是NAME的操作数。
●ENDD表示源程序到此结束。同时,在主模块中ENDD后允许有表达式,其他它模块只书写END。
(2)PUBLIC伪指令
该伪指令定义可供其他模块引用的符号。格式:PUBLIC 符号表
说明:符号表的各项用逗号隔开,符号可以是符号常量、变量、标号或过程名。
(3)EXTRN伪指令
EXTRN伪指令的功能是用于声明当前模块使用的哪些标识符在其他模块内定义。
格式:EXTRN 符号:类型[,符号:类型,……]
说明:符号可以是符号常量、变量、标号或过程名;类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS。各项由逗号隔开。
(二)高级汇编伪指令语句1.结构和记录
(1)结构
①结构类型数据定义伪指令
80x86宏汇编使用伪指令STRUC和ENDS建立一种结构类型的数据,然后通过结构类型数据的预置,便可方便地访问结构中的各数据项,而不需要对操作数地址表达式进行繁锁的计算。 结构类型数据定义的格式: 结构名 STRUC
┆
字段名 数据定义伪指令定义符 表达式
┆
结构名 ENDS
说明:结构类型数据是用STRUC和ENDS括起来的数据定义语句序列,这时数据定义语句中的符号称为字段名。注意:
●定义结构时,STRUC和ENDS必须成对出现,缺一不可。
●结构名是为结构起的名字,是任意选定的。
●同时在同一结构定义中,字段名不得重名。
②结构变量说明与赋初值
结构类型数据的定义只是告诉汇编程序已存在这样一种形式的变量,还必须对结构进行存储分配和预置后才能真正产生结构数据的变量。结构类型数据预置的格式:
结构变量名 结构名 <字段值表>说明:
●DATAMAX和DATATXN是结构变量名。
●结构变量名是任意的,由程序员自行设定。
●结构变量名与具体的存储空间和数据相联系,在程序中可直接引用。
●字段值表用来给结构变量赋初值,字段值必须用尖括号括起来,其排列顺序和类型应该与结构定义时的各字段相一致,各字段值之间用逗号隔开。如果采用定义结构时的初值,则仅写一个逗号;若所有字段采用定义时的初值,则仅写一对尖括号。
注意:并不是所有的字段都可以重新赋初值,只有一项数据的字段可重新赋值。在程序中引用结构变量,可直接写结构变量名:引用结构变量的某一字段时,要采用下述格式:结构变量名.字段名
(2)记录
记录是一种处理按位计算信息的数据类型。记录定义的格式:
记录名 RECORD 字段名:宽度[=表达式][,……]说明:
●记录名和字段名必须具有惟一性;
●宽度表示字段所占的位数(1~16位),如果各字段的宽度和大于8位,那么汇编程序按字处理,否则按字节处理。若总值数少于8位或16位,则所有字段都右对齐到字或字节的最低有效位置。表达式赋给相应字段的初值,是可选择的。
●记录的各字段宽度之和不得大于16位。记录也必须经过预置才能产生记录类型数据变量,才能真正占有内存。记录预置的格式:
记录变量名 记录名 <字段值表>
说明:字段值表是赋给各字段的初值,必须用尖括号括起来,表中各项间用逗号分隔,各项顺序应与记录定义时相一致。若某字段采用时的初值,则该字段用逗号表示;若各字段均采用定义时的初值,则仅用尖括号。
对记录进行操作的专用操作符有3个,即:记录字段名,WIDTH和MASK。①记录字段名
这个操作符无操作数,可直接引用,它的结果是一个立即数,表示该字段的最低位移到所在记录最右边(0位)所需的移位次数。②WIDTH
返回记录或记录某字段的宽度。
格式:WIDTH 记录名或记录字段名③MASK
格式:MASK 记录字段名
MASK的结果是一个8位或16位二进制数,这个二进制数中相应于该字段的各位均是1,其余各位均是0。
记录操作符可以与运算符NOT、OR、AND、SHL、SHR配合使用。
关于记录、记录字段及记录变量的调用,由于记录有自己专用的操作符,故利用这些操作符可对记录及其字段进行操作。
2.宏指令
在汇编语言程序中,有的程序段有时要多次使用,为了使在源程序中不重复书写这个程序段,可以用一条宏指令来代替,在汇编时由汇编程序产生所需的代码。宏指令的使用过程是宏定义、宏调用和宏扩展。
(1)宏定义
宏指令的定义格式:
宏指令名 MACRO[形式参数]┆(宏体) ENDM说明:
●宏指令名是给宏指令起的名字,MACRO是宏定义的定义符,ENDM是宏定义的结束符,两者必须成对出现。
●MACRO和ENDM之间的指令序列称为宏体,即用宏指令要代替的程序段。宏指令具有接受参数的能力,宏体中使用的形式参数必须在MACRO语句中出现。当有两个以上参数时,需用逗号隔开。
●在宏指令被调用时,这些参数被给出的一些名字或数值所取代。
(2)宏调用经过宏定义后,在源程序中的任何位置可以直接使用宏指令名,实现宏指令的调用,称为宏调用。宏调用的结果是将汇编程序翻译成该宏定义的程序段,而产生的目标代码拷贝到调用点。宏调用的格式:
宏调令名(参数,……)
(3)宏扩展
在汇编宏指令时,宏汇编程序将宏体的指令插入到宏指令所在的位置上,并用实在参数代替形式参数,同时在插入的每一条指令前加一个“+”号,这个过程称为宏扩展。
(4)常用宏指令
80x86宏汇编中常用宏指令的格式及功能如下表所示。
常用宏指令
名称 格式 功能
MACRO 宏定义伪指令
PURGE PURGE宏指令名[…]
其功能是取消宏指令名的定义。一个PURGE指令可同时取消多个宏定义
REPT REPT<表达式> ┆(指令体)ENDM 其功能是重复执行指令体所包含的话句,重复次数由表达式的值确定
IRP IRP形式参量,(参数表) …(指令体)ENDM 重复执行指令体内所包含的语句。重复次数由参数表中参数的个数决定。参数表中参数必须用<>括起来,参数间用逗号分隔。每重复一次,依次用参数表中的参数代替形式参数
IRPC IRPC形式参数,字符串 ┆(指令体)ENDM 功能与IRP相同,只是用字符串代替IRP中指令中的参数表
3.重复汇编伪指令
这是重复汇编某一语句序列的伪指令,它可以出现在宏定义中,也可以单独出现在源程序中,注意,重复汇编是在程序汇编期间对某些语句进行重复汇编,而不是在程序运行期执行重复操作。重复汇编伪指令有以下3种形式:
(1)格式1
REPT<表达式>
┆ ;需重复的语句组
ENDM
这种宏指令用于重复块次数确定的伪操作,它表示按表达式所指定的次数,重复REPT和ENDM之间的语句块,表达式的取值范围是0~65535。
(2)格式2
IRP<形式参数>,<实在参数1,实在参数2,……>
┆ ;需重复的语句组
ENDM
这种宏指令用于带立即数的重复伪操作。实在参数是用户指定的立即数,它的个数就是重复次数,每重复一次,就用一个实在参数替代形式参数。
(3)格式3
IRPC形式参数,<字符串>
┆ ;需重复的语句组
ENDM
这种宏指令用于带字符串的重复伪操作,重复次数由字符串的个数确定,每次重复,依次用字符串中的一个字符替代形式参数,直到字符替代完毕为止。
4.条件汇编伪指令
80x86宏汇编提供了条件汇编功能和条件汇编伪指令,如下表所示。
条件汇编伪指令
IFNB<参量>
格 式 功 能
IF(表达式) 若表达式值不为0,则条件为真
IFE(表达式) 若条件表达式值为0,则条件为真
IF1 当汇编程序处在对源程序进行第一次扫描过程时,条件为真
IF2 当汇编程序处在对源程序进行第二次扫描过程时,条件为真
IFDEF<符号> 若指定符号已被定义或由EXTRN指令进行外部说明,则条件为真
IFNDEF<符号> 若指定符号未定义或未由EXTRN指令进行外部说明,则条件为真
IFB<参量> 若参量为空格,则条件为真
B<参量> 参量不是空格时,条件为真
IFIDN<参量1>,<参量2> 当参量1的串与参量2的串相同时,条件为真
IFIDF<参量1>,<参量2> 当参量1的串与参量2的串不同时,条件为真
各种条件汇编语句用法的一般格式为:
IF ×× ARGUMENT
<语句体1>
[ELSE] (任选)
<语句体2>
ENDIF
其中,IF××是条件伪指令,××用于区别不同种类的条件伪指令。
#p#
(三)伪指令语句的增强与扩充
1.简化段定义伪指令
(1)简化段定义伪指令:完整段定义伪指令和简化段定义伪指令。在MASM5.0以上的汇编语言版本中,既可以使用完整段定义伪指令,又可使用简化段定义伪指令;在低于MASM5.0的版本中,只能使用完整段定义伪指。
简化段定义伪指令如下表所示。
简化段定义伪指令
段语句名 伪指令格式 功 能
代码段语句 .CODE[名字] 定义一个代码段,如果有多个代码段,要用名字加以区分
堆栈段语句 .STACK[长度] 定义一个堆栈段,并形成堆栈段寄存器SS和堆栈指针SP的初值。(SP)=长度,如果省略长度,则(SP)=1024
初始化近程数据段语句 .DATA 定义一个近程数据段,当用来与高级语言程序连接时,其数据空间要赋初值
非初始化近程数据段句 .DATA? 定义一个近程数据段,当用来与高级语言程序连接时,其数据空间只能用“?”定义,表示不赋初值
常数段语句 .CONST 定义一个常数段,该段是近程的,用来与高级语言程序连接, 段中数据不能改变
初始化远程数据段语句 .FARDARA?[名字] 定义一个远程数据段,且其数据语句的数据应赋初值,用来与高级语言程序连接
非初始化远程数据段句 .FARDARA[名字] 定义一个远程数据段,但其数据空间不赋初值,只能用“?”定义数据,用来与高级语言程序连接
(2)定义内存模式伪指令(MODEL)
在使用简化段定义伪指令时,必须事先说明用户使用的内存模式。格式:MODEL 模式类型[,高级语言]功能:指定数据和代码允许使用的长度。
●程序中凡数据或代码的长度不大于64KB时为近程,否则为远程。近程的数据通常定义在一个段中,对应于物理存储器中的一个段,只要程序一开始将其段值设置在DS中,以后数据的访问只改变偏移值,而不必改变其段值。
通常总是将定义内存模式伪指令语句放在用户程序中其他简化定义伪指令语句之前。可供选择的内存模式有5类,如下表所示。当独立的汇编语言源程序不与高级语言程序连接时,多数情况下只用小模式。
内存模式的类型
内存模式 说 明
Small 小模式,程序中的数据放在64KB的数据段内,代码放在64KB的代码段中,为近程
Medium 中模式,数据为近程,允许代码为远程
Compact 压缩模式,代码为近程,允许数据为远程
Large 大模式,允许数据和代码为远程,但一个数据段不能大于64KB
Huge 巨型模式,允许数据和代码为远程,且数据语句所用存储空间可以大于64KB
2.方式选择伪指令
80x86汇编语言是在8086/8088汇编语言的基础上逐步发展并向上兼容的,因此在对源程序进行汇编时,汇编程序首先要区分当前的源程序是针对80x86系列的哪种微处理器而执行的,为此提供了微处理器方式选择伪指令。又因为MASM5.0中对应每种微处理机的指令系统都有一个汇编执行语句集合,简称指令集,因此微处理器方式选择伪指令,实质上也就是指令集选择伪指令。方式选择伪指令的格式和功能下表所示。
方式选择伪指令的格式和功能
伪指令格式
功 能
.8086
这是一种默认方式,它告诉汇编程序只接受8086/8088指令
.286/.286C 它告诉汇编程序只接受8086/8088指令以及80286非保护方式下的指令,用.8086可以删除该伪指令
.286P 靠诉汇编程序接受8086/8088以及80286的所有指令(不仅包括保护方式下的指令,也包括非保护方式下的指令),通常只有系统设计人员才使用该伪指令,可以使用.8086伪指令删除
.386/.386C 告诉汇编程序接受8086/8088指令,以及80286/80386非保护方式下的指令。在这种方式下,将禁止所有保护方式下的指令出现,否则将出错
.386P 除具有.386/.386C功能外,还允许汇编保护方式下的80286/80386指令,通常只有系统设计人员才使用该伪指令。可以使用.8086伪指令删除
.8087 选用8087指令集,并指定实数的二进制码为IEEE格式
.287 选用80287指令集,并指定实数的二进制码为IEEE格式
.387 选用80387指令集,并指定实数的二进制码为IEEE格式
.486/.486C 允许汇编非保护方式下的80486指令。MASM6.0可以使用
.486P 允许汇编80486的全部指令。MASM6.0可以使用
上述伪指令语句一般放在源程序的开头
【编辑推荐】