之前关于dos下汇编输出闪烁问题已经得到了很好的解决,主要是由于中间输出了空格,导致屏幕输出的内容一闪而过
具体内容可以参考此博客汇编语言课程设计1 实验详解
下面来介绍x86下汇编程序出现的一个bug
题目如下:
编写程序画一个8*8的棋盘,盘面为相互交替的灰色和白色方块。编程时可以使用Irvine32链接库的SetTextColor和Gotoxy过程,不要使用全局变量,使用每个过程中声明的参数。每个过程只完成单一任务,以尽可能地简短。
有bug程序如下
include Irvine32.inc
.data
black = 0
blue = 1
green = 2
cyan = 3
red = 4
magenta = 5
brown = 6
lightGray = 7
gray = 8
lightBlue = 9
light_Green = 10
lightCyan = 11
lightRed = 12
light_Magenta = 13
yellow = 14
white = 15
.code
paincolor proc
;将8*8棋盘改为盘面为相互交替的灰色和白色方块
;ebx传递非白色方块的背景颜色
;esi传递其他方块的颜色
mov eax,ebx
mov dh,10
;dh为行数
mov dl,10
;dl为列数
mov ecx,10
L1:
push ecx
mov ecx,10
mov dl,10
L2:
call Gotoxy
call SetTextColor
call Clrscr
cmp eax,ebx
je L3 ;相等时跳转到L3循环
mov eax,ebx
jmp L4 ;不等时给eax赋值,跳过L3的赋值语句 ;来到L4的赋值语句
L3:
mov eax,white + (white * 16)
L4:
call Crlf
inc dl
loop L2
pop ecx
inc dh
loop L1
paincolor endp
main proc
mov ebx,black + (white * 16)
call paincolor
exit
main endp
end main
无法输出颜色是因为没有指定字符
在每次输出的时候加入‘A’即可解决问题
include Irvine32.inc
.data
black = 0
blue = 1
green = 2
cyan = 3
red = 4
magenta = 5
brown = 6
lightGray = 7
gray = 8
lightBlue = 9
light_Green = 10
lightCyan = 11
lightRed = 12
light_Magenta = 13
yellow = 14
white = 15
.code
paincolor proc
;将8*8棋盘改为盘面为相互交替的灰色和白色方块
;ebx传递非白色方块的背景颜色
;esi传递其他方块的颜色
mov eax,ebx
mov dh,10
;dh为行数
mov dl,10
;dl为列数
;call Clrscr
mov ecx,10
L1:
push ecx
mov ecx,10
mov dl,10
L2:
;call Clrscr
call Gotoxy
call SetTextColor
push eax
mov al,'A'
call WriteChar
pop eax
cmp eax,ebx
je L3 ;相等时跳转到L3循环
mov eax,ebx
jmp L4 ;不等时给eax赋值,跳过L3的赋值语句 ;来到L4的赋值语句
L3:
mov eax,white + (black * 16)
L4:
;call Crlf
inc dl
loop L2
pop ecx
inc dh
loop L1
paincolor endp
main proc
mov ebx,gray + (black * 16)
call paincolor
exit
main endp
end main