?? page259.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第9章 圖形顯示</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="page258.html">上一頁</a> <a href="page260.html">下一頁</a> <a href="page269.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">第9章 圖形顯示</td> <!章節名>
<td></td><td>-259-</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>
程序PROG2的結構和PROG1完全相同,只是其中的指令"JA"被換成了"JG"而已。然而就是這一點點變化,卻使這個程序輸出的結果與PROG1完全不同。本來255是大于1的,而這個程序卻輸出了"Less!",難道255反而小于1嗎?<br>
實際上255的確是小于1的,因為從補碼的角度來看255實際是個負數。由此我們可以推測出指令"JA/JB"與"JG/JL"的一個重要的區別:指令"JA/JB"總是將相比較的兩個數當成"無符號數",而指令"JG/JL"則是將相比較的兩個數當成"帶符號數"。這樣的一種特性就要求我們在編寫程序時頭腦之中要很清楚相比較的兩個數是不是帶符號的,以便于我們選擇下面的條件轉移指令。<br>
在8086的指令集中有很多條件轉移指令,這些指令所判斷的標志位各不相同,而且有些指令在形式上還有變化,因此條件轉移指令其實是8086匯編語言程序設計中的一個難點。關于標志寄存器與條件轉移指令的有關問題我們將在下面一章加以討論。<br>
LOVE.ASM程序的核心部分就是LINE子過程,這個子過程用于在兩個點之間畫直線。與我們討論的Bresenham算法相比這個子過程在畫線之前做了好多額外的計算與判斷,這主要是因為實際畫線的方向并不都是從左上到右下。<br>
假如畫線方向是從右上到左下,那么X坐標的增量就不是+1,而是-1。即使所畫線的方向是從左上至右下,由于直線的斜率不同,究竟是以X坐標作為循環計數而調整Y坐標,還是以Y坐標作為循環計數調整X坐標也是有區別的。所以實際的Bresenham算法在真正畫線之前要對各種不同的畫線方向進行一些判斷來確定畫線時的各項參數。<br>
本節至此已經對BIOS提供的繪圖功能做了較詳細地介紹,同時給出了描繪文字以及繪制直線的算法。BIOS的功能還是很多的,它不僅提供了"畫點"功能,同時還提供了"讀點"功能,即判斷屏幕上某個位置的點的顏色。
</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>
功能號:0DH<br>
用 途:取得圖形屏幕上指定位置點的顏色<br>
參 數:CX=指定位置的X坐標<br>
DX=指定位置的Y坐標<br>
調 用:INT 10H<br>
返 回:AL = 所讀點的顏色值
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
這個功能好象在電子游戲程序中可以用到,比如編寫一個射擊游戲,在判斷子彈是否擊中物體時就可以應用這個功能。下面給出的程序是一個"動畫"程序,它先在屏幕上畫出一個方框,然后在方框內顯示一個作直線運動的白點,當這個白點撞到方框邊緣時就會反彈。程序中就是應用了BIOS的讀點功能判斷彩色點是否"撞到"邊框的:
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=2>
PINGPONG<br>
code<br>
<br>
<br>
main<br>
<br>
mess<br>
start:
</td>
<td colspan=2>
.ASM<br>
segment<br>
assume<br>
org<br>
proc<br>
jmp<br>
db<br>
mov
</td>
<td colspan=7>
<br>
<br>
cs:code,ds:code<br>
100h<br>
near<br>
start<br>
'Press Any Key...',0dh,0ah,'$'<br>
ax,0004
</td>
<td colspan=7>
<br>
<br>
<br>
<br>
<br>
;跳過數據區<br>
<br>
;設置圖形顯示模式4
</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="page258.html">上一頁</a> <a href="page260.html">下一頁</a> <a href="page269.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -