Masm32:SetConsoleTextAttribute

时间:2015-09-27 17:19:32

标签: winapi masm32

我是汇编程序的新手。我需要使用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。对不起我的英语。

1 个答案:

答案 0 :(得分:3)

问题1

正如Raymond Chen所暗示,对SetConsoleTitle的调用不正确。

Main PROC
    LOCAL hStdout:DWORD
    call SetConsoleTitleA

请注意,您不会将任何参数推送到SetConsoleTitle的堆栈中。这意味着在此调用之后堆栈已损坏。

一旦修复,我们就可以继续讨论问题2.

问题#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,如果函数成功,则返回值为非零值。如果函数返回零,则函数调用失败,并且通过调用GetLastError可以获得此函数的 1 扩展错误信息。 MSDN上的文档包含有关每个其他功能的信息以及它们如何指示错误。

1 并非所有函数在失败时调用SetLastError。否则会引起很多问题。另外值得注意的是,设置错误的函数只有在出错时才会这样做。

另外值得一读的是The Old New Thing的The History Of Calling Conventions系列。