如何在组装时连接字符串(使用CATSTR?)

时间:2019-05-29 18:58:11

标签: assembly x86 masm

我有一个项目的多个构建配置,每个配置都需要有一些全局定义的字符串。这些字符串实际上应该在组装时通过将根目录和特定于配置的后缀串联而构建,例如,我可能具有根目录“ TABLE”,而配置A将使用后缀“ ALPHA”,而配置“ B”将使用后缀“ BETA”,因此当我构建A时,最终得到的是全局定义的字符串,其值是“ TABLEALPHA”,而对于B,则是值“ TABLEBETA”

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

一个复杂的问题是,我们使用专有的源语言,该语言首先“编译”为MASM,然后使用MASM进行汇编。这使得很难为我的尝试提供好的示例代码。

如果有人可以提供MASM源代码段,其中显示了根文字字符串的定义,字符串文字后缀以及如何使用CATSTR(或@CatStr ???)来定义包含以下内容的串联的新全局符号:我希望这两个弦(手指交叉!)能够从那里拿走它。

1 个答案:

答案 0 :(得分:1)

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

; 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选项在尝试弄清楚预处理器语法时很有用,因为它使您可以查看经过预处理器后的代码。