?? page21.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第2章 開始設計程序</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="page20.html">上一頁</a> <a href="page22.html">下一頁</a> <a href="page27.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></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第2章 開始設計程序</td> <!章節名>
<td></td><td>-21-</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=3 align="center"></td>
<td colspan=15>
執 行:PUSH指令使"堆棧"中存入了寄存器或存儲單元中數據的副本,POP指令會使"堆棧"中最頂端的數據出棧并進入給出的寄存器或存儲單元中
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
"堆棧"是內存中一段連續的存儲單元,它主要用于臨時存放數據。堆棧在內存中的位置可以是任何一段空閑存儲單元,它的段地址由SS寄存器指示,而數據存放的位置由堆棧指針SP寄存器指示。那么堆棧段在應用上與一段存儲段有何差別呢?
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3 align="center"><img src="icons/attention.gif"></td>
<td colspan=15><font face="楷體_GB2312" lang="ZH-CN" size=3>
① 堆棧中保存的數據都是16位的,我們把16位的數據稱為"字(WORD)"。8位數據無法用PUSH指令放入堆棧;<br>
② 其次,和程序不一樣,堆棧的起始于內存"高地址"位置,這可以通過R命令觀察到。進入DEBUG之后使用R命令查看各個寄存器的值,可以看到指令指針IP寄存器指向偏移0100H,而"堆棧指針"SP寄存器則指向0FFEEH。<br>
③ PUSH進棧的數據總是從高地址向低地址方向排列,每執行一次PUSH指令,SP寄存器就會自動減2,同時數據存入SP指向的位置。也就是說,只要不人為修改SP寄存器,那么SP將永遠指向最后一個進入堆棧的數據;<br>
④ 和PUSH指令相反,POP指令會把SP寄存器指向的數據取到指定寄存器中,同時SP會自動加2。所以,POP指令總是取出堆棧最后一個數據,即堆棧具有"后進先出"的性質。
</font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=8 align="center"><img src="figures/F2_7.gif"><br><font face="楷體_GB2312" lang="ZH-CN" size=3>圖2-6 DEBUG狀態下的堆棧設置</font></td>
<td></td><td></td>
<td colspan=8>
PROG1-B<br>
0B1D:0100 MOV CX,0800<br>
0B1D:0103 PUSH CX<br>
0B1D:0104 IN AL,61<br>
0B1D:0106 XOR AL,02<br>
0B1D:0108 OUT 61,AL<br>
0B1D:010A MOV CX,0500<br>
0B1D:010D LOOP 010D<br>
0B1D:010F POP CX<br>
0B1D:0110 LOOP 0103<br>
0B1D:0112
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
圖2-6表示了進入DEBUG后代碼和堆棧的位置。為了更好地說明堆棧的特性,我們用DEBUG編一小段程序:
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td></td><td></td> <!左邊距>
<td colspan=6>
C:\ASM\>DEBUG[Enter]<br>
-a100[Enter]<br>
0B01:0100 mov ax,1234<br>
0B01:0103 mov bx,abcd<br>
0B01:0106 push ax<br>
0B01:0107 push bx<br>
0B01:0108 pop ax<br>
0B01:0109 pop bx<br>
0B01:010A [Enter]
</td>
<td></td>
<td colspan=9>輸入這些內容</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="page20.html">上一頁</a> <a href="page22.html">下一頁</a> <a href="page27.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -