




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、三、伪指令语句三、伪指令语句 伪指令向汇编程序发出某些控制和操作指伪指令向汇编程序发出某些控制和操作指示,在汇编过程中完成相应的操作功能,如处理示,在汇编过程中完成相应的操作功能,如处理器选择、定义程序模式、定义数据、分配存储空器选择、定义程序模式、定义数据、分配存储空间、指示程序结束等。间、指示程序结束等。伪指令的分类 【例】.486 选择80486指令系统.486P 选择保护模式下的80486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统一)段定义伪指令一)段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为
2、目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序.为此,需要用到段定义伪操作。 用途:将源程序划分为若干段,指出段的用途,便于汇编程序在相应的段下生成目的代码,也可经过连接程序将不同模块的同名段合并,生成一个结构更紧凑的可执行目标程序。段定义伪操作的格式如下:1、格式:段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 使用类型使用类型 类类别名别名 本段语句.段名段名 ENDS段名:用户指定,开始、结束要一致。SEGMENT:表示段定义的开始.ENDS:表示段定义的结束。二者必须成对出现
3、。 其中删节号部分,对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作;对于代码段则是指令及伪操作。 此外,还必须明确段和段寄存储器的关系,这可用ASSUME伪操作来实现,其格式为: ASSUME assignment,.,assignment其中assignment说明分配情况,其格式为: segment_register_name:segment_name 其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段中的段名。而ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器。由于ASSUME伪操作只是指定某个段分配给哪一个
4、段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。但是,代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。 SEGMENT伪操作还可以增加类型及属性的说明,格式如下: segname SEGMENT align_type combine_type class . segname ENDS一般情况下,这些说明可以不用.但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明.分别叙述如下: 1)定位类型:表示对当前定义的段的起始地址的要求PAGE:表示本段的起始地址(段基址)的低8位为00H(段基址能被256整除)(从页的边
5、界开始)。PARA:表示本段的起始地址(段基址)的低4位为0000B。DWORD:表示本段的起始地址(段基址)的低2位为00B(从双字的边界开始)。WORD:表示本段的起始地址(段基址)的低位为0H(从字的边界开始)。BYTE:表示本段的起始地址(段基址)的低位可为任一地址。 2)组合类型:程指定段与段之间的连接关系及段的定位PRIVATE:私有段,该段在连接时不与其他模块中的同名段合并。PUBLIC:公有段,该段在连接时与其他模块中的同名段连接成一个段,其连接次序由连接命令指定。 COMMON:该段与其他同名的分段在连接时有相同的起始地址,会产生段覆盖。段的长度为各分段中的最大长度,段的内容
6、为排列在最后一段的内容。 AT 表达式:段的地址为表达式计算出来的16为地址。(不能用来指定CS)MEMORY:将分配在与之连接在一起的其他段的最高地址,若有多个指定的MRMORY段,则把第一个遇到的段作为MEMORY,其他段则作为COMMON段处理。 STACK:将所有同名段组合成一个连续的堆栈段,段长为各段之和。汇编程序自动将段寄存器SS初始化为该连续段的首址,并初始化SP。 3)使用类型:16位、32位寻址方式16位: USE16 段长64KB 16段地址和16位偏移地址32位: USE16 段长4GB 16段地址和32位偏移地址 4)类别名:在引号中给出连接时组成段组的类别名。 2、存
7、储模型与简化段定义伪操作适合MASM5.0及以后。 1).MODEL 存储模型,模型选项存储模型:说明段在存储器中的安排。(1) Tiny:数据、代码在一个段内,都是近(NEAR)访问。适合小程序。(.COM文件)(2) Small:所有数据在一个64KB的DS内、所有代码在一个64KB的CS内,都是近访问。适合一般程序。(3) Medium:数据合并成一个64KB的段组、代码使用多个段。数据是近访问,代码可为远访问。(4) Compact:代码合并成一个64KB的段组、数据使用多个段。代码是近访问,数据可为远访问。(5) Large:数据、代码可使用多个段。数据、代码可为远访问。(6) Hu
8、ge:同Large,DS可大于64KB。模型选项:允许用户指定三种选项:高级语言接口(该汇编程序可作为高级语言的过程被高级语言调用)、操作系统、堆栈距离。如: .MODEL SMALL,C 2)简化的段定义伪操作 简化段每一新段的开始就是上一段的结束,无ENDS。【例】 P124-126 3、段组定义伪操作格式:段组名段组名 GROUP 段名段名,段名,段名2.【例】 P126 4、段寻址伪指令指示汇编程序哪些段是当前段以及这些段与段寄存器之间的联系。格式:ASSUME 段寄存器名:段名,段寄存器名:段段寄存器名:段名,段寄存器名:段名,名,段寄存器名是:CS、DS、SS、ES;段名是SEGM
9、ENT和ENDS伪指令中定义的段名。注意:ASSUME只是指定当前段与段寄存器之间的关系,并不能将段基址装入相应的段寄存器中,所以在代码段中还要通过若干语句将段基址装入相应的寄存器中。【例】 P119二二) 数据定义及存储器分配伪操作数据定义及存储器分配伪操作功能:负责为变量分配内存单元、预置初值、预留内存单元。常用的伪指令名:DB、DW、DD、DQ、DT格式:变量名变量名 伪指令名伪指令名 操作数项表操作数项表操作数可以是常数、表达式、字符串、?、带DUP的表达式。DB:定义1个字节,其后的每个操作数都占1个字节(8位);DW:定义字,其后的每个操作数都占有一个字(低位字节在第一个字节地址中
10、,高位字节在第二个字节地址中).; DD:定义双节,其后的每个操作数都占4个字节(32位);DQ:定义6个字节,其后的每个操作数都占6个字节(48位);DT:定义10字节,其后的每个操作数都占10个字节(80位)。字节变量字节变量定义字节变量的定义符为DB/BYTE(Define Byte),每个字节只占一个字节单元。其中:BYTE是MASM 6.0及其以后版本的数据类型说明符,随后的其它类型说明符同此说明。【例】 COUNTERDB6 DBA, D, 0Dh, $TABLEDB1, 3, 5, 7, 9, 11上面的定义语句经汇编后所产生出的内存单元分配情况如图所示。图中的数据是用十六进制表
11、示的(以后也如此,不再说明),由引号括起来的字符在内存中是存放其ASCII码值。所以,D和0Dh是不同的,前者是字符D,后者是数值12的十六进制编码。内存单元的分配情况示意图用定义符DB还可定义一种特殊的数据形式字符串。在定义字符串时,必须用成对的单引号或双引号把所要的字符括起来,括号内字符的ASCII码将依次存放在相应的字节单元内。 【例】 MSG1DBI am a student.该说明语句所对应的存储单元分布如下所示。为了看起来方便,并没有用字符的ASCII码来存放在相应的存储单元内,而直接用该字符,请不要引起误解。上面的例子也可改写为另一种等价的语句:MSG1DBI, , a, m,
12、, a, , s, t, u, d, e, n, t, .显然,前者的说明要比后者方便得多,所以,在程序中都采用前者的书写方式。字变量字变量定义字变量的定义符为DW/WORD(Define Word),每个字占用两个连续的字节单元。【例】 Word1DW89H, 1909H, -1DW 0ABCDH, ?, 0上述定义的内存分配如下所示。由于字变量的数据是按照由于字变量的数据是按照“高高低低高高低低”的原则存的原则存于存储单元之中的,而字节数据是按照排列顺序存于于存储单元之中的,而字节数据是按照排列顺序存于存储单元中的,所以,它们的存储方式有所不同。存储单元中的,所以,它们的存储方式有所不同。
13、试比较下面两个定义的存储顺序,试比较下面两个定义的存储顺序,其中:其中:41H和和42H分别是分别是A和和B的的ASCII码。码。B1DBABW1DWAB双字变量双字变量定义双字变量的定义符为DD/DWORD(Define Doubleword),每个双字变量占用二个连续的字单元(四个字节)。DW1DD12345678H, ?DW2DD0abcd1243H上述定义的内存分配如下所示。六字节变量六字节变量定义六字节变量的定义符为DF/FWORD(Define Farword)。每个六字节变量占用六个连续的字节。DF1DF1234567890abH, -1DF1abcd23H八字节变量八字节变量定
14、义八字节变量的定义符为DQ/QWORD(Define Quadword)。同理,每个八字节变量占用八个连续的字节。DQ1DQ12345678H, 0H, -1234HDQ?, 1238H, ?第一个八字节常量12345678H在内存中的分配方式如下所示,其存储原则与前面相同。其它八字节常量的存储方式与此一致。十字节变量十字节变量定义十字节变量的定义符为DT/TBYTE(Define Tenbytes)。同理,每个十字节变量占用十个连续的字节。DT1DT12345678H, 0H, -1234HDT2DT?, -1H第一个十字节常量12345678H在内存中的分配方式如下所示,它同样按“高高低低
15、”的原则来存储。其它十字节常量的存储方式与此一致。以上六个数据类型是汇编语言中最基本的数据类型,其中,前三个是在程序中经常使用的,后三个的使用频率不太高。 1、操作数为常数或表达式【例】 D1 DB 30H,30;变量D1的内容为30H,它的下一个字节单元的内容为30DD2 DW 30*30 ;变量D2的内容为900D D3 DD 123456789AH ;变量D3的内容为123456789AD4 DB 15,45 MOD 5 ;变量D4的内容为15,它的下一个字节单元的内容MOD的系数为02、操作数为字符串操作数为字符串时必须用单引号()括起来,括起来字符的个数不能超过255个,字符串一AS
16、CII的形式按地址递增的顺序依次存放在以变量名开始的内存单元中。【例】 ST DB THIS IS A STRING【例】 P1281293、操作数为? ?:预留内存单元,但不存入数据【例】 X1 DB ?;为变量X1预留1个字节单元 X2 DW ?;为变量X2预留2个字节单元 X3 DD ?;为变量X3预留4个字节单元【例】 P1294、重复说明符重复说明符DUP前面的内容里,我们知道了定义少量内存变量的定义形式,但如果在程序中要说明50个、100个、200个甚至更多的、同类型的内存变量时,若采用前面所学的方法,对它们一一加以说明显然是不可行的。为此,汇编语言提供了变量的重复说明符DUP,其
17、说明的一般形式如下:count DUP (表达式表达式, 表达式表达式, , 表达式表达式)解释:count是重复次数,(表达式, 表达式, , 表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是包含另一个DUP的式子。如果在表达式的括号中有多个表达式,那么,它们之间要用逗号,分开。【例】V1 DB 20 DUP(?)(?) ;表示从V1开始预留20个字节单元V2 DW 4 DUP(3,5) ;表示从V2开始重复定义4个字,由低到高,第1个字为3,第2个字为5,第3个字为3,第4个字为5V3 DB 5 DUP(3 DUP(2),),7) ;表示从V3开始重复定义5个数据系列“2,
18、2,2,7”,共占20个字节单元V4 DB 10 DUP(ABCD) ;表示从V4开始重复定义10个字符串“ABCD”,共占40个字节单元【例】 P129三)符号定义语句三)符号定义语句在程序中,经常要使用一些常量或数值表达式,并把它们直接写在指令中,但当需要修改时,就要对它们逐个进行修改,这无疑会增加维护程序的工作量,而且每个常量或表达式所代表的含义也容易遗忘。为了改善程序的可读性,尽量减少维护程序的工作量,汇编语言提供了为常量或表达式定义一个符号名的方法。一旦定义了符号名,在指令中就可直接使用它们。1、等价语句、等价语句等价语句的一般使用格式如下:符号名符号名EQU表达式表达式作用是左边的
19、符号名代表右边的表达式。注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义。1)用符号名代表常量或表达式)用符号名代表常量或表达式当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式。【例】 NUMBEREQU100;给缓冲区的长度取一个符号名BUFF_LENEQUNUMBER+2CREQU13;给“回车”符的ASCII码定义一个符号名LFEQU10;给“换行”符的ASCII码定义一个符号名BUFFERDBNUMBER, ?, NUMBER DUP (?);用符号名来定义缓冲区2)用符号名代表字符串)用符号名代表字符
20、串用一个具有一定含义的符号名定义某一个较长的字符串,在随后的程序中就用该符号名。例如:GREETINGEQUHow are you!在该定义之后,就可使用符号名GREETING来代表字符串How are you!。3)用符号名关键字或指令助忆符)用符号名关键字或指令助忆符用一个(组)程序员自己习惯的符号名来代替汇编语言中的关键字或指令助忆符。但在此建议不要这样做,因为程序的编写者习惯,程序的其他阅读者可能会觉得很别扭。【例】 MOVE EQUMOV;给指令MOV取另一个符号名MOVECOUNTER EQUCX;给寄存器CX取一个叫“计数器”的符号名上面的定义只是给原来的助忆符MOV和CX起了另
21、一个别名,而原来助忆符MOV和CX仍然可以使用,所以,可编写如下语句:MOVEAX, CX ;相当于指令:MOV AX, CXMOV COUNTER, BX;相当于指令:MOV CX, BX4)用符号名定义存储单元的别名)用符号名定义存储单元的别名可对一片存储单元定义另一个数据类型的符号名,有关叙述参见前面的操作符THIS。【例】 WORD1EQUTHIS WORD;给后面的字节存储单元取一个字属性的符号名BYTE1 DB12h, 21hFLAGDW1234HFLAG1 EQUbyte ptr FLAG;给FLAG的低字节取一个字节属性的符号名FLAG2 EQUbyte ptr FLAG+1;
22、给FLAG的高字节取一个字节属性的符号名有了上述定义后,可编写如下语句:MOVAX, WORD1 ;执行后,(AX)=2112HMOVBL, FLAG1;执行后,(BL)=34H【例】 CONST EQU 256 ;数赋以符号名 DATA EQU HEIGHT+12 ; 地址表达式赋以符号名 ALPHA EQU 7 BETA EQU ALPHA-2 B EQU BP+8 ;变址引用赋以符号名B P8 EQU DS:BP+8 ABC EQU 23【例】 P1332 等号语句等号语句汇编语言提供了用等号来定义符号常数的方法,即可用符号名代表一个常数。其一般格式如下:符号名数值表达式符号名数值表达式
23、 “=”与EQU伪操作也可以作为赋值操作使用。它们之间的区别是EQU伪操作中的表达式名是不允许重复定义的,而=伪操作则允许重复定义.【例】ABC = 10 + 200 * 5;ABC的值为1010ABC1 = 5 * ABC + 21;ABC1的值为5071COUNT = 1;COUNT的值为1COUNT = 2*COUNT + 1;COUNT的值为33 符号名定义语句符号名定义语句 符号名定义语句LABEL与前面的操作符THIS功能类似,该语句定义一个指定的符号名,该符号名的段地址和偏移量与下面紧跟存储单元的相应属性相同,但该符号的类型是新指定的。LABEL语句的一般格式如下:符号名符号名
24、LABEL 类型类型其中:常用的类型有BYTE、WORD、DWORD、NEAR和FAR等。【例】NEXT:WBUFFERLABELWORD;WBUFFER与BUFFER具有相同的段地址和;偏移量,但它们的数据类型不同。BUFFERDB200 DUP(0)NEXT1LABELFAR;NEXT1和NEXT具有相同的段地址和偏移量,;NEXT1是“远”标号,NEXT是“近”标号。MOVAX, BX标号NEXT1和NEXT可用于不同的情况。当在同一个模块内转移时,可使用标号NEXT;当在不同的模块之间进行转移时,需要使用“远”标号NEXT1。四)四) 程序开始和结束伪操作程序开始和结束伪操作1表示程序
25、开始在程序的开始可以用NAME或TITLE为模块取名字,NAME的格式是:NAME module_nameNAME module_name(模块名)模块名)汇编程序将以给出的module_name作为模块的名字.如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:TITLE textTITLE textTITLE伪操作可指定每一页上打印的标题.同时,如果程序中没有使用NAME伪操作,则汇编程序将用text中的前六个字符作为模块名.text最多可以60个字符.如果程序既无NAME又无TITLE伪操作,则将用源程序文件名作为模块名.2表示程序结束 表示源程序结束的伪操作的格式为:E
26、ND labelEND label其中标号指示程序开始执行的起始地址.如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号.五)五) 地址计数器与对准伪操作地址计数器与对准伪操作地址计数器$:保存当前正在汇编的指令的偏移地址。在开始编译或在每段开始时,把地址计数器初始化为0,以后汇编过程中,每处理一条指令,地址计数器增加一个值(指令所需的字节数)。1、偏移量计数器的值偏移量计数器的值【例】W1DW$, $ORG $+3;从当前地址开始空3个字节B1DB43h假设:在给变量W1分配内存单元时,当前偏移量计数器的值为2。于是,变量W1后面第一个“$”代表数值2,
27、第一个字分配后,此时偏移量计数器$的值就为4,所以,第二个“$”就代表数值4。在分配完二个字之后,偏移量计数器的值变为6,$+3的值为9,所以,伪指令“ORG $+3”就表示下一个变量从偏移量为9的单元地址开始分配。上述变量说明所对应的内存单元分布如图所示。【例】 P1342、设置当前地址计数器的值ORG调整偏移量伪指令格式:ORGORG 数值表达式数值表达式 作用:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的地址开始分配。假设有下列变量定义,并且变量word1的偏移量为0。Word1 DW1234h Byte1 DB56hWord2 DW0abcdh ORG 1Byte2
28、DB?Word3 DW?Byte3 DB?前三个变量定义的内存分布如图的左边所示,但由于伪指令“ORG 1”的作用,说明其后面所说明的变量要从偏移量为“1”的内存单元开始存放。所以,后三个变量的内存分配如图的右边所示。由图可见,这些变量的内存分配是相互重叠的,对某个变量的操作无疑会影响到与之重叠的变量。另外,变量byte2、word3和byte3没有赋初值,如果赋初值的话,则重叠部分的内存单元的原来初值将被覆盖掉。如常数表达式的值为n,则ORG伪操作可以使下一个字节的地址为常数表达式的值n. 地址计数器的值可以用$来表示,汇编语言允许用户直接用$来引用地址计数器的值,因此: ORG $+8以表
29、示跳过8个字节的存储区.JMP $+2可以表示一条空指令,该指令只是延迟处理机的一些时间,而无其他功能. 例如: W1 DW $, $ ORG $+3;从当前地址开始空3个字节B1 DB 43h假设:在给变量W1分配内存单元时,当前偏移量计数器的值为2。于是,变量W1后面第一个“$”代表数值2,第一个字分配后,此时偏移量计数器$的值就为4,所以,第二个“$”就代表数值4。在分配完二个字之后,偏移量计数器的值变为6,$+3的值为9,所以,伪指令“ORG $+3”就表示下一个变量从偏移量为9的单元地址开始分配。综上分析,上述变量说明所对应的内存单元分布如图所示。内存单元分布示意图【例】EE SEG
30、MENT ORG 15S1 DW 10FFH ;S1的偏移地址值为FHORG 5S2 DW 0EFFH ;S2的偏移地址为5H .EE ENDS【例】 P135 3、偶对齐伪指令偶对齐伪指令EVENEVEN偶对齐伪指令格式:EVEN作用:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配。如果下一个偏移量是偶地址,那么,该伪指令不起作用,否则,汇编程序将空出一个字节,从下一偶地址开始为其后变量分配内存单元。假设有下列变量定义,并且变量B1的偏移量是偶数。B1DB12H;为了表示方便,不妨再假设其偏移量为:xxxx0HW1DW4567H其内存单元分布如图所示。在上
31、述定义情况下,在许多微机系统中,当需要读变量W1及其后面的字内容时,硬件将按下图所示的方式分二次读出该字内容,再拼接成一个字内容,这时,无疑需要二个读内存周期,从而影响程序执行的速度。齐偏移量读取一个字的过程示意图出现上述问题的主要原因就是字变量W1在数据段内的偏移量是奇数,为了保证其偏移量是偶数,需要在其定义之前加上伪指令EVEN。所以,可把前面的变量定义改变成下列形式: B1DB12HEVENW1DW4567H变量的内存分配和读取字变量W1的过程如下图所示。偶偏移量读取字过程【例】 DATA SEGMENT .EVENWORDAY DW 100 DUP(?) .DATA ENDS【例】 P
32、1354、对齐伪指令ALIGN对齐伪指令格式:ALIGN Num其中:Num必须是2的幂,如:2、4、8和16等。作用:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。试比较下面二组变量定义,它们的对齐效果一致吗?从上面的对比,我们不难看出:伪指令ALIGN的说明功能要比伪指令EVEN强。【例】 ALIGN 2 ;等价 EVEN【例】 P136六)六) 基数控制伪操作基数控制伪操作 汇编程序默认的数为十进制数,因而除非专门指定,汇编程序把程序
33、中出现的数均看作十进制数,为此,当使用其他基数表示的常数时,需要专门以标记如下: 二进制数:二进制数:由一串0、1组成其后跟以字母B,如00101100B 十进制数:十进制数:由09的数字组成。一般情况下后面不必加上标记,在指定其他基数的情况下,后面可跟字节字母D,如178D。十六进制数:十六进制数:由09及AF组成的数,后面跟字母H。这个数的第一个字符必须是09,所以如果第一个字符是AF时,应在其前加上数字0,如0FFFFH。八进制数八进制数:由数字07组成的数,后面可跟字母O或Q,如1777Q。 进制伪指令进制伪指令RADIXRADIXRADIX伪操作,伪操作,可以把默认的基数改变为216
34、范围内的任何基数,其格式如下:.RADIX exp.RADIX exp其中:伪指令前面要用点.开始,exp的值必须是区间2, 16内的一个整数。该伪指令说明其下面整数的默认进制为exp。如果某整数已显式地表明了其进制,则该默认进制对其不起作用。在源文件中,可以使用多个RADIX伪指令来分别说明其后整数的默认进制,但为了避免引起不必要误会,不提倡这样去做。应当注意应当注意:在用.RADIX 16把基数定为十六进制后,十进制数后都应跟字母D。在这种情况下,如果某个十六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。.字符串可以看成串常,可以用单引号或双引号把字符串放在其中,得到的是
35、字符串的ACSII值,例如:ABCD。 【例】.radix8B1DB10, 11, 12;这三个数是八进制数DB10D;这数是十进制数,因为它已用D明确说明而不使用缺省进制.radix10MOV AX, 1234;1234是十进制数MOVAX, 1234H;1234H是十六进制数思考题:.radix16DW90D, 101B;前者是十进制数,后者是二进制数吗?【例】 MOV BX,OFFHMOV BX,178与.RADIX 16MOV BX,0FFMOV BX,178D是等价的。 【例】 P144-145四、四、 汇编语言程序结构汇编语言程序结构源程序的基本组成源程序的基本组成汇编语言源程序的
36、组成部分有:模块、段、子程序和宏等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。有关模块和子程序的知识和宏在第7章介绍,有关宏的知识将在第9章中叙述。1.段的定义段的定义微机系统的内存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。不论程序在某个时刻最多能访问多少个段,在编程序时,程序员都可以定义比该段数更多的段。在通常情况下,一个段的长
37、度不能超过64K,在80386及其以后系统的保护方式下,段基地址是32位,段的最大长度可达4G。段的长度是指该段所占的字节数: 如果段是数据段,则其长度是其所有变量所占字节数的总和; 如果段是代码段,则其长度是其所有指令所占字节数的总和。在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义的段名。 其中:“段名”必须是一个合法的标识符,前后二个段名要相同。可选项“对齐类型”、“组合类型”和“类别”的说明作用请见第4章中的叙述。2.段寄存器的说明语句段寄存器的说明语句在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:ASSUME段寄存器名段寄存器名:段名段名,段寄存器名段寄存器名:段名段名,其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。在一条ASSUME语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于孩子抚养权的离婚合同书
- 货物采购合同补充协议
- 设备销售与购买合同范文
- 车险综合保险合同示例
- 服务合同预付款借款范本
- 歌手签约演出服务合同
- 服装采购代理合同
- 大型建筑机械租赁合同样本范本
- 城乡结合部三方共建项目合同
- 商铺租赁合同规范样本
- 医疗器械经营基础知识培训合规指南
- 小学数学(含奥数)数图形个数和找规律、简便运算专项及练习题附答案
- 新产品研发(开发)项目管理培训教材
- 课堂-可以这么有声有色
- Android Studio开发实战(从零基础到App上线)
- 布草类送洗记录表
- 药物警戒培训
- 中央民族大学 学生休学申请表
- 哈萨克斯坦劳动法中文版
- 寰枢椎脱位的护理课件
- 反面典型案例剖析材料范文(通用6篇)
评论
0/150
提交评论