Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

6.2.6.2. Использование 32-битных регистров

Реальный режим допускает использование 32-битных регистров (eax, ebx, ecx, edx, esi, edi, ebp, esp) как для хранения данных, так и для формирования 32-битных адресных выражений. 32-битная адресация предполагает и другой (более сложный) способ кодирования машинных команд, в котором наряду с постбайтом, участвует спецификатор адреса – байт sib (см. рис. 1.4). Необходимо также указывать спецификатор размера сегмента use16 при использовании стандартных директив управления сегментами, например:

P486n

Segment text use16

................

Segment date use16

Ниже указываются основные отличия в 32 -битной адресации.

Первое отличие. В базовой и индексной адресациях может быть использован любой из 32-битных регистров. При этом если в качестве базового выступает один из регистров esp или ebp, то адресация будет осуществляться через сегментный регистр ss, хотя переназначение сегмента возможно. Адресация называется базовой или индексной (со смещением или нет) не по виду используемого регистра, а по способу формирования эффективного адреса ЕА.

Пример.

w_table dw 1,2,4,8,16,32

……………..

;Базовая адресация

mov eax,offset w_table

mov bx,[eax + 6] ;Загрузка элемента списка w_table c индексом к=3 в bx

;(3 * type w_table=6), т.е. bx  8. Здесь регистр eax -элемент адресного выражения и

;соответствия типов регистров bx и eax не требуется. Формат данных типа word и

;определяется регистром bx.

.......................

;Индексная адресация

mov eax,6 ;eax  3* type w_table

mov bx,[w_table + eax] ;bx  8. Тип переменной w_table и регистра bx соответст-

;вуют друг другу.

Второе отличие заключается в возможности масштабирования содержимого индексного регистра (любой, кроме esp), т. е. его умножения на заданный в команде коэффициент: 1, 2, 4 или 8. Тип индексного регистра не влияет на установленный по умолчанию выбор сегментного регистра, относительно которого осуществляется адресация.

Пример базовой индексной адресации с масштабированием:

mov edx,[Array + ecx + eax 4]

Здесь Array двумерный массив элементов типа dword, ecx – базовый адрес строки, eax – индекс элемента строки.

Поскольку программа может оперировать одновременно с 16-битными и 32-битными регистрами, то для их различия Tasm автоматически добавляет в машинный код программы префикс размера операнда 66h (если идёт "речь" о типе операнда) или префикс размера адреса 67h при использовании расширенных регистров в адресных выражениях (конечно, являются очевидными случаи с наличием обоих префиксов одновременно).

Однако, в некоторых случаях Tasm это не делает [12]. Так, например, перед командой организации цикла Loop, использующей расширенный регистр ecx, это делать приходится самому программисту:

Mov ecx,8008000 ;Счётчик цикла

Delay: db 67h ;Префикс размера адреса

Loop delay ;Повторим команду Loop 800 8000 (можно ≤ 232 раз).

Если это не сделать, то цикл будет выполнен только 8000 раз (можно ≤ 216 – 1 раз). Другой способ – использование альтернативных форм команды loop: loopw (loopwe, loopwne, ...) при использовании счётчика cx и loopd (loopde, loopdne, ...) при использовании ecx.

В заключение следует сказать, что возможности использования в программах реального режима дополнительных средств 32-разрядных процессоров в действительности ограничены. Новых команд не так уж много и они не носят принципиального характера, а 32-разрядные данные в прикладных "ассемблерных" программах используются относительно редко.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]