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
66 89 D8

89 D8
66 89 D8

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

Автор:  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
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-битный код по размеру.

Автор:  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/