⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page92.html

📁 编者李春生
💻 HTML
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第5章 子过程和串处理</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="page91.html">上一页</a> <a href="page93.html">下一页</a> <a href="page116.html">下一章</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>-92-</td><td></td> <!页码>
<td colspan=6>PC机汇编语言实战精解</td><td colspan=4></td><td colspan=6 align="right"><img src="icons/flag.gif"></td> <!书名>
<td></td><td></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=2>
<br>
<br>
<br>
main<br>
code<br>
<br>
</td>
<td colspan=2>
mov<br>
int<br>
ret<br>
endp<br>
ends<br>
end
</td>
<td colspan=6>
ah,2<br>
21h<br>
<br>
<br>
<br>
main
</td>
<td colspan=8>
<br>
<br>
;① 返回LOW4B处,② 返回操作系统<br>
<br>
<br>
<br>
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  这个程序由前面的TESTKEY.ASM变化而得,和它的"祖先"相比这个程序显得短了一些,它是一个COM文件。我们先来看看新增的"LABEL"伪指令:
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=2><hr></td>
<td colspan=2 align="center"><font size=5>LABEL<font></td>
<td colspan=14><hr></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18><font face="楷体_GB2312">
  这个伪指令提供了一种在程序中定义标号的方法,它的应用格式为:
</font></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=6><hr></td><td colspan=6 align="center"><font face="楷体_GB2312" size=5>标号名 LABEL 属性<font></td><td colspan=6><hr></td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  以前我们一直都是在指令前直接加带冒号的标号,象上面程序中的"START:",和"LOW4B:"等,那么用LABEL伪指令所定义的标号和这些直接给出的标号有什么区别呢?不言而喻,主要的区别就在于LABEL伪指令可以使所定义的标号具有属性。这属性指示出转移到(或调用)此标号时,是段内还是段间转移。<br>
  我们在这个程序使用LABEL定义了一个名为HEX2ASC标号,这个标号将MAIN过程切割成两部分,程序中的CALLHEX2ASC指令实际是MAIN过程对它自身的一部分进行调用,这次调用将显示出AL寄存器的高4bit,而显示低4bit时程序直接进入了HEX2ASC部分。不难看出程序最后的RET指令被执行了两次,第一次执行使CPU返回到标号"LOW4B:"处继续执行指令,而第二次执行结束了整个进程。下面是用DEBUG跟踪这个程序的过程:<br>
C:\ASM\>DEBUG TESTKEY2.COM[Enter]
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=9>-g=100 120[Enter]</td><td colspan=9></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>AX=01B1</td><td colspan=2>BX=0103</td><td colspan=2>CX=0004</td><td colspan=2>DX=1B00</td><td colspan=2>SP=FFFE</td><td colspan=2>BP=0000</td><td colspan=2>SI=0000</td><td colspan=2>DI=0000</td><td colspan=2></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>DS=0E69</td><td colspan=2>ES=0E69</td><td colspan=2>SS=0E69</td><td colspan=2>CS=0E69</td><td colspan=2>IP=0120</td>
<td colspan=5>OV UP EI PL NZ NA PO CY</td><td colspan=3></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>0E69:0120</td><td colspan=2>E80200</td><td colspan=6>CALL 0125</td>
<td colspan=8></td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  利用"G"命令控制程序执行到0E69:0120处停下,以便于观察CALL指令的执行情况。注意当程序等待键盘输入时敲一下"ESC"键。
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=9>-t</td><td colspan=9></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>AX=01B1</td><td colspan=2>BX=0103</td><td colspan=2>CX=0004</td><td colspan=2>DX=1B00</td><td colspan=2>SP=FFFC</td><td colspan=2>BP=0000</td><td colspan=2>SI=0000</td><td colspan=2>DI=0000</td><td colspan=2></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>DS=0E69</td><td colspan=2>ES=0E69</td><td colspan=2>SS=0E69</td><td colspan=2>CS=0E69</td><td colspan=2>IP=0125</td>
<td colspan=5>OV UP EI PL NZ NA PO CY</td><td colspan=3></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>0E69:0125</td><td colspan=2>240F</td><td colspan=6>AND AL,0F</td>
<td colspan=8></td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  用"T"命令跟踪CALL指令,可以看到CPU转至0E69:0125处执行,此时我们可以观察一下存入堆栈中的返回地址:
</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 &copy; 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="page91.html">上一页</a> <a href="page93.html">下一页</a> <a href="page116.html">下一章</a></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -