Как объединить строки во время сборки (используя CATSTR?) - PullRequest
3 голосов
/ 29 мая 2019

У меня есть несколько конфигураций сборки проекта, и каждая из них должна иметь несколько глобально определенных строк. Эти строки действительно должны быть собраны во время сборки путем объединения корня и суффикса, специфичного для конфигурации, например, у меня может быть корень «TABLE», а конфигурация A будет использовать суффикс «ALPHA», а конфигурация «B» будет использовать суффикс «БЕТА», поэтому, когда я строю А, я получаю глобально заданную строку со значением «TABLEALPHA», а для В значение «TABLEBETA»

В идеале суффикс предоставляется через командную строку, через определение типа / D.

Сложность заключается в том, что мы используем собственный исходный язык, который сначала «компилируется» в MASM, а затем использует MASM для сборки. Что затрудняет предоставление хорошего примера кода для того, что я пробовал.

Если кто-то может предоставить фрагмент источника MASM, показывающий определение строки литерала корня, суффикса строкового литерала и как использовать CATSTR (или @CatStr ???) для определения нового глобального символа, который содержит конкатенацию я надеюсь, что две струны (скрестив пальцы!) смогут взять его оттуда.

1 Ответ

1 голос
/ 31 мая 2019

Вот полный рабочий пример, который объединяет строковую константу "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 может быть полезна при попытке выяснить синтаксис препроцессора, поскольку она позволяет вам увидеть, как выглядит ваш код после того, как он прошел через препроцессор.

...