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