2012-05-19 4 views
0

В ответ на мой вопрос о Windows API, я успешно получил его на работу. Мой вопрос относительно этого кода:x86 assembly - GetStdHandle & WriteConsole

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. Почему один нужно сделать:

а)

push STD_OUTPUT_HANDLE 
    call GetStdHandle 
    push NULL 

И:

б)

push offset other 
    push mlen 
    push offset msg 
    push eax 

Я просто интересно, что нужно для получения StdHandle и толкая коррекций ,

Спасибо заранее,

Progrmr

ответ

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 
+0

Спасибо. Из интереса, где вы изучали сборку (я просто хочу знать хорошее место, чтобы учиться)? – Progrmr

+0

Самонастраивающийся Z80 без ассемблера, набрав шестнадцатеричные коды вручную. Не совсем актуально для обучения в эти дни. Также не написано код Windows в ассемблере. –

+0

Хорошо, спасибо за ввод. – Progrmr