在 MASM x86

问题描述

这里的学生:

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

如果我把它们放在引号中,它会不加改变地输出“@date”。如果我不把它放在引号中,它就不会构建。

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

(这在我的作业中不是必需的 - 我只是喜欢漂亮的标题。)

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