У меня есть несколько конфигураций сборки проекта, и каждая из них должна иметь некоторые глобально определенные строки. Эти строки действительно должны быть построены во время сборки путем объединения корня и суффикса, специфичного для конфигурации, например, у меня может быть корень «TABLE», а конфигурация A будет использовать суффикс «ALPHA», а конфигурация «B» будет использовать суффикс «БЕТА», поэтому, когда я создаю A, я получаю свою глобально определенную строку со значением «TABLEALPHA», а для B — значение «TABLEBETA».
В идеале суффикс предоставляется через командную строку через определение типа /D.
Сложность заключается в том, что мы используем проприетарный исходный язык, который сначала «компилируется» в MASM, а затем использует MASM для сборки. Что затрудняет предоставление хорошего примера кода для того, что я пробовал.
Если бы кто-нибудь мог предоставить фрагмент исходного кода MASM, показывающий определение корневой литеральной строки, суффикс строкового литерала и как использовать CATSTR (или @CatStr???) для определения нового глобального символа, содержащего конкатенацию двух строк. , я надеюсь (скрестим пальцы!) чтобы иметь возможность взять его оттуда.
Вот полный рабочий пример, который объединяет строковую константу "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
может быть полезна при попытке выяснить синтаксис препроцессора, поскольку она позволяет вам увидеть, как выглядит ваш код после того, как он прошел через препроцессор.