Запись простой строки в консоль с помощью masm (ассемблерный код) - PullRequest
3 голосов
/ 26 марта 2012

Я хотел бы написать строку в выводе консоли, используя writeconsole API, но это не работает я связываю и собираю его используя консоль в masm

вот код

.386
.MODEL Flat,STDCALL
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

STD_OUTPUT_HANDLE EQU -11

.DATA
Msg  db "Hello World",13,10,0
lmessage dd 13

.DATA?

consoleOutHandle dd ? 
bytesWritten dd ?

.code
start:
INVOKE GetStdHandle, STD_OUTPUT_HANDLE
mov [consoleOutHandle],eax

invoke WriteConsole, consoleOutHandle,offset Msg,offset lmessage,offset bytesWritten,0
INVOKE ExitProcess,0 
end start

когда я запускаю вывод exe я получил следующее

C: \ masm32> 18.exe

C: \ masm32>

пустой вывод

так что любой совет

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Третий параметр - это количество записываемых символов, а не адрес количества записываемых символов. К счастью для вас, адрес оказался больше 64 КБ, что вызвало сбой вызова с кодом ошибки ERROR_NOT_ENOUGH_MEMORY.

0 голосов
/ 26 марта 2012

Одна очевидная проблема заключается в том, что вы не определили стек:

.stack 8192

Это должно идти после директивы .MODEL, но в противном случае местоположение не имеет большого значения. Как можно меньше стекового пространства, вы можете сделать его всего 4096 байт, но в любом случае это не будет иметь большого значения.

Когда вы вызываете WriteFile, вы также хотите передать фактический размер данных для записи. Я обычно вычисляю это, что-то вроде:

message db "Hello World!", 13, 10
msg_size equ $ - offset message

; ...

invoke WriteFile,                   \
       eax,                         \
       offset message,              \
       msg_size,                    \
       offset written,              \
       0

Обратите внимание, что вместо сохранения стандартного дескриптора вывода в память, я просто передал его непосредственно из EAX, где GetStdHandle возвращает его. Однако для нетривиальной программы сохранение ее в памяти обычно является правильным решением.

...