Hello:
I am trying to make InsertTime into a MACRO called IT.
Error Messages:
swissM.asm(123) : warning A4006: too many arguments in macro call
IT(1): Macro Called From
swissM.asm(123): Main Line Code
swissM.asm(123) : error A2008: syntax error : ,
IT(5): Macro Called From
swissM.asm(123): Main Line Code
swissM.asm(123) : error A2042: statement too complex
IT(5): Macro Called From
swissM.asm(123): Main Line Code
_
Assembly Error
Press any key to continue . . .
The source code SWISSM.ASM
; SWISSM.ASM 11:46 AM 6/23/2008
; Modified Monday, July 20, 2015 3:40:28 AM
; SUBSYSTEM:CONSOLE
; Program displays the Time in Switzerland.
;
include \masm32\include\masm32rt.inc
;
; Remove Zero At End of Buffer MACRO. X is End or Exit
;
remzeroXbuf MACRO BufName:REQ
lea esi, offset BufName
add esi, eax
mov byte ptr [ esi - 1 ], " "
ENDM
IT MACRO stmX;REQ, lcidX:REQ
push esi
mov esi, offset stmX
call zeroHour
pop esi
INVOKE GetTimeFormat, lcidX, TIME_FORCE24HOURFORMAT, addr stmX, addr tf, esi, 32
ret
ENDM
.data
public stm, stmC
stm SYSTEMTIME<>
;typedef struct _SYSTEMTIME { // st
; WORD wYear; +00
; WORD wMonth; +02
; WORD wDayOfWeek; + 04
; WORD wDay; +06
; WORD wHour; +08
; WORD wMinute; + 10
; WORD wSecond; +12
; WORD wMilliseconds; +14
;} SYSTEMTIME;
stmC SYSTEMTIME<>; CANADA
lcidCAN dd 4105
lcidPQ dd 3084 ; Quebec
lcidUK dd 2057 ; UK
lcidSF dd 4108 ; Swiss French
lcidSG dd 2055 ; Swiss German
lcidSI dd 2064 ; Swiss italian
lcidSR dd 2073 ; Swiss Romanish(DNW) Does Not Work!
lcidFRA dd 1036 ; France
lcidGER dd 1031 ; Germany
lcidITA dd 1040 ; Italy
lcidSPA dd 1034 ; Spain
dd 0
public dtbufE, dtbufF, dtbufG, dtbufI, dtbufR
db 0
dtbufCb db " "; Space
dtbufC db 260 dup(0); Canada(4105)
dw 0
db 0
dtbufQb db " "
dtbufQ db 260 dup(0); CANADA (Quebec) 3084
db 0
dtbufEb db " "; Space
dtbufE db 260 dup(0); England UTC(2057)
dw 0
dtbufF db 260 dup(0); Swiss French(4108)
dw 0
db 0
dtbufGb db " "; Space
dtbufG db 260 dup(0); Swiss German(2055)
dw 0
dtbufI db 260 dup(0); Swiss italian(2064)
dw 0
dtbufR db 260 dup(0); Swiss Romanish(2072)
dw 0
db 0
dtbufSb db " "
dtbufS db 260 dup(9); Spain Spanish(3082)
dw 0
AppName db "Date & Time in Switzerland ", 0
AppNameC db "Date & Time in Ottawa, Ontario, CANADA ", 0
AppNameE db "Date & Time in London, England ", 0
AppNameF db "Date & Time in Geneva - French Suisse ",0
AppNameG db "Date & Time in Zurich - German Schweiz ",0
AppNameI db "Date & Time in Switzerland - Italian Svizzera ", 0
AppNameQ db "Date & Time in Montreal, PQ, CANADA ", 0
AppNameR db "Date & Time in Switzerland - Romanish ", 0
AppNameS db "Date & Time in Madrid, Spain - Spanish ", 0
crlf db 13, 10, 0
tf db "HH':'mm':'ss tt", 0
dtError db " << waitExit >> ", 13, 10, 7, 0
Putc db " UTC ", 13, 10, 0
Pbst db " BST ", 13, 10, 0
Pedt db " EDT ", 13, 10, 0
Pcest db " CEST ", 13, 10, 0
db 0
.code
align 8
SetTextColor proc fore:DWORD,back:DWORD
LOCAL hStdOut:DWORD
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hStdOut,eax
mov eax,back
shl eax,4
or eax,fore
invoke SetConsoleTextAttribute,hStdOut,eax
ret
SetTextColor endp
align 8
zeroHour proc uses eax
; ESI > stm if midnight hour change 0 to 12
mov ax, word ptr [esi+08]; get Hour
and ax, ax
jnz @F
mov ax,12
mov [esi+8], ax
@@:
ret
zeroHour endp
insertTime proc
IT,stm,lcidUK
insertTime endp
align 8
insertTimeC proc
push esi
mov esi, offset stmC
call zeroHour
pop esi
INVOKE GetTimeFormat, lcidCAN, TIME_FORCE24HOURFORMAT, addr stmC, addr tf, esi, 32
ret
insertTimeC endp
align 8
insertTimeQ proc
push esi
mov esi, offset stmC
call zeroHour
pop esi
INVOKE GetTimeFormat, lcidUK, TIME_FORCE24HOURFORMAT, addr stmC, addr tf, esi, 32
ret
insertTimeQ endp
align 8
; DI >s to Buffer Output
; SI >s to Source Input
; Make sure Direction Flag is UP!
CopyUntilNull proc
lodsb
stosb
and al, al
jnz CopyUntilNull
ret
CopyUntilNull endp
align 8
start proc
invoke SetTextColor, 15, 0
invoke GetLocalTime, addr stmC
invoke GetDateFormat, lcidCAN, DATE_LONGDATE, addr stmC, 0, addr dtbufC, sizeof dtbufC
and eax, eax
jz ErGDFCanada
remzeroXbuf dtbufC
call insertTimeC
mov esi, offset dtbufC
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pedt
call CopyUntilNull
invoke GetDateFormat, lcidPQ, DATE_LONGDATE, addr stmC, 0, addr dtbufQ, sizeof dtbufQ
and eax, eax
jz ErGDFQuebec
remzeroXbuf dtbufQ
call insertTimeQ
mov esi, offset dtbufQ
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pedt
call CopyUntilNull
invoke GetSystemTime, addr stm; Get UTC
; Kludge to get BST
mov ax, stm.wHour
cmp ax, 23
jnz @F
xor ax, ax
jmp saveAX
@@:
inc ax
public saveAX
saveAX::
mov stm.wHour, ax
invoke GetDateFormat, lcidUK , DATE_LONGDATE, addr stm, 0, addr dtbufE, sizeof dtbufE
and eax, eax
jz ErGDFEnglish
remzeroXbuf dtbufE
call insertTime
mov esi, offset dtbufE
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pbst
call CopyUntilNull
mov ax, stm.wHour; This is a Kludge to get Swiss Time
; or European Time i e France, Germany, Italy
inc ax; GET UTC +1 i e CET
mov stm.wHour, ax
invoke GetDateFormat, lcidSF , DATE_LONGDATE, addr stm, 0, addr dtbufF, sizeof dtbufF; was lcidSF
and eax, eax
jz ErGDFFrench
remzeroXbuf dtbufF
call insertTime
mov esi, offset dtbufF
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
invoke GetDateFormat, lcidGER , DATE_LONGDATE, addr stm, 0, addr dtbufG, 260; was lcidSG
and eax, eax
jz ErGDFGerman
remzeroXbuf dtbufG
call insertTime
mov esi, offset dtbufG
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
invoke StdOut, addr dtbufGb
invoke GetDateFormat, lcidITA, DATE_LONGDATE, addr stm, 0, addr dtbufI, 260; was lcidSI
and eax, eax
jz ErGDFItalian
remzeroXbuf dtbufI
call insertTime
invoke GetDateFormat, lcidSPA , DATE_LONGDATE, addr stm, 0, addr dtbufS, 260
and eax, eax
jz ErGDFSpain
public SpainTime
SpainTime::
remzeroXbuf dtbufS
call insertTime
mov esi, offset dtbufS
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
jmp NoError
ErGDFCanada:
invoke StdOut, addr crlf
print " << GetDateFormat Canada >> ", 13, 10, 7
jmp waitExit
ErGDFQuebec:
invoke StdOut, addr crlf
print " << GetDateFormat Quebec >> ", 13, 10, 7
jmp waitExit
ErGDFEnglish:
invoke StdOut, addr crlf
print " << GetDateFormat English >> ", 13, 10, 7
jmp waitExit
ErGDFFrench:
invoke StdOut, addr crlf
print " << GetDateFormat French >> ", 13, 10, 7
jmp waitExit
ErGDFGerman:
invoke StdOut, addr crlf
print 13,10," << GetDateFormat German >> ", 13, 10, 7
jmp waitExit
ErGDFItalian:
invoke StdOut, addr crlf
print 13,10," << GetDateFormat Italian >> ", 13, 10, 7
jmp waitExit
ErGDFRomanish:
invoke StdOut, addr crlf
print " << GetDateFormat Romanish >> ", 13, 10, 7
jmp waitExit
ErGDFSpain:
invoke StdOut, addr crlf
print " << GetDateFormat Spain >> ", 13, 10, 7
waitExit:
INVOKE MessageBox, 0, addr dtError, addr AppName, MB_OK
NoError:
invoke MessageBox, 0, addr dtbufC, addr AppNameC, MB_OK; CANADA Time GMT-4
invoke MessageBox, 0, addr dtbufQ, addr AppNameQ, MB_OK; Quebec Time GMT-4
invoke MessageBox, 0, addr dtbufE, addr AppNameE, MB_OK; England Time GMT+0
invoke MessageBox, 0, addr dtbufF, addr AppNameF, MB_OK; Swiss Time - French GMT+1
invoke MessageBox, 0, addr dtbufG, addr AppNameG, MB_OK; Swiss Time - German GMT+1
invoke MessageBox, 0, addr dtbufI, addr AppNameI, MB_OK; Swiss Time - Itailan GMT+1
invoke MessageBox, 0, addr dtbufS, addr AppNameS, MB_OK; Spanish Time - Spanish GMT+1
invoke StdOut, addr crlf
invoke StdOut, addr dtbufEb; England or United Kingdom
invoke StdOut, addr Putc
invoke StdOut, addr crlf
invoke StdOut, addr dtbufCb; CANADA - Eastern
invoke StdOut, addr crlf
invoke StdOut, addr dtbufQb; CANADA, PQ - Eastern(French)
invoke StdOut, addr crlf
invoke StdOut, addr dtbufGb; Swiss - German
invoke StdOut, addr crlf
invoke StdOut, addr dtbufSb; Spain - Spanish
invoke StdOut, addr crlf
inkey " << Wait For Space Bar or Any Key >> ", 13, 10
invoke StdOut, addr crlf
exit
ret
start endp
align 8
end_here:
END start
; You Can Find this file at D:\masm32\bin\SWISSM.ASM
I am doing something wrong but I don't what
it is!
Regards herge
Hi Herge,
1. macro usage:
use IT stm, lcidUK
instead of IT, stm, lcidUK
2. pull out your strongest glasses and turn the comment in your macro into a valid colon ;-)
Hi JJ2007:
Thank you I often can't see the trees in the forest.
Often those Windows with the real small fonts for the
Filenames or Whatever input Box I copy it over to
qeditor so I can read it! But it's usually Dots and
Commas and obviously Colons and semi Colons.
Regards herge
Revised SWISSM.ASM
; SWISSM.ASM 11:46 AM 6/23/2008
; Modified Monday, July 20, 2015 3:40:28 AM
; SUBSYSTEM:CONSOLE
; Program displays the Time in Switzerland.
;
include \masm32\include\masm32rt.inc
;
; Remove Zero At End of Buffer MACRO. X is End or Exit
;
remzeroXbuf MACRO BufName:REQ
lea esi, offset BufName
add esi, eax
mov byte ptr [ esi - 1 ], " "
ENDM
IT MACRO stmX:REQ,lcidX:REQ
push esi
mov esi, offset stmX
call zeroHour
pop esi
INVOKE GetTimeFormat, lcidX, TIME_FORCE24HOURFORMAT, addr stmX, addr tf, esi, 32
ret
ENDM
.data
public stm, stmC
stm SYSTEMTIME<>
;typedef struct _SYSTEMTIME { // st
; WORD wYear; +00
; WORD wMonth; +02
; WORD wDayOfWeek; + 04
; WORD wDay; +06
; WORD wHour; +08
; WORD wMinute; + 10
; WORD wSecond; +12
; WORD wMilliseconds; +14
;} SYSTEMTIME;
stmC SYSTEMTIME<>; CANADA
lcidCAN dd 4105
lcidPQ dd 3084 ; Quebec
lcidUK dd 2057 ; UK
lcidSF dd 4108 ; Swiss French
lcidSG dd 2055 ; Swiss German
lcidSI dd 2064 ; Swiss italian
lcidSR dd 2073 ; Swiss Romanish(DNW) Does Not Work!
lcidFRA dd 1036 ; France
lcidGER dd 1031 ; Germany
lcidITA dd 1040 ; Italy
lcidSPA dd 1034 ; Spain
dd 0
public dtbufE, dtbufF, dtbufG, dtbufI, dtbufR
db 0
dtbufCb db " "; Space
dtbufC db 260 dup(0); Canada(4105)
dw 0
db 0
dtbufQb db " "
dtbufQ db 260 dup(0); CANADA (Quebec) 3084
db 0
dtbufEb db " "; Space
dtbufE db 260 dup(0); England UTC(2057)
dw 0
dtbufF db 260 dup(0); Swiss French(4108)
dw 0
db 0
dtbufGb db " "; Space
dtbufG db 260 dup(0); Swiss German(2055)
dw 0
dtbufI db 260 dup(0); Swiss italian(2064)
dw 0
dtbufR db 260 dup(0); Swiss Romanish(2072)
dw 0
db 0
dtbufSb db " "
dtbufS db 260 dup(9); Spain Spanish(3082)
dw 0
AppName db "Date & Time in Switzerland ", 0
AppNameC db "Date & Time in Ottawa, Ontario, CANADA ", 0
AppNameE db "Date & Time in London, England ", 0
AppNameF db "Date & Time in Geneva - French Suisse ",0
AppNameG db "Date & Time in Zurich - German Schweiz ",0
AppNameI db "Date & Time in Switzerland - Italian Svizzera ", 0
AppNameQ db "Date & Time in Montreal, PQ, CANADA ", 0
AppNameR db "Date & Time in Switzerland - Romanish ", 0
AppNameS db "Date & Time in Madrid, Spain - Spanish ", 0
crlf db 13, 10, 0
tf db "HH':'mm':'ss tt", 0
dtError db " << waitExit >> ", 13, 10, 7, 0
Putc db " UTC ", 13, 10, 0
Pbst db " BST ", 13, 10, 0
Pedt db " EDT ", 13, 10, 0
Pcest db " CEST ", 13, 10, 0
db 0
.code
align 8
SetTextColor proc fore:DWORD,back:DWORD
LOCAL hStdOut:DWORD
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hStdOut,eax
mov eax,back
shl eax,4
or eax,fore
invoke SetConsoleTextAttribute,hStdOut,eax
ret
SetTextColor endp
align 8
zeroHour proc uses eax
; ESI > stm if midnight hour change 0 to 12
mov ax, word ptr [esi+08]; get Hour
and ax, ax
jnz @F
mov ax,12
mov [esi+8], ax
@@:
ret
zeroHour endp
insertTime proc
IT stm,lcidUK
insertTime endp
align 8
insertTimeC proc
IT stmC,lcidUK
insertTimeC endp
align 8
insertTimeQ proc
IT stmC,lcidUK
insertTimeQ endp
align 8
; DI >s to Buffer Output
; SI >s to Source Input
; Make sure Direction Flag is UP!
CopyUntilNull proc
lodsb
stosb
and al, al
jnz CopyUntilNull
ret
CopyUntilNull endp
align 8
start proc
invoke SetTextColor, 15, 0
invoke GetLocalTime, addr stmC
invoke GetDateFormat, lcidCAN, DATE_LONGDATE, addr stmC, 0, addr dtbufC, sizeof dtbufC
and eax, eax
jz ErGDFCanada
remzeroXbuf dtbufC
call insertTimeC
mov esi, offset dtbufC
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pedt
call CopyUntilNull
invoke GetDateFormat, lcidPQ, DATE_LONGDATE, addr stmC, 0, addr dtbufQ, sizeof dtbufQ
and eax, eax
jz ErGDFQuebec
remzeroXbuf dtbufQ
call insertTimeQ
mov esi, offset dtbufQ
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pedt
call CopyUntilNull
invoke GetSystemTime, addr stm; Get UTC
; Kludge to get BST
mov ax, stm.wHour
cmp ax, 23
jnz @F
xor ax, ax
jmp saveAX
@@:
inc ax
public saveAX
saveAX::
mov stm.wHour, ax
invoke GetDateFormat, lcidUK , DATE_LONGDATE, addr stm, 0, addr dtbufE, sizeof dtbufE
and eax, eax
jz ErGDFEnglish
remzeroXbuf dtbufE
call insertTime
mov esi, offset dtbufE
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pbst
call CopyUntilNull
mov ax, stm.wHour; This is a Kludge to get Swiss Time
; or European Time i e France, Germany, Italy
inc ax; GET UTC +1 i e CET
mov stm.wHour, ax
invoke GetDateFormat, lcidSF , DATE_LONGDATE, addr stm, 0, addr dtbufF, sizeof dtbufF; was lcidSF
and eax, eax
jz ErGDFFrench
remzeroXbuf dtbufF
call insertTime
mov esi, offset dtbufF
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
invoke GetDateFormat, lcidGER , DATE_LONGDATE, addr stm, 0, addr dtbufG, 260; was lcidSG
and eax, eax
jz ErGDFGerman
remzeroXbuf dtbufG
call insertTime
mov esi, offset dtbufG
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
invoke StdOut, addr dtbufGb
invoke GetDateFormat, lcidITA, DATE_LONGDATE, addr stm, 0, addr dtbufI, 260; was lcidSI
and eax, eax
jz ErGDFItalian
remzeroXbuf dtbufI
call insertTime
invoke GetDateFormat, lcidSPA , DATE_LONGDATE, addr stm, 0, addr dtbufS, 260
and eax, eax
jz ErGDFSpain
public SpainTime
SpainTime::
remzeroXbuf dtbufS
call insertTime
mov esi, offset dtbufS
@@:
lodsb
and al, al
jnz @B
dec esi
mov edi, esi
mov esi, offset Pcest
call CopyUntilNull
jmp NoError
ErGDFCanada:
invoke StdOut, addr crlf
print " << GetDateFormat Canada >> ", 13, 10, 7
jmp waitExit
ErGDFQuebec:
invoke StdOut, addr crlf
print " << GetDateFormat Quebec >> ", 13, 10, 7
jmp waitExit
ErGDFEnglish:
invoke StdOut, addr crlf
print " << GetDateFormat English >> ", 13, 10, 7
jmp waitExit
ErGDFFrench:
invoke StdOut, addr crlf
print " << GetDateFormat French >> ", 13, 10, 7
jmp waitExit
ErGDFGerman:
invoke StdOut, addr crlf
print 13,10," << GetDateFormat German >> ", 13, 10, 7
jmp waitExit
ErGDFItalian:
invoke StdOut, addr crlf
print 13,10," << GetDateFormat Italian >> ", 13, 10, 7
jmp waitExit
ErGDFRomanish:
invoke StdOut, addr crlf
print " << GetDateFormat Romanish >> ", 13, 10, 7
jmp waitExit
ErGDFSpain:
invoke StdOut, addr crlf
print " << GetDateFormat Spain >> ", 13, 10, 7
waitExit:
INVOKE MessageBox, 0, addr dtError, addr AppName, MB_OK
NoError:
invoke MessageBox, 0, addr dtbufC, addr AppNameC, MB_OK; CANADA Time GMT-4
invoke MessageBox, 0, addr dtbufQ, addr AppNameQ, MB_OK; Quebec Time GMT-4
invoke MessageBox, 0, addr dtbufE, addr AppNameE, MB_OK; England Time GMT+0
invoke MessageBox, 0, addr dtbufF, addr AppNameF, MB_OK; Swiss Time - French GMT+1
invoke MessageBox, 0, addr dtbufG, addr AppNameG, MB_OK; Swiss Time - German GMT+1
invoke MessageBox, 0, addr dtbufI, addr AppNameI, MB_OK; Swiss Time - Itailan GMT+1
invoke MessageBox, 0, addr dtbufS, addr AppNameS, MB_OK; Spanish Time - Spanish GMT+1
invoke StdOut, addr crlf
invoke StdOut, addr dtbufEb; England or United Kingdom
invoke StdOut, addr Putc
invoke StdOut, addr crlf
invoke StdOut, addr dtbufCb; CANADA - Eastern
invoke StdOut, addr crlf
invoke StdOut, addr dtbufQb; CANADA, PQ - Eastern(French)
invoke StdOut, addr crlf
invoke StdOut, addr dtbufGb; Swiss - German
invoke StdOut, addr crlf
invoke StdOut, addr dtbufSb; Spain - Spanish
invoke StdOut, addr crlf
inkey " << Wait For Space Bar or Any Key >> ", 13, 10
invoke StdOut, addr crlf
exit
ret
start endp
align 8
end_here:
END start
; You Can Find this file at D:\masm32\bin\SWISSM.ASM
I just realised you don't need Lcids for time and if you
want AM or PM use LcidUK or 2057.
You do need Lcids for The dates thou.
Thanks again JJ2007.
Regards herge
Quote from: herge on July 20, 2015, 09:38:02 PMThanks again JJ2007
My pleasure :icon14:
It took me a while to spot the
; 8)