x86程序集 - GetStdHandle& WriteConsole

时间:2012-05-19 10:40:54

标签: winapi assembly x86

在回答我关于Windows API的问题时,我已经成功地使用它。我的问题是关于这段代码:

push STD_OUTPUT_HANDLE
    call GetStdHandle
    push NULL
    push offset other
    push mlen
    push offset msg
    push eax
    call WriteConsole
push    0
call ExitProcess

此代码应打印msg的值。为什么需要这样做:

A)

push STD_OUTPUT_HANDLE
    call GetStdHandle
    push NULL

b)中

push offset other
    push mlen
    push offset msg
    push eax

我只是想知道获得StdHandle和推动抵消的需要是什么。

提前致谢,

Progrmr

1 个答案:

答案 0 :(得分:2)

查看definition of WriteConsole。 NULL是函数的最后一个参数,即lpReserved参数。参数按从右到左的顺序推送。第一个函数参数是控制台句柄,你从GetStdHandle得到的那个,你通过推送eax传递。

正确评论汇编代码:

push STD_OUTPUT_HANDLE          ; GetStdHandle nStdHandle argument
call GetStdHandle               ; eax = Console handle
push NULL                       ; lpReserved = null
push offset other               ; lpNumberOfCharsWritten = pointer to "other"
push mlen                       ; nNumberOfCharsToWrite = length of "msg"
push offset msg                 ; lpBuffer = pointer to "msg"
push eax                        ; hConsoleOutput = console handle from GetStdHandle
call WriteConsole               ; Write string
push    0                       ; exit code = 0
call ExitProcess                ; terminate program