Turbo Assembler 3.0. Руководство пользователя


с целевым регистром, инструкция SETFIELD


Турбо ассемблер версии 3.1 предусматривает следующие новые средства:

1. Расширенные инструкции SETFIELD и GETFIELD.

Когда исходное значение совпадает с целевым регистром, инструкция SETFIELD больше не выполняет операцию OR над исходным значением. Вместо этого SETFIELD будет обеспечи- вать, что неустановленные поля целевого региста будут ну- левыми.

Аналогично, если вы используете при совпадении исходного и целевого регистра инструкцию GETFIELD, то инструкция больше не будет генерировать нефункциональную инструкцию "MOV приемник, источник".

2. Дополнительные параметры командной строки.

Турбо ассемблер 3.1 позволяет теперь задавать дополни- тельные объектные форматы, используемые отдельными компо- новщиками. Это следущие параметры:

----------------T-----------------------------------------------¬ ¦ Параметр ¦ Значение ¦ +---------------+-----------------------------------------------+ ¦ /o ¦ Генерируются стандартные совместимые с TLINK¦ ¦ ¦ объектные файлы с разрешенной поддержкой¦ ¦ ¦ оверлеев. ¦ ¦ ¦ ¦ ¦ /oi ¦ Генерируются объектные файлы в формате, сов-¦ ¦ ¦ местимом с компоновщиком IBM. ¦ ¦ ¦ ¦ ¦ /op ¦ Генерируются объектные файлы в формате, сов-¦ ¦ ¦ местимом с компоновщиком Phar Lap. ¦ ¦ ¦ ¦ ¦ /os ¦ Генерируются стандартные совместимые с TLINK¦ ¦ ¦ объектные файлы с запрещенной поддержкой¦ ¦ ¦ оверлеев. Этот параметр задается по умолча-¦ ¦ ¦ нию. ¦ L---------------+------------------------------------------------

3. Новый атрибут сегмента и предупреждение о неинициализиро- ванном сегменте.

Атрибут сегмента UNINIT позволяет вам выявлять непредна- меренную запись инициализированных данных в неинициализи- рованные сегменты данных. Использование данного атрибута в описании сегмента позволяет вам генерировать предупреж- дающее сообщение, уведомляющее об этой проблеме.

Приведем пример сегментной директивы, использующей новый атрибут:

BSS SEGMENT PUBLIC WORD UNINIT 'BSS'

Данная директива будет генерировать следующее предупреж- дающее сообщение:

Warning: Data or code written to uninitialized segment (Предупреждение: Данные или код записываются в неини- циализированный сегмент)



Для запрещения данного сообщения используйте директиву NOWARN UNI. Вновь разрешить это сообщение можно с по- мощью директивы WARN UNI.

4. Директивы PUSHSTATE и POPSTATE.

Директива PUSHSTATE сохраняет текущее оперативное состоя- ние внутреннего стека, имеющего глубину 16 уровней. Ди- ректива PUSHSTATE особенно полезна, если у вас имеется код в макрокоманде, функциирующий независимо от текущего оперативного состояния, но не влияющий на текущий опера- тивный режим.

Сохраняемая Турбо ассемблером информация о состоянии со- держит:

- текущую версию эмуляции (например, T310); - выбор режима (например, IDEAL, MASM, QUIRKS, MASM51); - переключатели EMUL и NOEMUL; - выбор текущего процессора и сопроцессора; - переключатели MULTERRS или NOMULTERRS; - переключатели SMART или NOSMART; - текущее основание системы счисления; - переключатели JUMPS или NOJUMPS; - переключатели LOCALS или NOLOCALS; - текущий префикс локального символа.

Для возврате последнего сохраненного состояния из стека используйте директиву POPSTATE.

; примеры директив PUSHSTATE и POPSTATE

ideal model small codeseg

jumps locals @@

; Показывает изменение состояние процессора, основание ; чисел и режим JUMPS pushstate nojumps radix 2 ; Установить в двоичное основание p386 jl next1 ; После этого нет дополнительных NOPS mov eax,100 ; Теперь 100 означает двоичное число ; 100 или десятичное 4. next1: popstate ; Восстановить JUMPS и режим не 386.

; Вернуться к директиве JUMPS, не 386 и десятичному осно- ; ванию

jl next2 ; Три дополнительных NOPS для ; обработки JUMPS xor eax,eax ; Теперь не режим 386!

mov cx,100 ; Теперь 100 означает десятичное 100

pushstate MULTERRS mov ax,[bp+abc popstate

mov ax,[bp+abc

; Показазывает запрещение локальной области действия ; идентификаторов locals next2: @@a: loop @@a next3: @@a: loop @@a ; Допутимо благодаря области действия ; NEXT2: и NEXT3:

pushstate nolocals next4: @@b: loop @@b next5: @@b: loop @@b ; Это приведет к конфликту из-за ; нелокальности popstate

; Показывает изменение префикса локального идентификатора ; и режим MASM/IDEAL pushstate masm locals @$



testproc proc ; Режим MASM для описания процедуры jmp @$end

@$end: nop @@end: ret testproc endp

testproc2 proc jmp @$end @$end: nop ; Это не приводит к конфликту с меткой ; в TESTPROC @@end: ret ; Эта метка приведет к конфликту testproc2 endp popstate

; Теперь вернемся к @@ в качестве локального префикса и ; режиму IDEAL testproc2b proc ; Это будет работать, так как мы снова ; в режиме IDEAL ret testproc2b endp ; а это даст ошибку.

proc testproc3 jmp @$end2 @$end2: nop @@end2: ret endp testproc3

proc testproc4 jmp @$end2 @$end2: nop ; Эта метка не приведет к конфликту @@end2: ret ; Эта метка не приведет к конфликту ; с меткой в TESTPROC3 endp testproc4 end

5. Новые директивы процессора.

Новые директивы процессора добавлены для работы с платой 486SX.

.487 - разрешает ассемблирует инструкций числового про- цессора 487. Данная инструкция работает только в режиме MASM.

P487 - разрешает ассемблирует инструкций числового про- цессора 487. Данная инструкция работает как в ре- жиме MASM, так и в режиме Ideal.

6. Подстановка текстовых присваиваний.

Для улучшения совместимости с MASM в TASM 3.1 введены из- менения в характер постановки текстовых присваиваний. Это приводит к тому, что старый код дает в TASM 3.1 ошибки, что можно устранить двумя способами:

1) Используйте директиву командной строки /UT300 для вы- бора обработки в стиле TASM 3.0.

2) В начале строк, которые вызывают ошибки в TASM 3.1, но не в TASM 3.0, явно используйте оператор текстовой макроподстановки %.

Примером этого являются файлы WHEREIS. Для WHEREIS, раз- мер модели определятеся в командной строке следующим об- разом:

TASM /dMDL=small iwhereis.asm

Затем в IWHEREIS.ASM, код делает проверку, чтобы убедить- ся, что определено MDL, и, если это так, в TASM 3.0 ис- пользуется следующая строка кода:

model MDL

TASM 3.0 перед вычислением выражения автоматически подс- тавляет значение MDL. TASM 3.1 теперь требует от вас яв- ного указания оператора %:

% model MDL


Содержание раздела