[英]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.