【问题标题】:Masm32: SetConsoleTextAttributeMasm32:SetConsoleTextAttribute
【发布时间】:2015-09-27 17:19:31
【问题描述】:

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

附:对不起我的英语。

【问题讨论】:

  • 你忘了写一个问题。假设您希望看到不同的颜色,但实际上并没有,我建议您阅读SetConsoleTextAttributes。将2 作为 wAttributes 参数传递并不会神奇地为每个调用设置不同的文本颜色。
  • 您确定他们将 2 作为wAttributes 传递吗?
  • 这个功能我不知道怎么用
  • 您可能希望从正确调用 SetConsoleTitle 开始。
  • 当您调用SetConsoleTitle 时,您还没有将任何参数压入堆栈。特别是lpConsoleTitle。另请参阅:__stdcallSetConsoleTitle

标签: winapi masm32


【解决方案1】:

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


1并非所有函数在失败时都会调用SetLastError。有很多问题是由其他想法引起的。另请注意,确实设置错误的函数仅在出现错误时才会这样做。

还值得一读的是旧新事物上的The History Of Calling Conventions 系列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多