This program is designated for demonstration and testing of the base functions from 64bit Windows Application Binary Interface macrolibrary winabi.htm : WinABI, GetArgCount, GetArg, StdInput, StdOutput, TerminateProgram.
EUROASM CPU=X64,AMD=Yes,SIMD=Yes
twinabi PROGRAM Format=PE,Width=64,Entry=Main:
INCLUDE winabi.htm, cpuext%^WIDTH.htm
Main: PROC
GetArgCount ; Count the command-line arguments.
JC .Abort:
MOV [ArgCount],RCX
MOV EAX,ECX
StoD ArgCount$ ; Convert binary number RAX to a decimal string.
StdOutput =B"%^PROGRAM launched with ",ArgCount$,=B" arguments:",Eol=Yes
SUB EBX,EBX ; EBX will be the ordinal number of each argument.
.EchoArg:CMP RBX,[ArgCount]
JA .EchoInp: ; Jump when all arguments have been echoed.
MOV RAX,RBX
StoD ArgNr$ ; Convert binary number EAX to a decimal string.
SUB EAX,EAX
STOSB ; Zero-terminate the string.
GetArg RBX ; Retrieve RBX-th argument to RSI,RCX.
JC .Abort:
MOV EAX,ECX ; Argument size in bytes.
StoD ArgSize$ ; Convert binary number EAX to a decimal string.
SUB EAX,EAX
STOSB ; Zero-terminate the string.
StdOutput ArgNr$, =B".[", ArgSize$, =B"]: "
StdOutput RSI,Size=RCX,Eol=Yes ; Echo the argument.
INC EBX
JMP .EchoArg:
.EchoInp: ; Four combination of ANSI/WIDE and File/Console access method:
unicode %FOR No,Yes
console %FOR No,Yes
StdOutput =B"Input/Output mode: Unicode=%unicode, Console=%console", \
Eol=Yes,Console=No,Unicode=No
StdOutput =B"Enter some text: ",Console=No,Unicode=No
StdInput Buffer, Console=%console,Unicode=%unicode
JC .Abort:
MOV EAX,ECX ; Text size including CR+LF.
StoD BufSize$ ; Convert binary number EAX to a decimal string.
SUB EAX,EAX
STOSB ; Zero-terminate the string.
StdOutput =B"Entered[",BufSize$,=B"]: ",Console=No,Unicode=No
StdOutput Buffer,Size=RCX,Eol=Yes,Console=%console,Unicode=%unicode
JC .Abort:
%ENDFOR console
%ENDFOR unicode
StdOutput =B"%^PROGRAM terminated.",Console=No,Unicode=No
TerminateProgram Errorlevel=0
.Abort: StdOutput =B"Aborted, some macro returned CF.",Eol=Yes,Console=No,Unicode=No
TerminateProgram Errorlevel=4
ENDP Main:
ArgCount DQ Q
ArgCount$ DB 6*B
ArgNr$ DB 6*B
ArgSize$ DB 6*B
BufSize$ DB 6*B
Buffer DB 128*B
ENDPROGRAM twinabi