IBM-PC汇编语言程序设计第13章 高级宏汇编语言技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13.1.1 结构的定义 要在程序段中引用结构,必须先使用结构伪指令先定义。结构伪指令的使用格 式为:
结构名 STRUC <数据定义语句序列> 结构名 ENDS 其中,“结构名”不能缺省,且在同一个源程序中必须是唯一的。“数据定义语 句序列”是用DB、DW或DD定义结构中各字段(Fields),这些语句中的变量名 称叫做结构字段名。 每一个结构字段名都有局部偏移量及其类型的属性。局部偏移量是指结构字段 的第一个字节与结构起点之间的字节数,类型仍然是指字节、字或双字。 【例13-1】定义一个结构
结构变量名STR4对字段名为DA3中同时预置16个结构副本所进行的修改。
按【例13-2】的结构预置,结构变量STR1,STR2和STR3的存 储空间分配情况如图13-1所示的结构变量预置与存储单元的分 配情况。
对结构字段初值的修改,并非所有字段中的初值都是可以修
改的,只有简单结构字段和字符串字段的初值才可以修改。所 谓简单结构字段就是由伪指令DB、DW或DD定义的单项变量, 如【例13-1】中的结构 STRDAT内DA1,DA2,DA4就是只有 单项的简单结构字段。而DA5是用DB伪指令定义的字符串,也
标代码,因而也没有分配存储单元。这是与数据段中的数据定义不同之处。
13.1.2 结构的预置与存储单元的分配 当结构定义后,我们可在程序中直接引用结构名,为结构预置副本,设置结构变
量,分配存储空间。结构变量预置语句的格式为: 结构变量名 结构名 <字段值表>
其中,“结构名”是已用STRUC/ENDS伪指令定义结构时的结构名。 “结构变量名”是结构副本的标识符,它和其它变量一样也都具有三个属性:段属 性、偏移属性和类型属性。段与偏移属性体现结构变量的地址,类型属性是表示结 构的总字节数。
MOV BX, TYPE STRD2 ;BX=1AH
填充右边的空间;若预置的字符个数多于初值的个数,则汇编程序将给出错误的
信息。
13.1.3 结构变量及字段的操作
结构变量与一般变量一样,可做为指令的操作数,但使用某些运算符时有不同
的含意。当结构变量前面使用运算符时,运算符TYPE所表示的是结构所占的总字
节数。其它运算符,如OFFSET ,LENGTH ,SIZE等所表示的意义与一般变量的
使用相同。
【例13-4】针对【例13-3】的结构定义和预置,以下是每条指令汇编结果的示
例(假设每条指令都为单独指令)。
MOV AX,OFFSET STRD1 ;AX=0
MOV AX, OFFSET STRD2 ;AX=1AH ;按结构定义的字节数定偏移量
MOV BX, TYPE STRD1 ;BX=1AH ;是结构变量所占的总字节数
;结构变量预置
DATA SEGMENT
;结构变量预置数据段
STRD1 STRDSS <‘99008-1’,8,‘YU MEING’>
STRD2 STRDSS <‘99008-2’,16,‘LIU XING’>
DATA ENDS
本例结构预置时,有两个结构字段是字符串。通常希望预置的字符个数与字段
初值的个数相同。若预置的字符个数少于初值的个数,那么汇编程序将用“空格”
第13章 高级宏汇编语言技术
13.1 结构 结构(structures)是IBM_PC机宏汇编程序MASM最具特色的功能,它允许提 供颇有价值的编程环境。它直接引用了某些高级程序设计语言的结构数据的概念。 结构就是把逻辑上具有相互关联的一组数据,以某种形式组合在一起。如果在 一个程序段中,需要多次使用相同的一组数据格式,那我们就可以把这一组数据 格式定义为一个结构。例如,为了建造学生的学籍档案,只须确定一名学生的学 籍档案的数据格式,比如,使用几个字节记录相关科目的考试成绩等项目。这个 数据格式本身并不需要占据内存单元。它仅在一旦确定了为某个班(如该班有40 名学生)建立档案时,就可以按照事先定义的结构格式,在存储单元中布局40个 相同的数据格式。这就是,当引用该结构时,它就会与存储器中的特定区域发生 联系。 请读者注意:在程序中使用结构数据,必须对结构先定义,然后进行结构数据 的预置与存储分配。只有这样才能对结构中各相关数据进行存取、修改和操作。
<字段值表>是为结构副本中的wk.baidu.com字段进行预置。结构的预置既可以保留所有字 段的初值,也可以修改某些字段的初值,无论对字段的初值是否进行过修改,结构 名后头的尖括号都是不能省略的。
【例13-2】对【例13-1】的结构进行引用的例子,即对结构的预置。
STR1 STRDAT < >
STR2 STRDAT <44H> STR3 STRDAT <44H,66H,COUT,‘5678’> STR4 STRDAT 10H DUP(<44H>) 在本例的结构预置中: 结构变量名STR1对结构中所有字段都不加修改,保留各字段的初值; 结构变量名STR2仅修改第一字段,其它各字段仍保留其初值; 结构变量名STR3除了第三个字段(字段名为DA3)外,其余字段均进行了修改。
可以用其它字符串进行修改。而存在多项(多重)变量的结构 字段初值如【例13-1】中的DA3不能修改。具有多项或多重的 结构字段,如由以下形式所示:
DB 20H DUP(?) DW 34H,5678H,1234H DB ‘1234’,‘ABCD’ DW COUT,BUFF 结构变量名的STR4同时预置16个结构副本。每一个副本中都是 仅修改第一个字段初值,其余保留不变。这16个结构数据在分 配存储空间时,将会依次存储。
STRDAT STRUC
DA1 DB ?
DA2 DB 33H DA3 DW 10H DUP(?) DA4 DW BUFF ;可用字符作为结构字段的初值
DA5 DB ‘ABCD’
STRDAT ENDS 结构定义中的DA1,DA2,DA3,DA4,DA5分别是结构STRDAT的结构字段 名,它们的局部偏移量分别是0,1,2,22H,24H。这里,对局部偏移量的确定 与数据段中的变量所代表的偏移量计算方法相同。结构中各字段可以指定具体的 数值或字符作为结构字段的初值。用伪指令STRUC/ENDS定义的结构,不产生目