;;Przykład 6.1. Aplikacja konsolowa korzystająca z otwartego okna (program w języku asemblera MASM)
;Aplikacja korzystająca z otwartego okna konsoli
.586P
.MODEL flat, STDCALL
;--- stale ---
STD_INPUT_HANDLE EQU  -10 ; wejście konsoli
STD_OUTPUT_HANDLE EQU -11 ; wyjście konsoli
;--- funkcje API Win32 ---
CharToOemA PROTO :DWORD,:DWORD
GetStdHandle PROTO :DWORD
ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
;-------------
includelib .\lib\user32.lib
includelib .\lib\kernel32.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	$ - naglow	;ilość znaków w tablicy
	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	; deskryptor wyjściowego bufora konsoli
	push	STD_INPUT_HANDLE
	call	GetStdHandle	; wywołanie funkcji GetStdHandle
	mov	hinp, EAX	; deskryptor wejściowego bufora konsoli
;--- wyświetlenie zaproszenia ---------
	push	0		; rezerwa, musi być zero
	push	OFFSET rout ; wskaźnik na faktyczną ilość wyprowa-dzonych znaków 
	push	rozm		; 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 przez Enter ---
	push	0 		; rezerwa, musi być zero
	push	OFFSET rinp 	; wskaźnik na faktyczną ilość wprowa-dzonych znaków 
	mov	EBX, 128	
	push	EBX	;rozmiar bufora
	mov	EBX,OFFSET bufor ;wskaźnik na bufor
	mov	BYTE PTR [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
