OSDev

для всех
Текущее время: 28 мар 2024, 17:03

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Ассемблирование
СообщениеДобавлено: 15 май 2015, 20:23 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Следующий код:
Код:
mov AX, BX
mov EAX, EBX
 
bits 16
mov AX, BX
mov EAX, EBX
 
bits 32
mov AX, BX
mov EAX, EBX
ассемблируется в:
Цитата:
89 D8
66 89 D8

89 D8
66 89 D8

66 89 D8
89 D8
Какая тут логика? Я не могу понять, что будет делать процессор при том или ином опкоде с верхним словом регистра EAX... :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 15 май 2015, 20:30 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Логика простая. Префикс 66h переключает декодер с одной кодовой таблицы на другую. Если использовать использовать дважды, то переключения происходит 2 раза. Трижды три.

Начальное состояние декодера определяет дескриптор сегмента кода 16 или 32. А bit 16 или bit 32 информирует компилятор о том в какой сегмент будет загружен ассемблерный код во время исполнения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 15 май 2015, 20:58 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Благодарю, действительно, просто. А я думал, что для каждой операции опкод однозначен...
И вся эта вакханалия творится с каждым префиксом? Ассемблер, получается, должен держать в памяти, сколько и каким префиксом он сделал переключение? Если так, то ещё вопрос - каждый такой префикс имеет 2 переключаемого "положения" или есть такие, которые больше?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 15 май 2015, 21:05 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
panotnap писал(а):
И вся эта вакханалия творится с каждым префиксом? Ассемблер, получается, должен держать в памяти, сколько и каким префиксом он сделал переключение?

К счастью, префикс действует только на одну команду, поэтому данный байт можно считать частью "однозначного" опкода команды.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 15 май 2015, 21:52 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Я провёл тест:
Код:
dd 0xFFFFFFFF      ; FF FF FF FF
mov AX, BX         ; 89 D8
mov AX, BX         ; 89 D8
mov EAX, EBX      ; 66 89 D8
mov EAX, EBX      ; 66 89 D8
mov AX, BX         ; 89 D8
mov EAX, EBX      ; 66 89 D8
dw 0xFFFF         ; FF FF
bits 32
mov AX, BX         ; 66 89 D8
mov EAX, EBX      ; 89 D8
mov EAX, EBX      ; 89 D8
mov AX, BX         ; 66 89 D8
db 0xFF            ; FF
bits 16
mov EAX, EBX      ; 66 89 D8
mov AX, BX         ; 89 D8
mov AX, BX         ; 89 D8
mov EAX, EBX      ; 66 89 D8
mov AX, BX         ; 89 D8
db 0xAA, 0x00, 0xAA ; AA 00 AA
Да, префикс действует на 1 команду и собой "реле" не являет.
Но почему-то в 32-битномом блоке опкоды AX и EAX поменяны местами. :o Я опять немного в ступоре... Но подозреваю, что имеется ввиду то, что bits 32 надо использовать только тогда, когда процессор переключён в защищённый режим, где данные опкоды расположены наоборот, вероятно, для того, чтобы оптимизировать 32-битный код по размеру.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 15 май 2015, 22:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
panotnap писал(а):
Но подозреваю, что имеется ввиду то, что bits 32 надо использовать только тогда, когда процессор переключён в защищённый режим, где данные опкоды расположены наоборот, вероятно, для того, чтобы оптимизировать 32-битный код по размеру.

Совершенно верно. Причём и в 64-битным режиме команды без префиксов такие же 32-битные, как в 32-битном режиме, а для превращения в 64-битную команду используется префикс 48h. Просто 32-бита оказались золотой серединой, наиболее употребительной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблирование
СообщениеДобавлено: 16 май 2015, 10:09 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Вообще, система кодирования команд (как, собственно, и сама система команд) в IA-32 -- одна из худших, если не худшая, во всей истории вычислительной техники. В Интел знают толк в извращениях :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB