一个16位汇编画图的例子
这段代码是我在一个汇编打字游戏中 ,截取下来的,功能就是 往 dos窗口 的边上打上图形 调用的是BIOS INT10H 中断 有几个地方不明白,我明白的地方都给出来注释 高手看看
先解释下参数 ;初始化程序界面的宏,共七个参数
;op1,op2:打印边框的初始位置
;op3:要打印的字符的ASCII代码
;op4:循环自增方向
;op5:打印次数 op6:标号
Init_game macro op1,op2,op3,op4,op5,op6
mov cx,00h
mov dh,op1
mov dl,op2
op6:
mov ah,02h ;设置光标位置 ,因为上下左右4个边框都要画图,所以这个宏要调用4次,指定位置为 mov dh,op1(光标所在的行) mov dl,op2(光标所在的列)
mov bh,00h ;在图形方式中,总是把该寄存器设置成0(这个注释可能不对)
int 10h ;(ah等于2的中断,需要4个参数,DH,DL和bh)
push cx ;保存cx寄存器的值,该寄存器用作和 op5做比较,控制要打印图形的次数。
mov ah,0ah ;指出“写字符”功能调用
mov al,op3 ;该寄存器放要写字符对应的ASCII码
mov bh,00h
mov cx,01h ;此寄存器指明把字符和属性写到屏幕上的次数
int 10h
pop cx
inc cx
inc op4
cmp cx,op5
jne op6 ;不等于则转移
endm
code segment
main proc far
assume cs:code
start:
Init_game 00d,00d,0ah,dl,80d,nextsign1 ; 上面
Init_game 24d,00d,0ah,dl,80d,nextsign2 ; 下面
Init_game 00d,00d,0ah,dh,25d,nextsign3 ;左边
Init_game 00d,79d,0ah,dh,25d,nextsign4 ;右边
main endp
code ends
end start
程序没有 mov ax,4c00H INT 10H 不过也能看出效果
第一个问题:首先 假设 程序打印最上面一行 ,开始 先设置 光标开始位置,00d,00d,然后 每一次循环 打印一个图形,但是每次循环 光标开始位置都是00d,00d也没有变化 啊 ,那怎么实现打印一行的图形啊 ,难道不是在光标所在位置 画图形?
第二个问题(两个小问题): 我查找int10h 的资料 ,上面说 调用“写字符“功能时,要指明4的参数 ,al (该寄存器放要写字符对应的ASCII码)ah(在文本方式中,该寄存器指明正在写的显示页,在40列方式中,可以用0到7页,在80列方式中 ,可以用0到3页,在图形方式和 方式7(对应于单色显示适配器的文本方式)中),可忽略该寄存器),bl(在图形方式中,规定字符的前景色,在文本方式可忽略此寄存器 ),我不明白的是网上这段代码到底是图形方式还是文本方式啊 ,怎么区分?他两次 调用10号中断 给mov bh,00h 是什么意思啊 ?
第三个问题:;参数 op4:循环自增方向 ,调用 的时候 传进来的是dh和dl 请问这怎么实现 自增方向?
问题很多 希望解答下 谢谢
[[it] 本帖最后由 toyix 于 2008-9-2 14:41 编辑 [/it]]