Навигация сайта

  • Главная
  • Статьи
  • Учебники
  • Программы
  • Друзья сайта

Глава 6. Использование регистров общего назначения для адресации

Для обращения к памяти через регистры обычно используются четыре 16-разрядных регистра общего назначения (РОН): BX, SI, DI и BP. В защищённом режиме для адресации можно использовать все 8 регистров общего назначения.
В 32-разрядных процессорах обычные регистры расширены до 32-х разрядов. Вот так регистр AX расширен до регистра EAX:


Рисунок 6-1. Формат регистра EAX.

Как видите, регистр AX является составной частью регистра EAX (так же, как регистры AL и AH являются составными частями регистра AX), т.е. если вы обращаетесь к регистру AX, то вы меняете содержимое регистра EAX.
Подобным образом расширены все 8 регистров общего назначения:


Рисунок 6-2. Регистры общего назначения.

Также, расширен 16-разрядный регистр FLAGS - теперь это 32-разрядный EFLAGS, младшая половина которого представляет собой FLAGS:


Рисунок 6-3. Формат регистра EFLAGS.

Регистр IP (Instruction Pointer) был расширен до 32-разрядного EIP:


Рисунок 6-4. Формат регистра EIP.

Регистр EIP непосредственно использовать нельзя, но теперь следует учитывать, что при 32-разрядной адресации памяти в качестве адреса перехода можно указывать 32-разрядную величину.
Хотя указатель стека (регистр ESP) также относится к регистрам общего назначения и может использоваться в командах, настоятельно рекомендуется никогда не привлекать его к использованию вне стека. Особенно это важно при работе в защищённом режиме, когда процессор автоматически использует текущее значение стека, чтобы поместить в него значения, например, при обработке исключений.

В 32-разрядном процессоре вы по-прежнему можете адресовать память через четыре 16-разрядных регистра BX, SI, DI и BP, но дополнительно к этому можно использовать каждый из 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 ]

Очевидно, что возможности, которые нам предоставляла XT, 32-разрядные процессоры значительно расширили. Следует, однако, учитывать, что в ранних процессорах (i386 и i486) на вычисление эффективного адреса процессор расходует дополнительное время, но благодаря универсальности этой системы адресации всё равно имеет место итоговый выигрыш в производительности.

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

	mov	eax,1234h
mov bl,[ eax ] ; В регистр BL будет произведена загрузка
; значения с адреса DS:EAX, равного DS:1234h.

mov edx,ffffh
mov bl,[ eax + edx ] ; Эффективный адрес будет равен
; 1234h + ffffh = 11233h (это больше,
; чем 64 Кб. Процессор зависнет.

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

 

Техническая поддержка и аудит сайта.