我是汇编程序的新手。我需要使用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
P.S。对不起我的英语。
答案 0 :(得分:3)
正如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
,如果函数成功,则返回值为非零值。如果函数返回零,则函数调用失败,并且通过调用GetLastError
可以获得此函数的 1 扩展错误信息。 MSDN上的文档包含有关每个其他功能的信息以及它们如何指示错误。
1 并非所有函数在失败时调用SetLastError
。否则会引起很多问题。另外值得注意的是,设置错误的函数只有在出错时才会这样做。
另外值得一读的是The Old New Thing的The History Of Calling Conventions系列。