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