簡體   English   中英

Masm32:SetConsoleTextAttribute

[英]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對不起,我的英文。

問題1

正如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

問題3

該代碼將忽略除GetStdHandle之外的所有返回值。 對於SetConsoleTextAttribute ,如果函數成功,則返回值為非零。 如果函數返回零,則函數調用失敗,並且對於此函數 1,可以通過調用GetLastError獲得擴展的錯誤信息。 MSDN上的文檔包含有關其他每個功能以及它們如何指示錯誤的信息。


1並非所有函數都在失敗時調用SetLastError 否則會導致很多問題。 還要注意的是,確實會設置錯誤的函數只有在出現錯誤時才這樣做。

同樣值得一讀的是The Old New Thing上的Calling Conventions History系列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM