?? page289.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第10章 細節補充</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="page288.html">上一頁</a> <a href="page290.html">下一頁</a> <a href="page291.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">第10章 細節補充</td> <!章節名>
<td></td><td>-289-</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>
與指令"MOV 寄存器,OFFSET 數據標號"完全一致,但是它們之間有一些很微妙的差別。這個差別在應用DEBUG編制程序時就有體現,請看下面的例子:<br>
C:\ASM\>DEBUG[Enter]
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=9>
-a100[Enter]<br>
0F6A:0100 mov ah,9<br>
0F6A:0102 mov dx,109<br>
0F6A:0105 int 21<br>
0F6A:0107 int 20<br>
0F6A:0109 db'This is a sample',0d,0a,24<br>
0F6A:011C[Enter]
</td>
<td colspan=9>
-a100[Enter]<br>
0F6A:0100 mov ah,9<br>
0F6A:0102 lea dx,[10a]<br>
0F6A:0106 int 21<br>
0F6A:0108 int 20<br>
0F6A:010A db'This is a sample',0d,0a,24<br>
0F6A:011D [Enter]
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
這兩個程序很簡單,可以在屏幕上顯示一個字符串。所不同的是第二個程序換用"LEA"指令完成取偏移地址的功能。"LEA"的應用格式是很特殊的,表面上看這個指令采用一個存儲器直接尋址方式,取到DX寄存器中的數據應該是"T"與"h"的ASCII碼6854H,實際上如果跟蹤執行這個程序就會觀察到取到DX寄存器中的數據并非是6854H,而正是010AH。可見這個指令與MOV指令并不相同,通常對"尋址方式"的理解并不適用于LEA指令。<br>
由此看來指令"LEA BX,[SI]"也不是要把內存中[SI]地址處的兩字節數據送進BX寄存器,而是送進SI的值。這一點可以說是這個指令最奇怪的地方,不過要是再細想一下這也正是將LEA稱為"取有效地址指令"的原因。<br>
特別值得一提的是Borland公司出品的Turbo Assembly編譯程序(TASM.EXE)對LEA指令的處理方法很不尋常,它會不聲不響地用指令"MOV 寄存器,OFFSET 標號"替換掉LEA。原因很簡單,這樣替換之后生成的可執行程序會短小一些。這一點從剛才我們用DEBUG編制的兩個對比程序中也可以看出來。<br>
另外新增的LES指令是用于處理32位指針的:
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3 align="center"><img src="icons/note.gif"></td>
<td colspan=15>
助記符:LES(Load ES with pointer)<br>
用 途:將存于內存中的32位指針送入ES和指定的寄存器內<br>
格 式:LES 寄存器,存儲單元<br>
執 行:32位指針中低16位作為偏移地址送入指定的寄存器中,高16位作<br>
為段地址送入ES寄存器中
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
所謂32位的指針,其實就是以"段:偏移"形式給出的完整的邏輯地址,只是要求段地址在高字,偏移地址在低字而已。應用這個指令要注意兩點:<br>
<font face="楷體_GB2312">
(1)此指令并非要固定與DI寄存器配合,雖然在串處理指令中ES段寄存器與DI寄存器是配合應用的,但是這條指令允許將偏移地址裝入其它寄存器中。比如"LES SI,存儲器"、"LES AX,存儲器"這樣的用法都可以;<br>
(2)與指令LEA不同,這個指令是真正要從內存中取得指針。不過在內存中定義指針時要采用定義"雙字"的偽指令。前面我們講過偽指令DB和DW,DB可以定義一個BYTE,DW可以定義一個WORD,如果要定義一個"雙字"就要使用偽指令"DD(Define Double word)"。如果32位指針不是使用DD偽指令定義的,則使用LES指令編制的程序會出現編譯錯誤。<br>
</font>
段地址并不是只能裝入ES寄存器,還可以裝入DS寄存器,相應的指令就是LDS(Load DS with pointer),用法及注意事項與LES指令相同,不再過多討論。<br>
(7)CPU控制指令
</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="page288.html">上一頁</a> <a href="page290.html">下一頁</a> <a href="page291.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -