📄 page325.html
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第11章 更高级的技术</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page324.html">上一页</a> <a href="page326.html">下一页</a> <a href="page328.html">附录A</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td> <!左侧空白>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td> <!右侧空白>
</tr>
<!页眉行>
<tr height=60 valign="bottom">
<td></td><td></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第11章 更高级的技术</td> <!章节名>
<td></td><td>-325-</td><td></td> <!页码>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
如果把数据段与代码段的定位类型改成"BYTE",那么编译之后的程序就是下面这样了:<br>
C:\ASM\>debug demo.exe[Enter]<br>
-u7 17[Enter]
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>
<u>0F9C</u>:0007<br>
<u>0F9C</u>:0008<br>
<u>0F9C</u>:000A<br>
<u>0F9C</u>:000B<br>
<u>0F9C</u>:000E<br>
<u>0F9C</u>:0010<br>
<u>0F9C</u>:0013<br>
<u>0F9C</u>:0015<br>
<u>0F9C</u>:0017
</td>
<td colspan=2>
1E<br>
33C0<br>
50<br>
B89C0F<br>
8ED8<br>
BA0000<br>
B409<br>
CD21<br>
CB
</td>
<td colspan=2>
PUSH<br>
XOR<br>
PUSH<br>
MOV<br>
MOV<br>
MOV<br>
MOV<br>
INT<br>
RETF
</td>
<td colspan=12>
DS<br>
AX,AX<br>
AX<br>
AX,<u>0F9C</u><br>
DS,AX<br>
DX,0000<br>
AH,09<br>
21<br>
<br>
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
可以看到代码与数据都在0F9CH段里了。这种情况有些象COM文件,不过这个程序不能转换成COM文件,因为代码的起始地址不是偏移0100H。<br>
那么将源程序中的"PARA"改成"BYTE"后程序的起始地址为什么是0007H呢?这只要算清数据段内究竟有几个字节数据就可以搞清楚了。<br>
这样一来就可以推断出如果再把"BYTE"改成"WORD",那么代码的偏移地址就应该是0008H,大家可以自行修改源程序进行验证。<br>
(2)组合类型<br>
组合类型与模块化程序设计技术有关。前面已经说过,每个模块都是一个独立的源程序,都有自己的段定义。设置一定的组合类型就可以通知LINK程序把一些分散在不同模块内的同类型段组织在一个段内,这样可以使最终形成的可执行文件结构比较清晰。组合类型共有5种:<br>
<font face="楷体_GB2312">
PUBLIC: 凡是组合类型为PUBLIC的同名段在连接时都会被组织到一起,段的顺序按OBJ文件的先后顺序安排。<br>
COMMON: 这种类型的段在连接时会被其它模块中的同名段覆盖掉,连接后段的长度以所有同名段中最长者为准。通常情况下这种类型的段可应用于在不同的模块之间共享数据,对于定义一般的数据定义而言不使用这种类型的段。<br>
AT 表达式:编译程序把表达式的值当作该段的段地址,采用这种组合类型可以很方便地从内存中取得数据。比如采用下面定义的这个段就可以很方便地从BIOS数据区内取得系统时钟计数:
</font>
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>
BIOSDATA<br>
<br>
TIMER<br>
BIOSDATA<br>
CODE<br>
<br>
START:<br>
<br>
</td>
<td colspan=2>
SEGMENT<br>
ORG<br>
DD<br>
ENDS<br>
SEGMENT<br>
ASSUME<br>
MOV<br>
MOV
</td>
<td colspan=6>
AT 0040H<br>
6CH<br>
?<br>
<br>
<br>
CS:CODE<br>
AX,BIOSDATA<br>
ES,AX
</td>
<td colspan=8>
</td>
<td></td><td></td> <!右边距>
</tr>
</font>
<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page324.html">上一页</a> <a href="page326.html">下一页</a> <a href="page328.html">附录A</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -