OSDev http://osdev.su/ |
|
Ассемблирование http://osdev.su/viewtopic.php?f=18&t=1092 |
Страница 1 из 1 |
Автор: | panotnap [ 15 май 2015, 20:23 ] |
Заголовок сообщения: | Ассемблирование |
Следующий код: Код: mov AX, BX ассемблируется в:mov EAX, EBX bits 16 mov AX, BX mov EAX, EBX bits 32 mov AX, BX mov EAX, EBX Цитата: 89 D8 Какая тут логика? Я не могу понять, что будет делать процессор при том или ином опкоде с верхним словом регистра EAX...
66 89 D8 89 D8 66 89 D8 66 89 D8 89 D8 |
Автор: | pavia [ 15 май 2015, 20:30 ] |
Заголовок сообщения: | Re: Ассемблирование |
Логика простая. Префикс 66h переключает декодер с одной кодовой таблицы на другую. Если использовать использовать дважды, то переключения происходит 2 раза. Трижды три. Начальное состояние декодера определяет дескриптор сегмента кода 16 или 32. А bit 16 или bit 32 информирует компилятор о том в какой сегмент будет загружен ассемблерный код во время исполнения. |
Автор: | panotnap [ 15 май 2015, 20:58 ] |
Заголовок сообщения: | Re: Ассемблирование |
Благодарю, действительно, просто. А я думал, что для каждой операции опкод однозначен... И вся эта вакханалия творится с каждым префиксом? Ассемблер, получается, должен держать в памяти, сколько и каким префиксом он сделал переключение? Если так, то ещё вопрос - каждый такой префикс имеет 2 переключаемого "положения" или есть такие, которые больше? |
Автор: | Himik [ 15 май 2015, 21:05 ] |
Заголовок сообщения: | Re: Ассемблирование |
panotnap писал(а): И вся эта вакханалия творится с каждым префиксом? Ассемблер, получается, должен держать в памяти, сколько и каким префиксом он сделал переключение? К счастью, префикс действует только на одну команду, поэтому данный байт можно считать частью "однозначного" опкода команды. |
Автор: | panotnap [ 15 май 2015, 21:52 ] |
Заголовок сообщения: | Re: Ассемблирование |
Я провёл тест: Код: dd 0xFFFFFFFF ; FF FF FF FF Да, префикс действует на 1 команду и собой "реле" не являет.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 Но почему-то в 32-битномом блоке опкоды AX и EAX поменяны местами. Я опять немного в ступоре... Но подозреваю, что имеется ввиду то, что bits 32 надо использовать только тогда, когда процессор переключён в защищённый режим, где данные опкоды расположены наоборот, вероятно, для того, чтобы оптимизировать 32-битный код по размеру. |
Автор: | Himik [ 15 май 2015, 22:35 ] |
Заголовок сообщения: | Re: Ассемблирование |
panotnap писал(а): Но подозреваю, что имеется ввиду то, что bits 32 надо использовать только тогда, когда процессор переключён в защищённый режим, где данные опкоды расположены наоборот, вероятно, для того, чтобы оптимизировать 32-битный код по размеру. Совершенно верно. Причём и в 64-битным режиме команды без префиксов такие же 32-битные, как в 32-битном режиме, а для превращения в 64-битную команду используется префикс 48h. Просто 32-бита оказались золотой серединой, наиболее употребительной. |
Автор: | SII [ 16 май 2015, 10:09 ] |
Заголовок сообщения: | Re: Ассемблирование |
Вообще, система кодирования команд (как, собственно, и сама система команд) в IA-32 -- одна из худших, если не худшая, во всей истории вычислительной техники. В Интел знают толк в извращениях |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |