520 likes | 668 Views
及接口技术. 微型计算机原理. 授课教师: 周茂霞. 4. 3 伪操作命令与宏指令. 在指示性语句中使用的伪操作命令 , 无论其 表 示格式 或 其 在 语句中的位置 , 都与 CPU 的汇编指令相类似 , 但是它在汇编 过 程中不 产 生目标 代码 , 只是汇编过程中对汇编 程序发布 命令 , 为汇编程序提供某些编辑信息 ,使汇编过程产生某些特定的操作。 这一类伪操作命令形式上类似于指令 , 但又不同于 CPU 的指令 , 故而称之 为 伪操作指令 。. 4.3.1 数据定义与存储器分配伪指令. 一、 定义数据字节命令 DB (Define Byte).
E N D
及接口技术 微型计算机原理 授课教师: 周茂霞
4. 3 伪操作命令与宏指令 在指示性语句中使用的伪操作命令,无论其表示格式或其在语句中的位置,都与CPU的汇编指令相类似,但是它在汇编过程中不产生目标代码,只是汇编过程中对汇编程序发布命令,为汇编程序提供某些编辑信息,使汇编过程产生某些特定的操作。 这一类伪操作命令形式上类似于指令,但又不同于CPU的指令,故而称之为伪操作指令。
4.3.1数据定义与存储器分配伪指令 一、定义数据字节命令DB (Define Byte) 功能:是给变量分配字节常数或字符串(字符串用ASCII码表示)定义字节变量, 每个操作数都为一个字节,占用一个存储单元。操作数之间可以用逗号分隔。 若操作数是字符串符号,那么必须用‘’括起来,。每个字符本身用一个ASCII表示。 例如: DATA1 DB 12H,34H,‘AB’,?,?, DATA1
4.3.1数据定义与存储器分配伪指令 二、定义数据字命令DW(Define Word) 功能:定义数据字命令,其后每一个操作数为一个字(16位),占用两个存储单元。该命令对应的存储变量类型属性为WORD。其后的操作数可以是数据常数或者字符串,字符串的字符个数不能超过两个。 例如: DATA2 DW 12H,3723H,?,‘AB ' 其后每个操作数占用两个存储单元,高字节在存储单元高地址内,低字节在低地址内。 DATA2
4.3.1数据定义与存储器分配伪指令 可以是字符串吗?(x) 三、定义双字命令DD(Define Double word) 功能:其后每一个操作数都是双字(32位数),对应的存储变量为双字型DWORD。其功能是定义变量且给变量分配32位的数据常数。本命令后边可以有多个操作数,每个操作数都是双字(四个字节),放在内存中要占4个存储单元。在内存中存放的顺序为高位数据放到存储器高地址内,低位数据放到低地址内。 例如: DATA3 DD 1234H,5678ABCDH DATA3
4.3.1数据定义与存储器分配伪指令 可以是字符串吗?(x) 四、定义四个字的命令DQ(Define Quadword) 功能对应的存储变量类型属性为QWORD。其功能是定义了四字型变量,且定义64位数据常数或者分配8个字节存储空间。其后的操作可以是多个,每个操作数都是四个字共64位数据。放在内存中要占8个存储单元。在内存中存放的顺序是高位放在存储器的高地址内,低位数据放在低地址内。 DATA4 DQ 0011 2233 4455 8899 H DATA4 DQ 8899 H DATA4
4.3.1数据定义与存储器分配伪指令 五、定义十个字节命令 DT( Define Ten bytes) 对应存储变量的类型为 TBYTE。其功能是定义十字节型变量,且定义了十个字节的压缩BCD码数据,其后的操作数为十个字节的压缩BCD码。 例如:DATA5 DT 1234567890H 经汇编后内存的数据分配如图 DATA5
4.3.1数据定义与存储器分配伪指令 总结 伪指令后边的操作数可以是常数,也可以是表达式或字符串。 (1)如果是字符串,只适用DB、DW伪操作命令,若字符串个数超过两个,只能用DB来进行定义。字符串须用‘’单引号括起来。(2)操作数中“?”只是表明预留出一定的存储单元,在汇编时这些单元不存入任何数据(其内容是随机数)。
4.3.1数据定义与存储器分配伪指令 重复操作符DUP的使用 用DUP定义重复出现的数据 格式:〈操作数〉DUP (操作数) 第一个操作数表示重复次数。 第二个圆括号内表示重复定义的内容,它可以是: (1)一个问号"?",表示该单元不初始化,预留出存储空间。 (2)一个数据常数或者表格。 (3)一个数值表达式。
20H DAT 5个字节 20H 20H 20H 20H RAY1 00H 01H 02H 8个字节 XX 00H 01H 02H XX XX RAY2 4个字节 XX XX XX 01H RAY3 02H 02H 12个字节 02H 02H 05H 01H 02H 02H 02H 02H 05H 4.3.1数据定义与存储器分配伪指令 重复操作符DUP的使用 [例4.21]已知数据段定义如下: DATA SEGMENT DAT DB 5 DUP (2OH) RAY1 DB 2 DUP (0,1,2,?) RAY2 DW 2 DUP (?) RAY3 DB 2 DUP(1,2,3 DUP (2),5) DATA ENDS
20H DAT 5个字节 20H 20H 20H 20H RAY1 00H 01H 02H 8个字节 XX 00H 01H 02H XX XX RAY2 4个字节 XX XX XX 01H RAY3 02H 02H 12个字节 02H 02H 05H 01H 02H 02H 02H 02H 05H 若数据段各个变量为上例定义,那么该段内所有变量具有同一个段属性,其段地址都是DS寄存器中的内容。而且经此定义后也每个变量偏移地址也完全确定下来。 变量DAT的偏移地址为0 变量RAY1的偏移地址为0005H 变量RAY2的偏移地址为OOODH 变量RAY3的偏移地址为0011H
DUP定义的语句相当于定义了一个数组,数组元素由重复定义的内容决定。定义数据的伪指令其后的操作数可以是数值表达式、地址表达式。 例如: A1 EQU 100 A2 DW 25*4*30 ;数值表达式 A3 DB A1;符号数据
4.3.2 符号定义伪指令 符号定义伪指令的功能是可以给表达式命名一个符号名或用来定义某个变量(或标号)的新的类型属性。 符号名:包括汇编语言中使用的变量名、标号名、过程名等。 表达式:可以是数据常数、数值和地址表达式、变量或标号 。
4.3.1数据定义与存储器分配伪指令 1、EQU:符号赋值伪指令 格式: 符号名 EQU表达式 符号名:由用户命名。 表达式:可以是数值表达式、地址表达式、变量或标号。 功能:是给一个表达式赋予一个符号名。 目的:为了便于阅读及修改,汇编语言源程序常用一个符号名代表和表示一个数据、数据地址和指令地址,以简化源程序。 EQU伪指令就是用来对一个命名的符号赋值,但在整个源程序中,每个符号只能赋予一个值。
4.3.2 符号定义伪指令 例如: CR EQU ODH ;符号代表常数 LF EQU 0AH ;符号代表常数 AT EQU ASCII-TABLE ;变量重新命名 DTR EQU 64*1024 ;符号代表数值表达式 ADR EQU AAM ;符号代表一个指令 PORT1 EQU 212 ;符号代表常数 PORT2 EQU PORT1+1 ;符号代表一个表达式 CBD EQU DAA ;CBD代表一个指令 COUNT EQU CX ;COUNT与CX为同义符号 ADB EQU [BP+8];定义为一个寻址方式的表达式 ADB1 EUQ DS:[BP+8];表达一个地址表达式
4.3.2 符号定义伪指令 又如前叙的两个语句: DAT1 EQU WORD PTR DAT DAT2 EQU DWORD PTR DAT 定义了两个符号DAT1和DAT2,赋予这两个符号以新的类型属性。定义了上述符号后,凡在指令中出现这种符号都代表同一个数值或具有相同的含义。 若源程序中需要多次引用一个表达式,表达式比较长, 给这 个表达式赋予一个符号名,用以代替程序中多次引用的这个表达式,使程序简化,且便于修改。 注意:EQU不允许对同一符号名重复定义,每一个符号名仅能赋值一次 。
4.3.2 符号定义伪指令 ①MOV CX,[BP+8] 可写成 MOV CX,ADB ②MOV AL,ODH 可写成 MOV AL,CR ③MOV BX,OFFSET ASCII-TABLE ;可写成MOV BX ,OFFSET AT ④MOV AL,212 可写成 MOV AL,PORT1
4.3.2 符号定义伪指令 2.符号 “=”符号重复赋值伪指令 功能与EQU类似,也可以作为符号赋值操作,但可以对同一个符号进行多次赋值,重新定义。例如: COUNT1 EQU 20H COUNT =30H COUNT =40H 等号“=”赋值语句中允许标号出现: LAB2=LAB1+10
4.3.3 程序模块定义伪指令 一、模块定义伪指令 8086/8088汇编语言源程序采用模块结构和分段结构。 汇编语言源程序模块:一个独立汇编的具有比较规范的完整的汇编语言源程序文件。 目标程序:经汇编后形成的目标程序。 复杂的程序由多个程序员分别编制程序,每个程序员编写一个相对独立的源程序,形成单模块程序,单独汇编,单独调试,最后把各个单模块程序应用连接程序LINK连接起来,形成一个大型的、功能比较强的软件程序,这种程序叫多模块程序。 在宏汇编程序中用模块定义伪指令来定义独立的源程序模块。
4.3.3 程序模块定义伪指令 一、模块定义伪指令 模块名:由程序员命名,以字母开头,最多可用6个字符(或汉字)。 表达式:模块执行时的起始地址(标号表示)。 功能:由NAME开始到END之间定义了一个汇编语言源程序模块。 模块定义伪指令 NAME/END NAME 模块名 〈……模块中所有的语句…… > END 表达式 若一个源程序是多模块程序,只有主模块中END后边加一个表达式,表达式为程序的起始地址。其他子模块,尽加一个END指令(不加表达式)。
4.3.3 程序模块定义伪指令 例如:一个源程序结构框架如下: NAME PROG DATA SEGMENT ……….. DATA ENDS STACK SEGMENT …………. STACK ENDS CODE SEGMENT START :MOV AX,DATA ………..· CODE ENDS END START START:表示程序第一条指令性语句起始地址,也就是整个源程序的起始地址。 NAME开始到END结束:整个源程序模块作为一个独立汇编的单位。
4.3.3 程序模块定义伪指令 整个源程序允许省略NAME ,即无NAME伪指令,则按以下规则对模块进行命名。 (1)若模块中有TITLE语句(打印标题语句),则以TITLE定义的标题前6个字符作为模块名。 (2)若无NAME、TITLE伪指令,则以源程序的文件名作为模块名(即编辑时文件名XXX.ASM)故而NAME并不是完全必要的。 但是常用TITLE,以便用来打印文件时,把相应的标题打印出来。 例如:TITLE EXPROQ-EXAMPLE PROGRAM
4.3.3 程序模块定义伪指令 二、段定义伪指令SEGMENT/ENDS 8086汇编语言源程序采用分段结构,将存储空间分为代码段,数据段、堆栈段和扩展段。源程序分段结构由段定义伪指令来实现。它把源程序中指令和指示性语句分成若干个逻辑段,给每个逻辑段命名一个段名,以便汇编连接时,控制段的定位、组合和连接。
4.3.3 程序模块定义伪指令 代码段 堆栈段 数据段 扩展段 二、段定义伪指令SEGMENT/ENDS 格式: 段名 SEGMENT [定位类型][组合类型][类别] …………….. 段名 ENDS SEGMENT和ENDS定义了一个逻辑段,给逻辑段赋予一个段名,其中段名为段的标识符,用来指出该段的基址(起始地址)。段名由编程者任取。 SEGMENT和ENDS之间称为段体,SEGMENT表示一个逻辑段的开始,以ENDS表示逻辑段的结束。二者必须配对出现,且段名必须保持一致。 段名具有两种属性:段属性及偏移地址属性。
4.3.3 程序模块定义伪指令 二、段定义伪指令SEGMENT/ENDS 段名 SEGMENT [定位类型][组合类型][类别] …………….. 段名 ENDS SEGMENT后边的三个任选项,在上述格式中,放在[ ]方括号内,表示可有可无。它们是给汇编程序及连接程序的命令,以便于定位及组合。一般单模块可以省略三个参数。 当程序规模比较大时,采用多模块程序结构,每个模块程序单独汇编,最后再用连接程序把这些独立汇编而形成的目标模块连在一起,形成一个统一的可执行的代码文件(.EXE).因此在编写每一个模块程序时,必须要考虑段的组合和定位,怎样从各个模块中分散的各个段形成统一的各段。
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 1.定位类型(align) 用来指明每一个段放在内存中该段的起始的物理地址具有什么样的特性,即起始边界地址有何种要求,有四种定位类型: ①PARA--以节为起始地址。指定该段的起始地址必须能被16整除。 如果以20位物理地址表示: 起始地址=XXXX XXXX XXXX XXXX OOOO B=XXXXOH ②BYTE一以字节作为起始地址。指定该段的起始地址可以从内存中任何一个地址开始。 起始地址=XXXX XXXX XXXX XXXX XXXX B=XXXXXH
若定位类型省略,这一个段的定位类型的隐含值即为PARA型。若定位类型省略,这一个段的定位类型的隐含值即为PARA型。 4.3.3 程序模块定义伪指令 二、段定义伪指令SEGMENT/ENDS 段名 SEGMENT [定位类型][组合类型][类别] 1.定位类型(align) ③WORD---以字作为边界。指定该段的起始地址必须是偶数(被2整除). 起始地址=XXXX XXXX XXXX XXXX XXXOB ④PAGE--以页作为边界。指定该段的起始地址必须能被256整除。 起始地址=XXXX XXXX XXXX 0000 000OB=XXXOOH
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 2.组合类型(combine) 又称联合类型。它指示连接程序在连接定位时,本程序模块的各个段如何与其他程序模块各段连接组合起来。多模块程序进行连接时,如何将不同模块中同名段组合起来,并依据组合类型,可将各同名段顺序连在一起或者重叠在一起。 ①NONE--表明该段与其他段不进行组合,将来组成一个单独的段,这是隐含的组合类型,若省略,即为不组合NONE。 ②PUBLIC--若不同的模块中某些逻辑段具有相同的段名并且组合类型 都为PUBLIC ,在连接时,把这些段集中地连在一起,形成一个逻辑段放入内存中,使用同一个段基址。
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 2.组合类型(combine) ③COMMON(公共存储区域)一若不同的模块中的若干个同名段且组合类型均为COMMON,在连接时,各个段具有同一个起始地址而被重叠放在一起。其公共的字节长度等于各同名段中最长的那个段的长度。重叠后的内容为最后一个逻辑段的内容,主要用于数据段、堆找段的组合连接。 ④STACK-这种组合类型仅限于作为堆栈区使用的逻辑段,即这种组合类型的逻辑段,在运行时作为堆栈区的一部分。连接时,把不同模块中具有相同的STACK组合类型的同名段,连接在一起形成一个大的堆栈区,由各个模块共享,即形成一个逻辑段,SS指向堆找段的开始,SP指向堆栈段的顶(即堆栈段结束地址+1处)。
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 2.组合类型(combine) ⑤MEMORY-表示具有这种类型的逻辑段,在连接时,被放在所有逻辑段的最后,即定位在内存中地址最高的地方。若不同模块中有多个MEMORY 组合类型的同名段,汇编程序只将首先遇到的第一个组合类型为MEMORY的逻辑段当作MEMORY类型,其余的段当作COMMON类型处理,与第一个重叠放在一起。 ⑥AT表达式一一这种组合类型后面跟一个常数表达式,表达式的值即为该段的段地址。它允许用户指定该段在存储器中的确定位置,可在某一个固定的存储区域内具有固定偏移地址处定义变量,以变量的形式访问存储单元,但它不能应用于代码段。
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 3.类别(class) 类别名必须放在单引号‘’内。 类别是单引号扩起来的字符串,称为类别名。类别名最长为40个字符,由编程者命名任选。典型的类别名为‘CODE ’、‘DATA ’‘STACK’等。 对不同模块中具有相同类别的段(段名不一定相同),在连接装入时,连接程序依据命令中的先后次序,把其中具有相同类别名的逻辑段依序放在连续的存储区域内,但是各段仍然是独立的,并不组合在一起。 ‘CODE1’‘CODE2’………
4.3.3 程序模块定义伪指令 段名 SEGMENT [定位类型][组合类型][类别] 3.类别(class) SEGMENT/ENDS的段定义语句用来定义各个逻辑段,整个源程序至少有一个代码段。 不同的模块程序中,允许有相同的段名,连接程序不把它看成相同的段。 同一个模块中同名各段必须有相同的类别,以便汇编连接时合并在同一逻辑段中.
4.3.3 程序模块定义伪指令 单模块源程序框架结构如下: NAME EXE_1 DATA_SEG SEGMENT …….. DATA_SEG ENDS STACK_SEG SEGMENT …….. STACK_SEG ENDS CODE_SEG SEGMENT ASSUME Cs :SODE-SEG,DS:DATA-SEG ,ES :STACK_SEG START :….. ……… CODE SEG ENDS END START
4.3.3 程序模块定义伪指令 NAME MOUDULE ;主模块 STSG SEGMENT PARA STACK STA DB 100DUP (?) STSG ENDS DTSG SEGMENT COMMON DAT DW100 DUP(?) DTSG ENDS CDSG SEGMENT PUBLIC START :MOV AX,DTSG CDSG ENDS END START NAME MOUDULE1;子模块 STSG SEGMENT PARA STACK STAl DB 200 DUP(?) ……. STSG ENDS DTSG SEGMENT COMMON DAT1 DW 200 DUP(?) DTSG ENDS CDSG SEGMENT PUBLIC ;子模块的代码段 …… CDSG ENDS 在本程序中,由于代码段同名,依据PUBLIC定位类型将组合成为一个物理段。两个堆找段也将组合成为一个堆找段。因为数据段为同名段,它将以叠加覆盖方式组合成一个物理段。
4.3.3 程序模块定义伪指令 主模块数据段200 BYTE 子模块数据段400BYTE 300BYTE
4.3.3 程序模块定义伪指令 三、ASSUME段寄存器说明伪指令 格式: ASSUME 段寄存器:段名,[段寄存器:段名,…..] 其中段寄存器在CS、DS、ES、SS中选择。 段名即利用SEGMENT定义的逻辑段段名。 ASSUME伪指令构成的语句总是放在代码段的起始位置。 段名是由编程者任意命名的,段名本身不能判别该逻辑段的类型,只有通过ASSUME伪指令,才能告知汇编程序、源程序各逻辑段与各段寄存器之间的对应关系,将一个段寄存器作为某个逻辑段的段基址。
4.3.3 程序模块定义伪指令 三、ASSUME段寄存器说明伪指令 必须说明 ASSUME伪指令只是设定了哪个寄存器指向哪一个逻辑段,并没有给段寄存器装入实际的值。所以,在程序段中,对DS、ES、SS必须利用指令进行装填赋值. CS由系统负责赋值,因此在程序中不予赋值。堆栈段可以不定义,此时堆找操作在系统本身设置的堆核区中进行。 SS :NOTHING:表示以前为段寄存器SS所作的设定已被取消,以后程序运行时不再用到该寄存器。
4.3.3 程序模块定义伪指令 四、ORG伪指令:ORG用来指出其后的程序段或数据块存放的起始地址偏移量。 格式: ORG 数值表达式 例如:ORG 0100H 汇编程序把表达式值作为起始地址,连续存放程序和数据。若无ORG,则从本段起始地址开始连续存放。
4.3.3 程序模块定义伪指令(process) 4.3.4过程定义伪指令 PROC / ENDP 过程定义的格式: 过程名 PROC[类型属性] …………. …………. RET 过程名ENDP;过程结束 ①过程名一过程的标识符,由编程者命名。过程名是子程序起始地址的符号名称。其后不加“:”号,可作为标号使用。 ②类型属性一过程的属性可以是NEAR或FAR。 使用CALL 指令调用时,只引用过程名。 过程体
4.3.3 程序模块定义伪指令 4.3.4过程定义伪指令 PROC / ENDP ③PROC和ENDP成对出现。 RET为返回指令,是过程的出口点,但是RET不一定是过程的最后一条指令,且一个过程可以有多个RET指令,但至少要执行到一个RET指令,它是过程返回到调用处的关键语句。过程可以嵌套。嵌套的深度只受堆找的限制。 PROC与ENDP之间即为过程体,由相应的指令性语句构成的程序段。 过程定义语句PROC和ENDP限定一个过程,并且说明它是一个远过程和近过程。汇编程序依据过程定义语句,当汇编到CALL指令时,知道汇编的是什么样的过程调用,当返回时,知道是什么样的返回。
4.3.3 程序模块定义伪指令 4.3.4过程定义伪指令 PROC / ENDP MY-CODE SEGMENT UP -COUNT PROC NEAR ADD CX,1 RET UP –COUNT ENDP START : ……….. CALL UP -COUNT ………… CALL UP_·COUNT MY-CODE ENDS END START 段内返回
4.3.3 程序模块定义伪指令 SEGA SEGMENT ……… SUBT PROC FAR ………… RET SUBT ENDP ……… CALL FAR PTR SUBT ……... SEGA ENDS SEGB SEGMENT CALL FAR PTR SUBT SEGB ENDS 段间调用 返回 段间调用 返回
格式: 宏指令名 MACRO [形式参数] ……. (指令或伪指令组) ………. ENDM 宏体 4.3.5宏指令语旬 一、宏定义伪指令 MACRO/ENDM MASM宏汇编程序提供了一种功能,程序员在编写程序时,对于程序中多次使用的指令序列,定义成宏指令,在指令中代替指令序列。 必须先定义,后引用。 进行一次宏定义,以后就可以多次使用宏指令名进行宏调用。
4.3.5宏指令语旬 定义宏指令一般安排在程序的开头部分,不属于源程序的那一段。 CRLF MACRO MOV AL,ODH MOV AH,02H INT 21H;回车 MOV AL ,OAH MOV AH,02H INT 21H;换行 ENDM 由于回车和换行命令在程序中多次引用,因此可把这6条指令编成一个指令序列的形式,用宏定义语句定义成一个宏指令,这样可以在程序中多次引用。
4.3.5宏指令语旬 在源程序中引用宏指令称为宏调用。 调用格式为: 宏指令名 [实参数] 其中实参数与宏定义中的形式参数一一对应。 当实参数多于形式参数时,多余的实参数被忽略。 当实参数少于形式参数时,多余的形参设为空白。 实参数的类型可以是常数、寄存器、变量名、地址表达式和指令的助记符。
宏调用程序: MULTPLY DL,DAT ,XYZ[BX] ……….. MULTPLY 280, BH, DAT …………….. ;实参数DL寄存器,DAT为存储变量,XYZ[BX]基址寻址内存操作数 实参数常数280,BH寄器,DAT是变量 4.3.5宏指令语旬 【例44】带有形式参数的宏指令。 MULTPLY MACROOPR1,OPR2,OPR3,RESULT PUSH AX MOV AL,OPR1 IMUL OPR2 MOV RESULT AX POP AX ENDM 对OR错?
4.3.5宏指令语旬 二、宏指令与过程的区别 宏指令是将一段程序即指令序列用一条宏指令代替,以简化书写源程序。过程也有类似的功能,但两者是有差别的。具体差别如下: (1)宏指令简化了源程序的书写,但在汇编时,汇编程序对汇编语言源程序宏指令中的宏体原原本本插到调用的地方。因此,宏指令简化了源程序,但并没有简化目标程序。宏指令并不节省目标程序所占用的内存空间。 过程是通过CPU执行CALL指令调用处理的。使用过程可以简化目标程序,减少程序占用的内存空间。过程可作为一个标准模块被共享,便于模块化程序设计。
4.3.5宏指令语旬 二、宏指令与过程的区别 (2)采用过程时,每调用执行一次CALL指令和RET指令,都进行压入和弹出堆栈指令。 宏无此操作,也不使用CALL和RET指令。若把一个同样程序编成一个过程和一个宏指令形式,对应的宏指令的程序执行时间要比过程调用程序执行时间短一些,即宏指令执行速度快。 由上可知,宏指令执行速度快,过程占用内存少。
4.3.6模块连接伪指令 PUBLIC和EXTRN伪指令 1.EXTRN伪指令 EXTRN 符号名1:类型[,符号名2:类型,……] 其中符号名是本模块中引用的其他模块(外部)定义的标号(包括过程名)、变量和符号常数。 在说明符号时,必须给出其类型。类型可以是BYTE、WORD、DWORD、FAR和ABS。ABS表示符号常量。其类型必须与其他模块定义该符号时的类型保持一致。 该伪指令构成的语句放在程序的开始部分,用以指明本模块中引用了哪些外部的符号名及其类型。
4.3.6模块连接伪指令 PUBLIC和EXTRN伪指令 2.PUBLIC伪指令 说明本模块中定义的变量、标号和符号常量哪些可以被其他模块所引用。 PUBLIC 符号名1 [,符号名2,……] 符号名:本模块定义的变量、标号、及符号常量。