学习汇编只是总结



今天把汇编16位部分学完了,随着学习深入,似乎找到了我学习汇编想知道答案,但还并不完整.
基础指令,DOS,BIOS中断就不多说了,我BLOG中有篇响应中断览表,大家有需要可以去参考.
PSP驻留也不多说了,高级汇编语言技术也并不难接受,只要大家有点高级语言基础,看明白还是不难,我想说说模块化设计部分定义,简单下供C过程(汇编编写)!
定义分为完整定义和简化定义,完整定义通过你定义段时指定参数来实现
段名SEGMENT [对齐类型] [组合类型] [类别]

段名ENDS

段名可以是唯也可以和其它段同名在同模块中如果有 2个段同名则后者被认为是前段后续这样它们就属同

段对齐类型PARA是个适用于所有段类型对齐类型它也是缺省对齐类型对齐类型BYTE和WORD通常用于数据段定位对齐类型DWORD通常用于80386及其以后CPU代码段定位
表6.1段对齐类型和段起始地址的间对应关系
对齐类型起始地址( 2进制)功能介绍说明最多空闲字节数
BYTExxxxxxxxxxxxxxxxxxxx下个字节地址0
WORDxxxxxxxxxxxxxxxxxxx0下个字地址1
DWORDxxxxxxxxxxxxxxxxxx00下个双字地址3
PARAxxxxxxxxxxxxxxxx0000下个节地址15
PAGExxxxxxxxxxxx00000000下个页地址127




组合类型(COMBINE)
组合类型是告诉连接如何把区别模块中段名相同段合并在具体组合类型如下:
NONE表示当前段在逻辑上独立于其它模块并有其自己基地址NONE是缺省组合类型
PUBLIC表示当前段和其它模块中同段名PUBLIC类型段组合成个段组合先后次序取决于LINK中目标模块排列次序在组合时后续段起始地址要按其对齐类型进行定位所以同名段的间可能有间隔
COMMON表示当前段和其它模块中同名段重叠也就是说它们起始地址相同最终段长度是同名段最大长度由于段覆盖所以同名段中化数据被后续段数据覆盖掉
STACK组合类型STACK表示当前段是堆栈栈其组合情况和PUBLIC相同
AT数值表达式该数值表达式是当前段所指定绝对起始地址段地址


类别(CLASS)
类别是个由员指定用单引号括起来如果个段没有给出类别那么这个段类别就为空类别是用于段分类连接利用该类别来调整同名、同类别并使它们相邻典型类别是\"Data\"和\"Code\"如果指定某段类别是\"Code\"那么该段最好是代码段这样调试(如:CodeView)就可以顺序工作
例如:
DATA1SEGMENTWORDPUBLIC\"Data\"

DATA1ENDS

上述段定义介绍说明了该段起始地址是下个字地址、组合类型为PUBLIC、段类别是\"Data\"


段组(GROUP)
段组伪指令GROUP是用于把源模块中若干个段结合成个组并对该段组定义个段组名段组伪指令格式如下: [Page]
段组名GROUP段名[,段名,……]
其中:段名的间要用逗号间隔段名也可以用表达式“SEG变量”或“SEG标号”
下面举例介绍说明段组伪指令使用思路方法和作用
例6.12段组作用
思路方法1:用个段寄存器对应 2个数据段
DATA1SEGMENT;第个数据段
b1DB 10h
DATA1ENDS
DATA2SEGMENT;第 2个数据段
b2DB 23h
DATA2ENDS
CODE1SEGMENT
ASSUME CS:CODE1,DS:DATA1;(1)
START:MOVAX,DATA1
MOVDS,AX;(2)把数据段DATA1段值赋给段寄存器DS

MOVBL,b1;(3)引用DS来访问DATA1中变量b1

ASSUME DS:DATA2;(4)
MOVAX,DATA2
MOVDS,AX;(5)把数据段DATA2段值赋给段寄存器DS

MOVAL,b2;(6)引用DS来访问DATA2中变量b2

CODE1ENDS
ENDSTART

在上例中语句(1)介绍说明DS和DATA1建立联系语句(2)对DS赋值语句(3)用DS来访问DATA1段变量名语句(4)介绍说明DS和DATA2建立联系语句(5)对DS赋值语句(6)用DS来访问DATA2段变量名
在该例子中只使用个段寄存器DS来对应 2个数据段所以需要切换DS对应关系(如:语句(4))但我们也可以用段寄存器DS和ES来分别对应段DATA1和DATA2这样思路方法1就可变成思路方法2
思路方法2:用 2个段寄存器对应 2个数据段
DATA1SEGMENT
b1DB 10h
DATA1ENDS
DATA2SEGMENT
b2DB 23h
DATA2ENDS
CODE1SEGMENT
ASSUME CS:CODE1,DS:DATA1,ES:DATA2
START:MOVAX,DATA1
MOVDS,AX;把数据段DATA1段值赋给段寄存器DS
MOVAX,DATA2
MOVES,AX;把数据段DATA2段值赋给段寄存器ES

MOVBL,b1;引用DS来访问DATA1中变量b1

MOVAL,b2;引用ES来访问DATA2中变量b2

CODE1ENDS
ENDSTART

我们还可以用段组来简化段寄存器使用把段DATA1和DATA2组成个数据段所以把思路方法2再改写成思路方法3形式
思路方法3:用个段组组成 2个数据段
GSEGGROUPDATA1,DATA2;把段DATA1和DATA2定义成个段组
DATA1SEGMENT
b1DB 10h
DATA1ENDS
DATA2SEGMENT
b2DB 23h
DATA2ENDS
CODE1SEGMENT
ASSUME CS:CODE1,DS:GSEG
START:MOVAX,GSEG
MOVDS,AX;把段组GSEG段值赋给段寄存器DS

MOVBL,b1;引用DS来访问DATA1中变量b1

MOVAL,b2;引用DS来访问DATA2中变量b2

CODE1ENDS
ENDSTART

定义段组后段组内各段所定义标号和变量除了和定义它们段起始点相关外还和段组起始点相关规定如下:


如果在ASSUME伪指令中介绍说明段组和段寄存器相对应那么有关标号或变量偏移量就相对于段组起点计算;
如果在ASSUME伪指令中介绍说明段组内某各段和段寄存器相对应那么有关标号或变量偏移量就相对于该段起点

简化段定义
在使用简化段定义方式的前必须使用存储模式介绍说明伪指令来描述源所采用存储模式该伪指令说所使用存储模式汇编将用该存储模式生成相应ASSUME和GROUP语句同时也为其它简化段创建等价预定义 [Page]
存储模式介绍说明伪指令格式如下:
.MODEL存储模式[语言类型][操作系统类型][堆栈类型]
隐含动作还有
DEGROUPGROUPDATA,CONST,BSS,STACK
ASSUMECS:_TEXT,DS:DGROUP,SS:DGROUP
这样所有除代码段都在DEGROUP段组里同过同寄存器来实现存取
、SMALL
所有数据变量必须在个数据段的内所有代码也必须在个代码段的内在这种模型下数据段寄存器内容保持不变所有转移也都是段内转移
该存储类型是独立汇编语言源常用存储模型
、MEDIUM
所有数据变量必须在个数据段的内但代码段可以有多个在这种模型下数据段寄存器内容保持不变转移可以是段间转移
、COMPACT
数据段可以有多个但代码段只能有
、LARGE
数据段和代码段都可以有多个字节数不能超过64KB
、HUGE
数据段和代码段都可以有多个字节数也可以超过64KB

简化段定义伪指令
简化段定义伪指令在介绍说明个新段即将开始同时也介绍说明了上个段结束在本段定义结束时也不必用伪指令“ENDS”来标识
具体伪指令介绍说明形式及其功能描述如下:
1、代码段定义
.CODE
作用:介绍说明其下面内容是代码段中内容
2、堆栈段定义
.STACK[堆栈字节数]
其中“堆栈字节数”可以不写其缺省值为1024B
3、数据段定义
.DATA/.DATA?/.CONST
作用:介绍说明其下面内容是数据段中变量定义
个源可以有多个伪指令.DATA定义数据段这就好象在源中定义多个同段名数据段
伪指令.DATA?介绍说明下面是个未化数据段开始伪指令.CONST介绍说明下面是个常数数据段开始这 2条伪指令很少使用除非在和高级语言编写相结合时为了遵守高级语言某些约定而需要特殊介绍说明时才使用
汇编在处理简化堆栈段和数据段定义时它会自动地把伪指令.STACK、.DATA、.DATA?和.CONST所定义段组合成个段组如果想定义个独立、不和其它段组合在数据段那么就可选用下面数据段定义方式
4、远程数据段定义
.FARDATA[段名]/.FARDATA?[段名]
其中:“段名”是可选项如果不指定则该段名就取其缺省段名
作用:介绍说明个独立数据段
伪指令.FARDATA?介绍说明下面是个未、独立数据段开始通常情况下很少使用该伪指令


简化段段名引用
当使用简化段定义时般情况下员可以不知道这些段段名、段地址堆齐类型和组合类型等但当把简化定义段和标准定义段混合使用时就需要知道简化定义段基本属性表6.3是在小模式下段基本属性对应表
表6.3小模式下简化段定义缺省属性表
伪指令缺省段名对齐类型组合类型类别段组名
.CODE_TEXTWORDPUBLIC’CODE’ 
.FARDATAFAR_DATAPARANONE’FAR_DATA’
.FARDATA?FAR_BSSPARANONE’FAR_BSS’ 
.STACKSTACKPARASTACK’STACK’DGROUP [Page]
.DATADATAWORDPUBLIC’DATA’DGROUP
.DATA?BSSWORDPUBLIC’BSS’DGROUP
.CONSTCONSTWORDPUBLIC’CONST’DGROUP

在其它存储模型下由伪指令\".CODE\"介绍说明代码段段名在\"_TEXT\"的前还要加上其模块名(源名)假设某模块名为ABC则其缺省代码段段名就为ABC_TEXT因此在这种情况下模块名或源名不要以数字开头


供C过程:主要大家记住几个要点C语言把和外部变量和静态变量在生成汇编代码中以_开头内存模式要匹配通过堆栈BP压栈BP=SP返回要看C汇编般为累加AX记得保护积存器
Tags: 

延伸阅读

最新评论

发表评论