Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ.doc
Скачиваний:
32
Добавлен:
06.11.2018
Размер:
2.94 Mб
Скачать

6.3. Использование регистров Pentium

В процессорах Pentium обычные регистры расширены до 32-х разрядов (рис 3.3). Конечно, благодаря программной совместимости можно использовать все 16-разрядные регистры по-прежнему, но дополнительно к этому можно использовать каждый из 32-разрядных регистров общего назначения, причём в любом режиме (не только защищённом). Например:

mov ax,[ebx] ; Поместить в AX значение из памяти

; по адресу DS:EBX

mov dx,[ecx] ; Поместить в DX значение из памяти

; по адресу DS:ECX

mov cx,es:[eax] ; Поместить в CX значение из памяти

; по адресу ES:EAX

        Дополнительно к этой возможности введены следующие:

  • Использование константы и регистра:

mov eax,[ecx + 1]

mov bl,[edx + 12345678h]

  • Сумма двух регистров:

mov ebp,[ebx + edi]

mov eax,[ecx + edx]

  • Сумма двух регистров и константы:

mov bl,[edx + eax + 12345678h]

  • Масштаб - автоматическое умножение на 2, 4 или 8 одного из регистров, участвующих в образовании адреса:

mov ax,[ebx * 2]

mov cl,[edx + ebp * 4]

mov esi,[edi + eax * 8 + 12345678h]

        При использовании 32-разрядных регистров для адресации в режиме реальных адресов, следует учитывать, что размер сегмента фиксирован и равен 64 Кб. Если процессор сформирует адрес, больший 64 Кб, то процессор зависнет. Например:

mov eax,1234h

mov bl,[eax] ; В регистр BL будет произведена загрузка

; значения с адреса DS:EAX.

mov edx,ffffh

mov bl,[eax + edx] ; Эффективный адрес будет равен

; 1234h + ffffh = 11233h (это больше,

; чем 64 Кб. Процессор зависнет.)

        Использование 32-разрядных регистров для адресации памяти в защищённом режиме очень распространено, в основном, из-за того, что размер сегментов может достигать 4 Гб.

Перед тем как создавать программы, использующие MMX- и SSE-расширения, следует убедиться в том, что данный тип ЦП поддерживает эту технологию. Для этого можно выполнить специальную команду cpuid, предварительно поместив в регистр ЕАХ значение 1. После выполнения команды проверка 23-го бита в регистре ЕDХ показывает, поддерживается ли технология ММХ процессором, а 25-го бита – поддерживается ли технология SSE. Ниже приводится текст процедуры на ассемблере, выполняющей эту проверку.

.686

.model flat

.code

check_mmx_sse proc

mov eax, 1

xor bl, bl

cpuid

test edx, 800000h

jz test_sse

inc bl

test_sse: test edx, 2000000h

jz exit

inc bl

inc bl

exit: mov al, bl

ret

check_mmx_sse endp

end

Процедура check_mmx_sse возвращает в регистре AL значение:

  • al = 0 – если MMX и SSE не поддерживаются;

  • al = 1 – поддерживается только MMX;

  • al = 2 – поддерживается только SSE;

  • al = 3 – поддерживается MMX и SSE.

6.4. Директивы языка ассемблера asm-89

При составлении программ для ПВВ используется язык ASM-89. Этот язык также включает операторы двух типов: команды и директивы. На рис. 6.3 приведены примеры форматов команд и директив.

Рис. 6.3. Поля операторов языка ASM-89: a - директив; б - мнемокодов команд

Для определения типов переменных, используемых в программе, предназначены директивы DB и DD, аналогичные директивам АSМ-86. Наряду с ними для резервирования области ОЗУ применяется директива DS, позволяющая только резервировать (без задания начальных значений) произвольное число байтов. Особенности написания мнемокодов команд ПВВ, в зависимости от способов адресации приведены в табл. 6.1.

В программах для ПВВ часто встречаются структуры данных, приведенные на рис. 6.4,а, для организации которых предусмотрена специальная директива STRUC, позволяющая присваивать имена и относительные адреса набору связанных друг с другом переменных, которые называют элементами структуры.

Таблица 6.1

п/п

Способ адресации

Примеры мнемокода команды

1

По базе

ADD GC, [GB]

ADDBI [PP], 12

2

Со смещением

ADDB IX, [GB].5

ADDB ВС, [GC].COUNT

3

Индексная

ADD [GC+ IX], BC

4

Индексная с автоинкрементом

ADDI [GC+IX+],5

Задание структуры, показанной на рис. 6.4,а, с помощью директивы STRUC имеет вид:

PARMBLOCK STRUCT

TP: DS 4

COMMAND: DS 1

RESULT: DS 1

BUFFER1: DS 4

BUFFER2: DS 2

PARMBLOCK ENDS

Данной структуре присвоено имя РАRМВLОСК и она является блоком параметров, который включает указатель задания TP размерностью 4 байта, параметр COMMAND (1 байт), параметр RESULT (1 байт), два параметра BUFFER1 (4 байта) и BUFFER2 (2 байта). Имя структуры указывается перед директивой STRUC и перед директивой ENDS, определяющей конец структуры.

Рис. 6.4. Размещение параметров структуры в памяти

Важно отметить, что задание структуры. не распределяет конкретные адреса памяти, а лишь определяет взаимное расположение ее элементов. Программа-ассемблер использует имена элементов структуры для определения величины смещения адреса соответствующего элемента от начального адреса структуры. Так, если начальный адрес структуры находится в регистре-указателе параметров РР, то обращение к элементам структуры в программе на языке ассемблера будет иметь вид:

LPD GA, [PP].BUFFERl

MOVBI [РР].RESULT, 0

\

Здесь первая команда загружает содержимое элемента структуры BUFFERl в регистр GA, а вторая команда обнуляет элемент структуры RESULT. Эти же операции можно выполнить и с помощью команд

LPD GA, [PP] . 6

MOVBI [РР]. 5,0

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

Программа, написанная на языке ASM-89, может включать обращения к программам с помощью команды САLL (или LCALL). Первый операнд этих команд всегда задает адрес памяти, по которому должно быть сохранено значение регистра перед передачей управления вызываемой подпрограмме. Второй операнд этих команд содержит имя подпрограммы, определяющее ее начальный адрес. Возврат из подпрограммы осуществляется, как правило, с помощью команды MOVP, восстанавливающей содержимое регистра ТР из области сохранения. Ниже представлен фрагмент программы, которая использует команду вызова подпрограммы:

SAVE: DS 3 ; задание области сохранения

LPDI GC,SAVE ; загрузка адреса в GC

LCALL [GC],Donna ; вызов подпрограммы Donna

. . . ; тело программы

HLT ; завершение программы

Donna: . . . ; вход в подпрограмму Donna

. . . ; тело подпрограммы

MOVP TP,[GC] ; возврат из подпрограммы

Следует отметить, что подпрограмма Donna не должна изменять содержимое регистра GC, поскольку оно указывает на адрес возврата.

В качестве примера рассмотрим две программы на языке ASM-89. Первая программа предназначена для пересылки блока информации из области памяти с начальным адресом ADR1 в область памяти с начальным адресом АDR2. Число пересылаемых байтов (до 64К байт) задается параметром SIZE. Исходные данные размещаются в памяти в виде простой структуры, представленной на рис. 6.4,б, с начальным адресом, указанным в регистре-указателе PP. Программа имеет вид

1 MEMTRANS SEGMENT

2 PB STRUCT

3 TPRESERV: DS 4

4 ADR1: DS 4

5 ADR2: DS 4

6 SIZE: DS 2

7 PB ENDS

8 LPD GA,[PP].ADR1

9 LPD GB,[PP].ADR2

10 MOV BC,[PP].SIZE

11 MOV CC,0C208h

12 XFER

13 WID 16,16

14 HLT

15 MEMTRANS ENDS

16 END

В строке 1 используется директива SEGMENT, которая указывает на начало программы и присваивает ей имя MEMTRANS. В строках 2 - 7 описывается структура исходных данных, соответствующая рис. 6.4, б. В строках 8, 9 начальные адреса ADRI и ADR2 областей памяти, между которыми осуществляется пересылка данных, загружаются в регистры GA и GB, соответственно. В строке 10 в счетчик байтов ВС загружается число пересылаемых байтов. Для указанных загрузок используется адресация со смещением. Далее, в строке 11, в регистр управления каналом СС загружается константа, которая задает требуемый режим пересылки.