Привет. Проблема в следующем. Нужно определить новый набор инструкций. Например короткий условный переход. В нём смещение. Красиво будет так: Код (Text): label_: nop jt label_ Макрос без всего лишнего такой: Код (Text): jt macro Address:REQ Disp = ($ - Address) if Disp gt 127 .err endif BYTE Disp + 1 endm Так компилится. Если метка определена ниже вызова макроса то пишет ошибку: "error A2006 undefined symbol Disp" "jt(2) Macro Called From" Тоесть так не работает: Код (Text): jt label_ nop label_: Масм многопроходовый компилятор, видимо макро раскрывает есчо до определения всех меток, поэтому offset не помогает. Никак не пойму в чём трабла.
У меня скомпилилось и так и так masm этот: http://www.microsoft.com/downloads/details.aspx?FamilyID=7A1C9DA0-0510-44A2-B042-7EF370530C64&displaylang=en
Clerk, там у тебя получается, что Disp меньше нуля, т.е. проверять что Disp может быть больше 127 смысла не имеет.
Если метка ниже(в сурце) макро говорит что эта метка не определена для этого: Код (Text): jt macro Address:REQ if (Address gt $) echo ++++ endif endm Если так сделать то работает: Код (Text): jt macro Address:REQ BYTE (Address - $) endm Так тоже компилит: Код (Text): jt macro Address:REQ Disp1 = (Address - $) Disp2 = ($ - Address) BYTE Disp1, Disp2 endm А в условии никак. В этом и проблема, при проверке выдаёт ошибку.
Clerk, что в етом именно в етой проверке проблема я понял после второй безуспешной попытки компила. И вариантов всяких разных тож много перепробовал ). щас вот друг зашел с пузырём, мож чет до утра придумаем
litrovith Надеюсь на вас. В масме существует возможность управлять обработкой макроса в зависимости от прохода(вроде в 6.1 была эта возможность), тоесть например не давать компилятору раскрывать макро, пока все метки нормально не определит ?
вобщем вот, по дороге прихватил, 1,2. За два прохода масм не осиливает... хотя хз(я сантехник)Clerk, помоему дело именно в масме (замечал раньше глюки подобного рода). а кто что думает по етому поводу?
1 читал уже много раз. 2 посмотрю спасибо. Ладно если макросы не работают тогда вернусь к началу. Вот принцип: Код (Text): CPU_EXTENSION_PREFIX macro BYTE 0FFh, 0FFh ;Invalid opcode endm ;"Clear trap flag" ;Очищает флаг TF. clt macro CPU_EXTENSION_PREFIX BYTE 01 endm ;"Set trap flag" ;Взводит флаг TF. stt macro CPU_EXTENSION_PREFIX BYTE 02 endm [...] Это простейшие инструкции, в которых нет параметров. Но как составлять более сложные ? Хотел красиво(как тотже условный переход) сделать. Никак.. в принципе можно и в хекс редакторе всё собирать.. Можно вручную все поля инструкции заполнять, но тогда проблема возникает в обнаружении ошибок, например если смещение получается больше положенного, но входит в диапазон то как это проверить хз. Фасм взять - но я привык к масму, весь код мой на масме. Да и хидеры не пойдут, не хочу месяц сидеть переписывать их. Как это реализовать можно вопрос.
Clerk По моему ты не совсем прав в отношении +1, что-то подсказывает мне, что её нужно учитывать при вычислении disp (до проверки), а не при byte disp? А извратиться с масмом можно так: Код (Text): jt macro Address:REQ Disp = ($ - Address + 1) db Disp shl 1 ; <- при Disp>127 это вызовет ошибку - результат не помещается в байт org $ - 1 ; <- вернуться для затирания пробного байта db Disp endm Здесь замкнутый круг - чтобы определить метки нужно скомпилить код, а для этого нужно раскрыть макросы, чтобы узнать какой размер кода они генерируют, в фасме эта проблема тоже требует изрядной пляски с бубном.
попробуй так Код (Text): jt macro Address:REQ Disp = ($ - Offset(Address)) if Disp gt 127 .err endif BYTE Disp + 1 endm