繁体   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