-250- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
end_line: code |
mov mov mov mov int inc mov cmp ja mul div mov jmp mov int mov int mov int ends end |
ch,0 dh,0 al,1 ah,0ch 10h x0 al,x0 al,x1 end_line byte ptr k byte ptr k+1 y0,al pixel ah,0 16h ax,0003h 10h ah,4ch 21h start |
;选择青色 ;在CX-DX指定的位置画一个点 ;X坐标加1,得下一个点的X坐标 ;将新的X坐标送入AL寄存器 ;已经画到最后一个点了吗? ;已经画到最后一个点,转END_LINE ;计算(K x X) ;将算出的Y坐标存入Y0 ;转PIXEL继续画点 ;等待键盘输入 ;设置字符显示模式3 ;结束进程 |
||||||||||||||||||
此程序并未直接给出直线的斜率K,而是给出直线起始点与终止点的坐标,通过两个点的坐标计算出K。这好象有些繁琐,程序的指令增多,计算量也大了,这样设计程序不是自找麻烦吗? 大家平时一想起直线首先想到公式"y=Kx+b",然而真正在纸上画直线时几乎没有人考虑什么斜率、截距之类的东西。谁都愿意在知道起止点的情况下画线,直尺一连即可,这是最省事的。 任何一个成功的图形制作软件在画直线时都不会要求用户输入斜率、截距这样的参数,都是要求用户输入起止点坐标,或者让用户用鼠标器直接定起止点,而对于用户来说这种画线方式也是最直观,最方便的。这也就是说,把程序设计成这样一种形式其实是为程序的用户着想,虽然这个程序不可能有什么用户。 上面这个程序可以画出从点(0,0)至(199,199)这样一条对角线来,看上去效果还能让人接受。然而如果将程序中Y1的值改成1的话那么这个程序可就有问题了。 当然这个程序仍然可以运行并能画出线来,但是这条线的效果可就不能让人接受了。仔细观察这条线可以看到,组成线条的前199个点都位于屏幕第一行,只有最后一个点位于下面一行。这又是为什么呢? 问题的关键在于电脑显示器的分辨率是有限的,计算机只能在"整数"坐标位置显示点,不可能在两个扫描行之间显示出点来。所以当程序计算出某个点的Y坐标为199/200时,计算机也只能将此点画在第一行或下一行,具体要画在哪一行和程序取整的方法有关。 如果程序对所有计算出来的Y坐标都直接取整的话,那么理论上位于(199,199/200)处 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |