[英]Masm32: SetConsoleTextAttribute
我是汇编程序的新手。 我需要使用Masm32循环更改文本颜色(5种时间-5种不同的颜色)。 我的代码:
Main PROC
LOCAL hStdout:DWORD
call SetConsoleTitleA
push -11
call GetStdHandle
mov hStdout,EAX
mov BX,5
lp:
push hStdout
push 2
call SetConsoleTextAttribute
push 0
push 0
push 24d
push offset sWriteText
push hStdout
call WriteConsoleA
dec BX
jnz lp
push 2000d
call Sleep
push 0
call ExitProcess
Main ENDP
end Main
PS对不起,我的英文。
正如Raymond Chen所暗示的那样,对SetConsoleTitle
的调用是不正确的。
Main PROC
LOCAL hStdout:DWORD
call SetConsoleTitleA
注意,您不会将任何参数压入SetConsoleTitle
的堆栈。 这意味着在此调用之后,堆栈已损坏。
解决此问题后,我们可以继续进行问题2。
根据__stdcall
调用约定,参数从右向左推送。 但是在代码中,参数是从左向右推。 在上面的代码中,这是SetConsoleTextAttribute
的调用序列
push hStdout
push 2
call SetConsoleTextAttribute
给定函数的签名:
BOOL WINAPI SetConsoleTextAttribute(
_In_ HANDLE hConsoleOutput,
_In_ WORD wAttributes
);
代码正在像下面的C代码一样调用此函数,
SetConsoleTextAttribute(2, hStdout);
这是相反的。 该电话应为:
push 2
push hStdout
call SetConsoleTextAttribute
该代码将忽略除GetStdHandle
之外的所有返回值。 对于SetConsoleTextAttribute
,如果函数成功,则返回值为非零。 如果函数返回零,则函数调用失败,并且对于此函数 1,可以通过调用GetLastError
获得扩展的错误信息。 MSDN上的文档包含有关其他每个功能以及它们如何指示错误的信息。
1并非所有函数都在失败时调用SetLastError
。 否则会导致很多问题。 还要注意的是,确实会设置错误的函数只有在出现错误时才这样做。
同样值得一读的是The Old New Thing上的Calling Conventions History系列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.