📄 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 + -