;;Przykład 7.1. Aplikacja konsolowa korzystająca z otwartego okna konsoli (program w języku asemblera TASM32)
.586P
.MODEL flat, STDCALL
;--- stałe z pliku winbase.h -----------
STD_INPUT_HANDLE EQU  -10 ; wejście konsoli
STD_OUTPUT_HANDLE EQU -11 ; wyjście konsoli
;--- funkcje API Win32 -----------
EXTRN CharToOemA:NEAR
EXTRN GetStdHandle:NEAR
EXTRN WriteConsoleA:NEAR
EXTRN ReadConsoleA:NEAR
EXTRN ExitProcess:NEAR
;-------------
INCLUDELIB LIB\import32.lib
;-------------
_DATA SEGMENT
 hout DD ?
 hinp DD ?
 tekst DB "Aplikacja korzystająca z otwartego”
DB „ okna konsoli",0Dh,0Ah
  DB "Wprowadź tekst [koniec=Enter]:",0
 ALIGN 4 ;przesunięcie do adresu podzielnego na 4
rozm DD $ - tekst ;ilość znaków
 rout DD 0 ;faktyczna ilość wyprowadzonych znaków
 rinp DD 0 ;faktyczna ilość wprowadzonych znaków
 bufor DB 128 dup(?)
_DATA ENDS
;------------
_TEXT SEGMENT
start:
;--- konwersja polskich znaków w zaproszeniu----
 push OFFSET tekst
 push OFFSET tekst
 call CharToOemA
;--- wywołanie funkcji GetStdHandle 
 push STD_OUTPUT_HANDLE
 call GetStdHandle ; wywołanie funkcji GetStdHandle
 mov hout, EAX
 push STD_INPUT_HANDLE
 call GetStdHandle ; wywołanie funkcji GetStdHandle
 mov hinp, EAX
;--- wyświetlenie zaproszenia ---------
 push 0 ; rezerwa, musi być zero
 push OFFSET rout ;wskaźnik na faktyczną ilość wyprowadzonych znaków 
 mov EBX, rozm
 push EBX ;ilość znaków
 push OFFSET tekst ;wskaźnik na tekst
  push hout ;deskryptor buforu konsoli
 call WriteConsoleA ; wywołanie funkcji WriteConsoleA
;--- czekanie na wprowadzenie znaków, koniec = Enter ---
 push 0 ; rezerwa, musi być zero
 push OFFSET rinp ;wskaźnik na faktyczną ilość wprowadzonych znaków 
 mov EBX, 128 
 push EBX ;rozmiar bufora
 mov EBX,OFFSET bufor ;wskaźnik na bufor
 mov [EBX],0 ; wpisywanie 0 na początku buforu
 push EBX ;wskaźnik na bufor
  push hinp ;deskryptor buforu konsoli
 call ReadConsoleA ; wywołanie funkcji ReadConsoleA
;--- wyświetlenie wprowadzonego tekstu ---------
 push 0 ; rezerwa, musi być zero
 push OFFSET rout ;wskaźnik na faktyczną ilość 
    ; wyprowadzonych znaków 
 mov EBX, rinp
 push EBX ;ilość znaków
 push OFFSET bufor ;wskaźnik na tekst w buforze
  push hout ;deskryptor buforu konsoli
 call WriteConsoleA ; wywołanie funkcji WriteConsoleA
;--- zakończenie procesu ---------
 push 0
 call ExitProcess ; wywołanie funkcji ExitProcess
_TEXT ENDS
END start
