2016-08-14 4 views
0

Я пытаюсь перенести макрос из MASM6 в TASM5 (в режиме IDEAL), и я сталкиваюсь с ошибками. Сам макрос монтирует отлично, но когда я пытаюсь вызвать его, я получаю следующее сообщение об ошибке во время сборки:Включает ли TASM макрос в качестве операнда?

Error xxx.asm (##) Невозможно использовать имя макроса в выражении: M_SWAP16

Макрос принимает числовое значение из текстового макроса и выполняет байтовую свопировку. Макрос обычно вызывается с помощью ops, которые принимают непосредственные значения или во время инициализации переменных.

MACRO M_swap16 operand 
LOCAL result 
result = (((operand and 0FFh) shl 8) or ((operand and 0FF00h) shr 8)) 
exitm %result 
ENDM 

IPPROTO_TCP EQU 6 
. 
. 
. 
mov [protocol], M_swap16(IPPROTO_TCP) ; fails 
. 
. 
. 
protocol DW ? 
protocol_default DW M_swap16(IPPROTO_TCP) ; fails 

Он отлично работает в MASM 6.11. Переключение режима TASM из режима IDEAL в MASM не помогает. Не перемещает макрос в инструкцию EQU. Идеи?

ответ

0

К сожалению, TASM5, похоже, не поддерживает макросы, возвращающие результаты выражениям, по крайней мере, согласно последним официальным документам. Это то, о чем говорит ошибка. Более конкретно, директива EXITM не принимает такой аргумент, как MASM, независимо от того, в каком режиме вы находитесь. Однако макросы TASM все еще могут выделять строку кода, поэтому, если вас не беспокоит передача выражения в макрос, Я предлагаю следующий обходной путь (IDEAL режима):.

MACRO M_swap16_EXPRESSION expr,operand 
    LOCAL result 
    result = (((operand and 0FFh) shl 8) or ((operand and 0FF00h) shr 8)) 
    expr result 
ENDM 

макрос выше принимает дополнительный аргумент «выраж» в качестве 1-го аргумента, который является выражением сборки вы пытаетесь подключить оригинальное выражение в Оно будет выполнять арифметика сборки-времени на операнде и испускать конечную сборочную линию. Он может быть использован, как это:

M_swap16_EXPRESSION <mov [protocol],>,IPPROTO_TCP 
... 
M_swap16_EXPRESSION <protocol_default DW>,IPPROTO_TCP 

Я признаю свою уродливую, но это может быть следующая лучшая вещь, если вы должны использовать TASM.

+0

Я согласен, что это уродливо. Ограничение также не позволяет вам перемещать макрос в инструкцию EQU. Это очень плохо. Знаете ли вы о любых совместимых с TASM ассемблерах, которые поддерживают этот уровень макросов? Lazy Assembler кажется неполным и оставленным. – toejam

+0

Вы можете использовать макрос выше для генерации линии EQU один раз: «M_swap16_EXPRESSION , 88h», а затем использовать это в другом месте без макроса, такого как «protocol_default DW IPPROTO_TCP». Протестировано на TASM 5.3 и TASM 5.4 (CodeGear) – byteptr

 Смежные вопросы

  • Нет связанных вопросов^_^