在 MASM x86 中使用文本宏 @date 或 @time

using text macros @date or @time in MASM x86

这里的学生:

我想要一种方法来创建一个字符串,其中包含构建的当前 date/time,我可以将其输出到控制台。我有一个 consolOut 逐字符输出字符串(字符串以空结尾),但我不知道如何实际使用我书中列为“符号”的 @date @time 宏并在期间输出字符串集合时间。

如果我将它们放在引号中,它会输出“@date”而不会发生任何变化。如果我不把它放在引号中,它就不会构建。

我是否以某种方式在运行时调用它们,然后使用 mov 将它们存储在 .data 中?我什至如何与他们互动,他们看起来比我的 eax 大?

(这对我的家庭作业来说不是必需的 - 我只是喜欢 headers。)

NULL EQU 0  ;constants(ascii): null == 0
LF EQU 0Ah  ;linefeed == LF
CR EQU 0Dh  ;carrage return == CR


printHEADER PROC
    .data
        header  byte    '<myname> CS 340 ASSEMBLY '
                byte    @date, ' '
                byte    @time
                byte    LF, CR, NULL
    .code
        lea esi, header
        call consolOut             ;arguments: esi as string ending in 0
        ret
printHEADER endP

MASM 本身或 MASM32 的某个库中可能已经存在用于处理此问题的东西。但是我找不到,所以我自己整理了一个简单的解决方案:

include \masm32\include\masm32rt.inc

NULL EQU 0  ;constants(ascii): null == 0
LF EQU 0Ah  ;linefeed == LF
CR EQU 0Dh  ;carrage return == CR

; Stringifies a text macro.
; Expands into a quoted expansion of arg.
stringify MACRO arg
    LOCAL foo
    foo CATSTR <'>,arg,<'>
    EXITM foo
ENDM


.data
header  byte '<myname> CS 340 ASSEMBLY '
        byte stringify(@Date), ' '
        byte stringify(@Time)
        byte CR, LF, NULL

.code
start:
    printf("%s", OFFSET header)
    invoke ExitProcess,0
end start