如何在汇编时连接字符串(使用 CATSTR?)

How to concatenate strings at assembly time (using CATSTR?)

我有一个项目的多个构建配置,它们每个都需要有一些全局定义的字符串。这些字符串实际上应该在汇编时通过连接根和特定于配置的后缀来构建,例如,我可能有根 "TABLE" 而配置 A 将使用后缀 "ALPHA" 和配置 "B" 将使用后缀 "BETA",因此当我构建 A 时,我最终得到全局定义的字符串,其值为 "TABLEALPHA",对于 B,值为 "TABLEBETA"

理想情况下,后缀是通过命令行通过 /D 类型定义提供的。

一个复杂的问题是我们使用一种专有的源语言,首先 "compiles" 到 MASM,然后使用 MASM 到 assemble。这使得我很难为我的尝试提供好的示例代码。

如果有人能提供一段 MASM 源代码,显示根文字字符串的定义、字符串文字后缀,以及如何使用 CATSTR(或@CatStr???)定义一个新的全局符号,其中包含连接两个字符串,我希望(祈祷!)能够从那里开始。

这是一个完整的工作示例,它将字符串常量 "TABLE" 与名为 SUFFIXB 的 compile-time 定义的字符串组合在一起,并在消息框中显示结果。

; ml /c /coff /DSUFFIXB=BETA test.asm
; link /SUBSYSTEM:WINDOWS test.obj

.586p
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

ROOT textequ <TABLE>
msg CATSTR <">, ROOT, SUFFIXB, <">

.data
dlgmsg db msg,0
dlgtitle db "Title",0

.code
start:
invoke MessageBoxA, NULL, ADDR dlgmsg, ADDR dlgtitle, MB_OK 
invoke ExitProcess, NULL 

end start

作为旁注,masm 的 /EP 选项在尝试弄清楚预处理器语法时会很有用,因为它允许您查看代码经过预处理器后的样子。