gpt4 book ai didi

assembly - Irvine 的 WriteString 的奇怪输出

转载 作者:行者123 更新时间:2023-12-01 11:58:35 24 4
gpt4 key购买 nike

以下程序的要点是用每种背景色和前景色的组合打印出字母“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 . . .

谁能告诉我为什么会这样?

最佳答案

尔湾 WriteString需要一个“以空字符结尾的字符串”。有些人可以将帮助下载为 CHM 文件 here (IrvineLibHelp.exe) .

说“EDX = points to string”有点草率。 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
...

关于assembly - Irvine 的 WriteString 的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com