今天把汇编16位部分学完了,随着学习
![](/icons/66562de.gif)
深入,似乎找到了我学习汇编想知道
![](/icons/66562de.gif)
答案,但还并不完整.
基础
![](/icons/66562de.gif)
指令,DOS
![](/icons/66562diaoyong.gif)
,BIOS中断就不多说了,我
![](/icons/66562de.gif)
BLOG中有
![](/icons/66562yi.gif)
篇响应
![](/icons/66562de.gif)
中断
![](/icons/66562yi.gif)
览表,大家有需要可以去参考.
PSP驻留
![](/icons/66562chengxu.gif)
也不多说了,高级汇编语言技术也并不难接受,只要大家有
![](/icons/66562yi.gif)
点高级语言
![](/icons/66562de.gif)
基础,看明白还是不难
![](/icons/66562de.gif)
,我想说说模块化
![](/icons/66562chengxu.gif)
设计部分
![](/icons/66562de.gif)
段
![](/icons/66562de.gif)
定义,简单
![](/icons/66562de.gif)
说
![](/icons/66562yi.gif)
下供C
![](/icons/66562diaoyong.gif)
![](/icons/66562de.gif)
过程(汇编编写)!
段
![](/icons/66562de.gif)
定义分为完整定义和简化定义,完整定义通过你定义段时指定
![](/icons/66562de.gif)
参数来实现
段名SEGMENT [对齐类型] [组合类型] [类别]
…
段名ENDS
![](/icons/66562chengxu.gif)
中
![](/icons/66562de.gif)
段名可以是唯
![](/icons/66562yi.gif)
![](/icons/66562de.gif)
![](/icons/66562dou.gif)
也可以和其它段同名
![](/icons/66562dou2.gif)
在同
![](/icons/66562yi.gif)
模块中
![](/icons/66562dou.gif)
如果有 2个段同名
![](/icons/66562dou.gif)
则后者被认为是前段
![](/icons/66562de.gif)
后续
![](/icons/66562dou.gif)
这样
![](/icons/66562dou.gif)
它们就属同
![](/icons/66562yi.gif)
段
段对齐类型PARA是
![](/icons/66562yi.gif)
个适用于所有段类型
![](/icons/66562de.gif)
对齐类型
![](/icons/66562dou.gif)
它也是缺省
![](/icons/66562de.gif)
对齐类型
![](/icons/66562dou2.gif)
对齐类型BYTE和WORD通常用于数据段
![](/icons/66562de.gif)
定位
![](/icons/66562dou.gif)
对齐类型DWORD通常用于80386及其以后CPU代码段
![](/icons/66562de.gif)
定位
表6.1段对齐类型和段起始地址的间
![](/icons/66562de.gif)
对应关系
对齐类型起始地址( 2进制)功能介绍说明最多
![](/icons/66562de.gif)
空闲字节数
BYTExxxxxxxxxxxxxxxxxxxx下
![](/icons/66562yi.gif)
个字节地址0
WORDxxxxxxxxxxxxxxxxxxx0下
![](/icons/66562yi.gif)
个字地址1
DWORDxxxxxxxxxxxxxxxxxx00下
![](/icons/66562yi.gif)
个双字地址3
PARAxxxxxxxxxxxxxxxx0000下
![](/icons/66562yi.gif)
个节地址15
PAGExxxxxxxxxxxx00000000下
![](/icons/66562yi.gif)
个页地址127
组合类型(COMBINE)
组合类型是告诉连接
![](/icons/66562chengxu.gif)
如何把区别模块中段名相同
![](/icons/66562de.gif)
段合并在
![](/icons/66562yi.gif)
起
![](/icons/66562dou2.gif)
具体
![](/icons/66562de.gif)
组合类型如下:
NONE表示当前段在逻辑上独立于其它模块
![](/icons/66562dou.gif)
并有其自己
![](/icons/66562de.gif)
基地址
![](/icons/66562dou2.gif)
NONE是缺省
![](/icons/66562de.gif)
组合类型
PUBLIC表示当前段和其它模块中同段名
![](/icons/66562de.gif)
PUBLIC类型段组合成
![](/icons/66562yi.gif)
个段
![](/icons/66562dou2.gif)
组合
![](/icons/66562de.gif)
先后次序取决于LINK
![](/icons/66562chengxu.gif)
中目标模块排列
![](/icons/66562de.gif)
次序
![](/icons/66562dou2.gif)
在组合时
![](/icons/66562dou.gif)
后续段
![](/icons/66562de.gif)
起始地址要按其对齐类型进行定位
![](/icons/66562dou.gif)
所以
![](/icons/66562dou.gif)
同名段的间可能有间隔
COMMON表示当前段和其它模块中同名段重叠
![](/icons/66562dou.gif)
也就是说
![](/icons/66562dou.gif)
它们
![](/icons/66562de.gif)
起始地址相同
![](/icons/66562dou2.gif)
最终段
![](/icons/66562de.gif)
长度是同名段
![](/icons/66562de.gif)
最大长度
![](/icons/66562dou2.gif)
由于段覆盖
![](/icons/66562dou.gif)
所以
![](/icons/66562dou.gif)
前
![](/icons/66562yi.gif)
同名段中
![](/icons/66562de.gif)
![](/icons/66562chushi.gif)
化数据被后续段
![](/icons/66562de.gif)
![](/icons/66562chushi.gif)
数据覆盖掉
STACK组合类型STACK表示当前段是堆栈栈
![](/icons/66562dou.gif)
其组合情况和PUBLIC相同
AT数值表达式该数值表达式是当前段所指定
![](/icons/66562de.gif)
绝对起始地址
![](/icons/66562de.gif)
段地址
类别(CLASS)
类别是
![](/icons/66562yi.gif)
个由
![](/icons/66562chengxu.gif)
员指定
![](/icons/66562de.gif)
用单引号括起来
![](/icons/66562de.gif)
![](/icons/66562zifu.gif)
串
![](/icons/66562dou2.gif)
如果
![](/icons/66562yi.gif)
个段没有给出类别
![](/icons/66562dou.gif)
那么
![](/icons/66562dou.gif)
这个段
![](/icons/66562de.gif)
类别就为空
![](/icons/66562dou2.gif)
类别是用于段
![](/icons/66562de.gif)
分类
![](/icons/66562dou.gif)
连接
![](/icons/66562chengxu.gif)
利用该类别来调整同名、同类别
![](/icons/66562de.gif)
段
![](/icons/66562dou.gif)
并使它们相邻
![](/icons/66562dou2.gif)
典型
![](/icons/66562de.gif)
类别是\"Data\"和\"Code\"
![](/icons/66562dou2.gif)
如果指定某段
![](/icons/66562de.gif)
类别是\"Code\"
![](/icons/66562dou.gif)
那么
![](/icons/66562dou.gif)
该段最好是代码段
![](/icons/66562dou.gif)
这样
![](/icons/66562dou.gif)
有
![](/icons/66562de.gif)
调试
![](/icons/66562chengxu.gif)
(如:CodeView)就可以顺序工作
例如:
DATA1SEGMENTWORDPUBLIC\"Data\"
…
DATA1ENDS
上述段定义介绍说明了该段
![](/icons/66562de.gif)
起始地址是下
![](/icons/66562yi.gif)
个字地址、组合类型为PUBLIC、段类别是\"Data\"
段组(GROUP)
段组伪指令GROUP是用于把源
![](/icons/66562chengxu.gif)
模块中若干个段结合成
![](/icons/66562yi.gif)
个组
![](/icons/66562dou.gif)
并对该段组定义
![](/icons/66562yi.gif)
个段组名
![](/icons/66562dou2.gif)
段组伪指令
![](/icons/66562de.gif)
格式如下: [Page]
段组名GROUP段名[,段名,……]
其中:段名的间要用逗号间隔
![](/icons/66562dou.gif)
段名也可以用表达式“SEG变量”或“SEG标号”
下面举例介绍说明段组伪指令
![](/icons/66562de.gif)
使用思路方法和作用
例6.12段组
![](/icons/66562de.gif)
作用
思路方法1:用
![](/icons/66562yi.gif)
个段寄存器对应 2个数据段
DATA1SEGMENT;第
![](/icons/66562yi.gif)
个数据段
b1DB 10h
DATA1ENDS
DATA2SEGMENT;第 2个数据段
b2DB 23h
DATA2ENDS
CODE1SEGMENT
ASSUME CS:CODE1,DS:DATA1;(1)
START:MOVAX,DATA1
MOVDS,AX;(2)把数据段DATA1
![](/icons/66562de.gif)
段值赋给段寄存器DS
…
MOVBL,b1;(3)引用DS来访问DATA1中
![](/icons/66562de.gif)
变量b1
…
ASSUME DS:DATA2;(4)
MOVAX,DATA2
MOVDS,AX;(5)把数据段DATA2
![](/icons/66562de.gif)
段值赋给段寄存器DS
…
MOVAL,b2;(6)引用DS来访问DATA2中
![](/icons/66562de.gif)
变量b2
…
CODE1ENDS
ENDSTART
在上例中
![](/icons/66562dou.gif)
语句(1)介绍说明DS和DATA1建立联系
![](/icons/66562dou.gif)
语句(2)对DS赋值
![](/icons/66562dou.gif)
语句(3)用DS来访问DATA1段
![](/icons/66562de.gif)
变量名
![](/icons/66562dou2.gif)
语句(4)介绍说明DS和DATA2建立联系
![](/icons/66562dou.gif)
语句(5)对DS赋值
![](/icons/66562dou.gif)
语句(6)用DS来访问DATA2段
![](/icons/66562de.gif)
变量名
在该例子中
![](/icons/66562dou.gif)
![](/icons/66562yinwei.gif)
只使用
![](/icons/66562yi.gif)
个段寄存器DS来对应 2个数据段
![](/icons/66562dou.gif)
所以
![](/icons/66562dou.gif)
需要切换DS
![](/icons/66562de.gif)
对应关系(如:语句(4))
![](/icons/66562dou2.gif)
但我们也可以用段寄存器DS和ES来分别对应段DATA1和DATA2
![](/icons/66562dou.gif)
这样
![](/icons/66562dou.gif)
思路方法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
![](/icons/66562de.gif)
段值赋给段寄存器DS
MOVAX,DATA2
MOVES,AX;把数据段DATA2
![](/icons/66562de.gif)
段值赋给段寄存器ES
…
MOVBL,b1;引用DS来访问DATA1中
![](/icons/66562de.gif)
变量b1
…
MOVAL,b2;引用ES来访问DATA2中
![](/icons/66562de.gif)
变量b2
…
CODE1ENDS
ENDSTART
我们还可以用段组来简化段寄存器
![](/icons/66562de.gif)
使用
![](/icons/66562dou.gif)
把段DATA1和DATA2组成
![](/icons/66562yi.gif)
个数据段
![](/icons/66562dou2.gif)
所以
![](/icons/66562dou.gif)
把思路方法2再改写成思路方法3
![](/icons/66562de.gif)
形式
思路方法3:用
![](/icons/66562yi.gif)
个段组组成 2个数据段
GSEGGROUPDATA1,DATA2;把段DATA1和DATA2定义成
![](/icons/66562yi.gif)
个段组
DATA1SEGMENT
b1DB 10h
DATA1ENDS
DATA2SEGMENT
b2DB 23h
DATA2ENDS
CODE1SEGMENT
ASSUME CS:CODE1,DS:GSEG
START:MOVAX,GSEG
MOVDS,AX;把段组GSEG
![](/icons/66562de.gif)
段值赋给段寄存器DS
…
MOVBL,b1;引用DS来访问DATA1中
![](/icons/66562de.gif)
变量b1
…
MOVAL,b2;引用DS来访问DATA2中
![](/icons/66562de.gif)
变量b2
…
CODE1ENDS
ENDSTART
定义段组后
![](/icons/66562dou.gif)
段组内各段所定义
![](/icons/66562de.gif)
标号和变量
![](/icons/66562dou.gif)
除了和定义它们
![](/icons/66562de.gif)
段起始点相关外
![](/icons/66562dou.gif)
还和段组
![](/icons/66562de.gif)
起始点相关
![](/icons/66562dou2.gif)
规定如下:
如果在ASSUME伪指令中介绍说明段组和段寄存器相对应
![](/icons/66562dou.gif)
那么
![](/icons/66562dou.gif)
有关标号或变量
![](/icons/66562de.gif)
偏移量就相对于段组起点计算;
如果在ASSUME伪指令中介绍说明段组内
![](/icons/66562de.gif)
某各段和段寄存器相对应
![](/icons/66562dou.gif)
那么
![](/icons/66562dou.gif)
有关标号或变量
![](/icons/66562de.gif)
偏移量就相对于该段
![](/icons/66562de.gif)
起点
简化
![](/icons/66562de.gif)
段定义
在使用简化
![](/icons/66562de.gif)
段定义方式的前
![](/icons/66562dou.gif)
必须使用存储模式介绍说明伪指令来描述源
![](/icons/66562chengxu.gif)
所采用
![](/icons/66562de.gif)
存储模式
![](/icons/66562dou2.gif)
该伪指令说
![](/icons/66562chengxu.gif)
所使用
![](/icons/66562de.gif)
存储模式
![](/icons/66562dou.gif)
汇编
![](/icons/66562chengxu.gif)
将用该存储模式生成相应
![](/icons/66562de.gif)
ASSUME和GROUP语句
![](/icons/66562dou.gif)
同时也为其它
![](/icons/66562de.gif)
简化段创建等价
![](/icons/66562de.gif)
预定义
![](/icons/66562dou2.gif)
[Page]
![](/icons/66562chengxu.gif)
存储模式介绍说明伪指令
![](/icons/66562de.gif)
格式如下:
.MODEL存储模式[
![](/icons/66562dou.gif)
语言类型][
![](/icons/66562dou.gif)
操作系统类型][
![](/icons/66562dou.gif)
堆栈类型]
隐含
![](/icons/66562de.gif)
动作还有
DEGROUPGROUPDATA,CONST,BSS,STACK
ASSUMECS:_TEXT,DS:DGROUP,SS:DGROUP
这样所有除代码
![](/icons/66562de.gif)
段都在DEGROUP段组里
![](/icons/66562dou.gif)
同过同
![](/icons/66562yi.gif)
寄存器来实现存取
、SMALL
所有
![](/icons/66562de.gif)
数据变量必须在
![](/icons/66562yi.gif)
个数据段的内
![](/icons/66562dou.gif)
所有
![](/icons/66562de.gif)
代码也必须在
![](/icons/66562yi.gif)
个代码段的内
![](/icons/66562dou2.gif)
在这种模型下
![](/icons/66562dou.gif)
数据段寄存器
![](/icons/66562de.gif)
内容保持不变
![](/icons/66562dou.gif)
所有转移也都是段内转移
该存储类型是独立汇编语言源
![](/icons/66562chengxu.gif)
常用
![](/icons/66562de.gif)
存储模型
、MEDIUM
所有
![](/icons/66562de.gif)
数据变量必须在
![](/icons/66562yi.gif)
个数据段的内
![](/icons/66562dou.gif)
但代码段可以有多个
![](/icons/66562dou2.gif)
在这种模型下
![](/icons/66562dou.gif)
数据段寄存器
![](/icons/66562de.gif)
内容保持不变
![](/icons/66562dou.gif)
转移可以是段间转移
、COMPACT
数据段可以有多个
![](/icons/66562dou.gif)
但代码段只能有
![](/icons/66562yi.gif)
、LARGE
数据段和代码段都可以有多个
![](/icons/66562dou.gif)
但
![](/icons/66562yi.gif)
个
![](/icons/66562shuzu.gif)
![](/icons/66562de.gif)
字节数不能超过64KB
、HUGE
数据段和代码段都可以有多个
![](/icons/66562dou.gif)
![](/icons/66562yi.gif)
个
![](/icons/66562shuzu.gif)
![](/icons/66562de.gif)
字节数也可以超过64KB
简化段定义伪指令
简化段定义伪指令在介绍说明
![](/icons/66562yi.gif)
个新段即将开始
![](/icons/66562de.gif)
同时
![](/icons/66562dou.gif)
也介绍说明了上
![](/icons/66562yi.gif)
个段
![](/icons/66562de.gif)
结束
![](/icons/66562dou2.gif)
在本段定义结束时
![](/icons/66562dou.gif)
也不必用伪指令“ENDS”来标识
具体
![](/icons/66562de.gif)
伪指令介绍说明形式及其功能描述如下:
1、代码段定义
.CODE
作用:介绍说明其下面
![](/icons/66562de.gif)
内容是代码段中内容
2、堆栈段定义
.STACK[堆栈字节数]
其中
![](/icons/66562dou.gif)
“堆栈字节数”可以不写
![](/icons/66562dou.gif)
其缺省值为1024B
3、数据段定义
.DATA/.DATA?/.CONST
作用:介绍说明其下面
![](/icons/66562de.gif)
内容是数据段中
![](/icons/66562de.gif)
变量定义
在
![](/icons/66562yi.gif)
个源
![](/icons/66562chengxu.gif)
中
![](/icons/66562dou.gif)
可以有多个伪指令.DATA定义
![](/icons/66562de.gif)
数据段
![](/icons/66562dou.gif)
这就好象在源
![](/icons/66562chengxu.gif)
中定义多个同段名
![](/icons/66562de.gif)
数据段
![](/icons/66562yi.gif)
样
伪指令.DATA?介绍说明下面是
![](/icons/66562yi.gif)
个未
![](/icons/66562chushi.gif)
化数据段
![](/icons/66562de.gif)
开始
![](/icons/66562dou.gif)
伪指令.CONST介绍说明下面是
![](/icons/66562yi.gif)
个常数数据段
![](/icons/66562de.gif)
开始
![](/icons/66562dou2.gif)
这 2条伪指令很少使用
![](/icons/66562dou.gif)
除非在和高级语言编写
![](/icons/66562de.gif)
![](/icons/66562chengxu.gif)
相结合时
![](/icons/66562dou.gif)
为了遵守高级语言
![](/icons/66562de.gif)
某些约定
![](/icons/66562dou.gif)
而需要特殊介绍说明时才使用
汇编
![](/icons/66562chengxu.gif)
在处理简化
![](/icons/66562de.gif)
堆栈段和数据段定义时
![](/icons/66562dou.gif)
它会自动地把伪指令.STACK、.DATA、.DATA?和.CONST所定义
![](/icons/66562de.gif)
段组合成
![](/icons/66562yi.gif)
个段组
![](/icons/66562dou2.gif)
如果想定义
![](/icons/66562yi.gif)
个独立
![](/icons/66562de.gif)
、不和其它段组合在
![](/icons/66562yi.gif)
起
![](/icons/66562de.gif)
数据段
![](/icons/66562de.gif)
话
![](/icons/66562dou.gif)
那么
![](/icons/66562dou.gif)
就可选用下面
![](/icons/66562de.gif)
数据段定义方式
4、远程数据段定义
.FARDATA[段名]/.FARDATA?[段名]
其中:“段名”是可选项
![](/icons/66562dou.gif)
如果不指定
![](/icons/66562de.gif)
话
![](/icons/66562dou.gif)
则该段名就取其缺省段名
作用:介绍说明
![](/icons/66562yi.gif)
个独立
![](/icons/66562de.gif)
数据段
伪指令.FARDATA?介绍说明下面是
![](/icons/66562yi.gif)
个未
![](/icons/66562chushi.gif)
化
![](/icons/66562de.gif)
、独立数据段
![](/icons/66562de.gif)
开始
![](/icons/66562dou2.gif)
通常情况下
![](/icons/66562dou.gif)
很少使用该伪指令
简化段段名
![](/icons/66562de.gif)
引用
当使用简化
![](/icons/66562de.gif)
段定义时
![](/icons/66562dou.gif)
![](/icons/66562yi.gif)
般情况下
![](/icons/66562dou.gif)
![](/icons/66562chengxu.gif)
员可以不知道这些段
![](/icons/66562de.gif)
段名、段地址堆齐类型和组合类型等
![](/icons/66562dou2.gif)
但当把简化定义
![](/icons/66562de.gif)
段和标准定义
![](/icons/66562de.gif)
段混合使用时
![](/icons/66562dou.gif)
就需要知道简化定义段
![](/icons/66562de.gif)
基本属性
![](/icons/66562dou2.gif)
表6.3是在小模式下段
![](/icons/66562de.gif)
基本属性对应表
表6.3小模式下简化段定义
![](/icons/66562de.gif)
缺省属性表
伪指令缺省段名对齐类型组合类型类别段组名
.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
在其它存储模型下
![](/icons/66562dou.gif)
由伪指令\".CODE\"介绍说明
![](/icons/66562de.gif)
代码段段名在\"_TEXT\"的前还要加上其模块名(源
![](/icons/66562chengxu.gif)
名)
![](/icons/66562dou2.gif)
假设
![](/icons/66562dou.gif)
某模块名为ABC
![](/icons/66562dou.gif)
则其缺省
![](/icons/66562de.gif)
代码段段名就为ABC_TEXT
![](/icons/66562dou2.gif)
因此
![](/icons/66562dou.gif)
在这种情况下
![](/icons/66562dou.gif)
![](/icons/66562chengxu.gif)
![](/icons/66562de.gif)
模块名或源
![](/icons/66562chengxu.gif)
名不要以数字开头
供C
![](/icons/66562diaoyong.gif)
![](/icons/66562de.gif)
过程:主要大家记住几个要点
![](/icons/66562dou.gif)
C语言把
![](/icons/66562hanshu.gif)
和外部变量和静态变量在生成
![](/icons/66562de.gif)
汇编代码中以_开头
![](/icons/66562dou.gif)
内存模式要匹配
![](/icons/66562dou.gif)
通过堆栈
![](/icons/66562dou.gif)
BP压栈
![](/icons/66562dou.gif)
BP=SP
![](/icons/66562dou.gif)
返回要看C
![](/icons/66562de.gif)
汇编
![](/icons/66562dou.gif)
![](/icons/66562yi.gif)
般为累加AX
![](/icons/66562dou.gif)
记得保护积存器
Tags:
延伸阅读
最新评论