以下程序的要点是用每种背景和前景色的组合打印出字母“c”。
在我正在使用的库中,颜色定义为0-15,并使用以下代码:
mov eax,FOREGROUND + (BACKGROUND * 16)
call SetTextColor
这是我的代码:
INCLUDE Irvine32.inc
.data
character BYTE "c"
count DWORD ?
background DWORD 0
.code
main PROC
call Clrscr
mov ecx, 15 ; our main counter 0-15 colors
L1:
mov count, ecx ; store our outer loop counter
mov ecx, 15 ; set out inner loop counter
L2:
; since our color is defined like so... mov eax,FOREGROUND + (BACKGROUND * 16)
mov eax, count ; setup our foreground color
add eax, background ; setup our background color
call SetTextColor
; instead of multiplying each background color by 16, we are going to
; add 16 each time.
add background, 16
; print the character
mov edx, OFFSET character
call WriteString
loop L2
mov ecx, count ; reset our outside loop
loop L1
call Crlf
exit
main ENDP
END main
现在,我正在使用Windows 7,上面的代码“有效”,但由于某种原因,它进入某一点,程序停止,计算机开始发出哔哔声。此外,在程序的某个点,它开始打印带有字母c的随机字符..这是我的输出:
c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♀c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c♂c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c c c c c c c c c c
c c c c c cccccccccccccccc♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c♠c
♠c♠c♠c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♣c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♦c♥c♥c♥c♥c♥c♥c♥c
♥c♥c♥c♥c♥c♥c♥c♥c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☻c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺c☺
Press any key to continue . . .
谁能告诉我为什么会这样?
答案 0 :(得分:3)
Irvine的WriteString需要一个"以null结尾的字符串"。有些人可以将帮助下载为CHM文件here (IrvineLibHelp.exe)。
说'#34; EDX =指向字符串"有点草率。 EDX只指向一个标签可识别的内存地址(这里是:"字符")。 WriteString
将从该位置获取字节,并将其写为字符或控制指令,无论其实际类型或意图如何,直到它遇到值为0的字节.MASM没有指令定义最后一个字符串0,所以必须手动添加:
character BYTE "c", 0
打印字符的另一种方法是使用WriteChar:
...
; print the character
mov al, character
call WriteChar
loop L2
mov ecx, count ; reset our outside loop
loop L1
...
答案 1 :(得分:2)
character BYTE "c"
应该是:
character BYTE "c",0dh,0ah,0
答案 2 :(得分:0)
WriteString做什么?如果函数打印一个字符串,你可能需要用$结束“character BYTE”c“”(如果是DOS程序.09函数Int21h)