Иллюстрированный самоучитель по задачам и примерам Assembler

Препроцессор команд ХММ-расширения

В табл. 10.1 приведены коды регистров общего назначения и соответствующих им ХММ-регистров. В правом столбце этой таблицы содержится условное обозначение ХММ-регистров, принятое в файле iaxmm.inc. Это же соответствие закреплено рядом определений в этом файле, которые иллюстрирует следующая программа.

DefineXMMxRegs Macro IFDEF APPJ.6BIT
rxmm0 TEXTEQU<AX>
rxmm1 TEXTEQU<CX>
rxmm2 TEXTEQU<DX>
rxmm3 TEXTEQU<BX>
rxmm4 TEXTEQU<SP>
rxmm5 TEXTEQU<BP>
rxmm6 TEXTEQU<SI>
rxmm7 TEXTEQU<DI>
RXMM0 TEXTEQU<AX>
RXMM1 TEXTEQU<CX>
RXMM2 TEXTEQU<DX>
RXMM3 TEXTEQU<BX>
RXMM4 TEXTEQU<SP>
RXMM5 TEXTEQU<BP>
RXMM6 TEXTEQU<SI>
RXMM7 TEXTEQU<DI>
rxmml TEXTEQU<ECX>
rxmm2 TEXTEQU<EDX>
rxmm3 TEXTEQU<EBX>
rxmm4 TEXTEQU<ESP>
rxmm5 TEXTEQU<EBP>
rxmm6 TEXTEQU<ESI>
rxmm7 TEXTEQU<EDI>
RXMM0 TEXTEQU<EAX>
RXMM1 TEXTEQU<ECX>
RXMM2 TEXTEQU<EDX>
RXMM3 TEXTEQU<EBX>
RXMM4 TEXTEQU<ESP>
RXMM5 TEXTEQU<EBP>
RXMM6 TEXTEQU<ESI>
RXMM7 TEXTEQU<EDI> ENDIF endm

Таблица 10.1. Кодировка регистров в машинном коде команды.

Код в поле reg Регистр целочисленного устройства ХММ-регистр
000 АХ/ЕАХ RXMM0
001 СХ/ЕСХ RXMM1
010 DX/EDX RXMM2
011 ВХ/ЕВХ RXMM3
100 SP/ESP RXMM4
101 ВР/ЕВР RXMM5
110 SI/ESI RXMM6
111 DI/EDI RXMM7

Теперь в исходном тексте программы можно использовать символические имена ХММ-регистров в качестве аргументов макрокоманд, моделирующих ХММ-команды.

Рассмотрим, как в файле iammx.inc описано макроопределение для моделирования ХММ-команды скалярной пересылки MOVSS.

:F3 OF 10 /г movss xrrnil .xmm2/m32:F3 OF 11 /r movss xmm2/m32 .xnrnl movss macro dst:req .src:req
XMMld_st_f3 opc_Mo"s .dst, src endm

Понимание структуры приведенного макроопределения не должно вызвать у читателя трудностей. Начать следует с того, что данная команда содержит вложенный вызов макрокоманды XMMld_st_f3, у которой две задачи – определить вариант сочетания операндов, после чего сформировать правильный код операции и подставить его на место соответствующих байтов в команде CMPXCHG. В результате этих действий команда CMPXCHG "превращается" в ХММ-команду MOVSS.

1. XMMld_St f3 macro op:req.dst:req, src:req
2 .local x. у
3. Defin'eXMMxRegs
4. IF (OPATTR(dst)) AND OOOlOOOOy – .register
5 .x: lock cmpxchg src .dst
6. у: org x
7 .byte OF3H.0Fh .op& Id
8 .org у
9. ELSE
10 .x: lock cmpxchgdst .src
11 .y: orgx
12 .byte 0F3H.0Fh .op&_st
13 .orgy
14. ENDIF
15. UnDefineXMMxRegs
16 .endm
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.