И снова "hello world" - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Читаю Крупника на досуге самоучитель "Ассемблер". Есть вопрос (ща наверное ржать будите ). Почему вот эта программа выводит сообщение на экран?
.386
.model flat, stdcall
option casemap: none
 
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
 
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
 
.data
msg_title db "Title", 0
msg_message db "Hello world", 0
 
.code
start:
invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK
invoke ExitProcess, 0
end start
а вот эта нет?
.386
 
.model flat, stdcall
option casemap : none
 
ExitProcess proto: DWORD
GetStdHandle proto : DWORD
WriteConsoleA proto : DWORD, : DWORD, : DWORD, : DWORD, : DWORD
includelib\masm32\lib\kernel32.lib
 
.data
stdout DWORD ?
msg BYTE "la la  la",0dh, 0ah
cWritten DWORD ?
 
.code
invoke GetStdHandle, -11
mov stdout, eax
invoke WriteConsoleA, stdout, ADDR msg, sizeof msg, ADDR cWritten, 0
invoke ExitProcess, 0
end start
комп думает некоторое время и все. В отладчике в eax не появляется дискриптор, (в книге написано что должен) там стоят одни ноли. Что делаю не так?

Решение задачи: «И снова "hello world"»

textual
Листинг программы
org 100h
jmp  start
 
mass  db  107,111,108,111,98,111,107,56,55,52,0
 
start:
   push  47104
   mov   di,11111000110b
   mov   ax,3
   int   16
;=================[ #1 ]========
   mov   ecx,4
   mov   eax,6f6c6548h
@print:
   int   29h
   ror   eax,8
   loop  @print
   mov   ax,0a0dh
   int   41
   shr   ax,8
   int   29h
;=================[ #2 ]========
   call  @f
   db    'Fucking stack!$'
@@:
   pop   dx
   mov   ah,9
   int   33
;=================[ #3 ]========
   pop   es
   mov   si,mass
   mov   ah,12
@@:
   lodsb
   or    al,al
   je    @exit
   stosw
   jmp   @b
 
@exit:
   xor   ax, ax
   int   16h
   int   20h

Оцени полезность:

8   голосов , оценка 3.875 из 5