§ Таблица регистров
Для обращения к памяти через регистры обычно используются четыре 16-разрядных регистра общего назначения (РОН): BX, SI, DI и BP. В защищённом режиме для адресации можно использовать все 8 регистров общего назначения.В 32-разрядных процессорах обычные регистры расширены до 32-х разрядов. Вот так регистр AX расширен до регистра EAX:
EAX | ||
---|---|---|
AH | AL | |
AX |
Подобным образом расширены все 8 регистров общего назначения:
31 | 16 | 15 | 8 | 7 | 0 |
---|---|---|---|---|---|
EAX | AH | AL | |||
ECX | CH | CL | |||
EDX | DH | DL | |||
EBX | BH | BL | |||
ESP | SP | ||||
EBP | BP | ||||
ESI | SI | ||||
EDI | DI |
31 | 16 | 15 | 0 | EFLAGS | FLAGS |
---|
31 | 16 | 15 | 0 |
---|---|---|---|
EIP | IP |
Хотя указатель стека (регистр ESP) также относится к регистрам общего назначения и может использоваться в командах, настоятельно рекомендуется никогда не привлекать его к использованию вне стека. Особенно это важно при работе в защищённом режиме, когда процессор автоматически использует текущее значение стека, чтобы поместить в него значения, например, при обработке исключений.
В 32-разрядном процессоре вы по-прежнему можете адресовать память через четыре 16-разрядных регистра BX, SI, DI и BP, но дополнительно к этому можно использовать каждый из 32-разрядных регистров общего назначения, причём в любом режиме (не только защищённом). Например:
1mov ax, [ebx] ; Поместить в AX значение из памяти по адресу DS:EBX 2mov dx, [ecx] ; Поместить в DX значение из памяти по адресу DS:ECX 3mov cx, [es:eax] ; Поместить в CX значение из памяти по адресу ES:EAXДополнительно к этой возможности введены следующие:
Использование константы и регистра:
1mov eax, [ecx + 1] 2mov bl, [edx + 12345678h]Сумма двух регистров:
1mov ebp, [ebx + edi] 2mov eax, [ecx + edx]Сумма двух регистров и константы:
1mov bl, [edx + eax + 12345678h]Масштаб - автоматическое умножение на 2, 4 или 8 одного из регистров, участвующих в образовании адреса:
1mov ax, [ebx * 2] 2mov cl, [edx + ebp * 4] 3mov esi, [edi + eax * 8 + 12345678h]Очевидно, что возможности, которые нам предоставляла XT, 32-разрядные процессоры значительно расширили. Следует, однако, учитывать, что в ранних процессорах (i386 и i486) на вычисление эффективного адреса процессор расходует дополнительное время, но благодаря универсальности этой системы адресации всё равно имеет место итоговый выигрыш в производительности.
При использовании 32-разрядных регистров для адресации в режиме реальных адресов, следует учитывать, что размер сегмента фиксирован и равен 64 Кб. Если процессор сформирует адрес, больший 64 Кб, то процессор зависнет, т.е. он не будет производить заворачивание адресов. Например:
1mov eax, 1234h 2mov bl, [eax] ; В регистр BL будет произведена загрузка значения с адреса DS:EAX, равного DS:1234h. 3mov edx, ffffh 4mov bl, [eax + edx] ; Эффективный адрес будет равен 1234h + ffffh = 11233h 5 ; (это больше, чем 64 Кб. Процессор зависнет)Использование 32-разрядных регистров для адресации памяти в защищённом режиме очень распространено, в основном, из-за того, что размер сегментов может достигать 4 Гб, да и просто потому, что это удобно.