2012-03-25 5 views
3

я хотел бы написать строку в консоли вывода с помощью WriteConsole API, но он не работает я ссылку и построить его с помощью консоли в MASMНаписание простой строки на консоль с помощью 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 

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

C: \ masm32> 18.exe

C: \ masm32>

пустой Ouput

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

ответ

1

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

+0

Спасибо Нейл за разъяснения :) –

0

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

.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 возвращает его. Для нетривиальной программы сохранение ее в памяти обычно является правильным решением.

+0

Спасибо вам, ребята сейчас работает –

+0

Разве линкер не устанавливает для вас по умолчанию 1 МБ стек, размер которого можно переопределить с помощью 'link/stack'? – Neil

+0

@Neil: Может быть - небрежно, я не уверен. Я просто просканировал его код и сравнил с чем-то подобным (но работающим), который я написал много лет назад, когда Win32 был новым, и это было первое очевидное различие, которое я видел, но да, это может быть ненужным в моем коде. –