OberonCore https://forum.oberoncore.ru/ |
|
Ассиметрия IMUL и MUL https://forum.oberoncore.ru/viewtopic.php?f=27&t=3504 |
Страница 1 из 1 |
Автор: | Сергей Губанов [ Пятница, 08 Июль, 2011 17:15 ] |
Заголовок сообщения: | Ассиметрия IMUL и MUL |
В x86 процессорах операция целочисленного умножения с учётом знака IMUL может осуществляться в любом из 8 регистров общего назначения. А операция беззнакового целочисленного умножения MUL приделана только к регистру eax (с хвостом в edx). Причём в 64-битном варианте тоже самое IMUL - везде (16 регистров), MUL -только в регистре rax (с хвостом в rdx). Почему так? |
Автор: | Евгений Темиргалеев [ Суббота, 09 Июль, 2011 00:12 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): В x86 процессорах операция целочисленного умножения с учётом знака IMUL может осуществляться в любом из 8 регистров общего назначения.... Это появилось в 80186 или 80286; в 8086 было симметрично --- неточного умножения не было. Мне кажется, что на беззнаковое умножение не стали выделять коды операций, исходя из критерия частота использования/ограниченность кодов.Почему так? Дальше могла примешаться обратная совместимость,... |
Автор: | Сергей Губанов [ Суббота, 09 Июль, 2011 22:48 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Не стали выделять коды операций = Чисел мало и на всех их не хватает? Может, всё-таки, причина в материальной сфере, ну, например, транзисторы экономят? И в 64-битном режиме бремени обратной совместимости нет - не с кем. |
Автор: | alexus [ Суббота, 09 Июль, 2011 23:04 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): И в 64-битном режиме бремени обратной совместимости нет - не с кем. То есть, как не с кем?.. Кодогенерацию никто не отменял, а она практически идентична со времен 16-разрядных процессоров. Да, разрядность процессоров поменялась, а код команды остался прежний. Переделывать и отлаживать таблицы... очень затратно. Производителей процессоров просто не поймут.
|
Автор: | Сергей Губанов [ Воскресенье, 10 Июль, 2011 23:33 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
x64-тый поддерживает два режима работы. В long mode это совсем другой процессор. Например, у него 16 целочисленных регистров вместо восьми и плоская модель памяти вместо сегментированной. В long mode он ни с кем не совместим (нет предшественников). |
Автор: | alexus [ Понедельник, 11 Июль, 2011 04:59 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): x64-тый поддерживает два режима работы. В long mode это совсем другой процессор. Например, у него 16 целочисленных регистров вместо восьми и плоская модель памяти вместо сегментированной. В long mode он ни с кем не совместим (нет предшественников). В 32-х разрядных было ровно тоже самое... (за исключением увеличения количества целочисленных регистров). Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы... перекомпилировать/переделывать программы. Довольно долго старые процессоры сосуществуют с новыми, и этого нельзя не учитывать при создании нового процессора. Никто не станет менять кодогенерацию "из любви к искусству"... Лучшей иллюстрацией является Itanium.
|
Автор: | Trurl [ Понедельник, 11 Июль, 2011 09:42 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Есть "длинный" IMUL, полностью аналогичный MUL, и "короткий" IMUL. Отдельный "короткий" MUL не нужен, так как он ничем не будет отличаться от IMUL. |
Автор: | Сергей Губанов [ Вторник, 12 Июль, 2011 01:02 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Теперь понятно. ((2^32 + x)*(2^32 + y)) mod 2^32 = (x*y) mod 2^32 |
Автор: | Сергей Губанов [ Вторник, 12 Июль, 2011 01:07 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
alexus писал(а): Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы Невозможно попасть в long mode не переделав компилятор.
|
Автор: | alexus [ Вторник, 12 Июль, 2011 06:32 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): alexus писал(а): Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы Невозможно попасть в long mode не переделав компилятор. |
Автор: | Сергей Губанов [ Вторник, 12 Июль, 2011 21:55 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Ядро тоже программа и компилируется компилятором. Ядро может запустить либо старую 32-разрядную прикладную программу в 32-разрядном legacy mode, или новую 64-разрядную в 64-разрядном long mode. Старую 32-разрядную невозможно запустить как 64-разрядную. Для компиляции в 64-разрядную нужен специально обученный для этого компилятор. Там много чего по-другому. Например, первые четыре аргумента в процедуру передаются через регистры (уже одно только это делает невозможным смешивание 32-разрядного и 64-разрядного кода). |
Автор: | alexus [ Вторник, 12 Июль, 2011 22:55 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): Ядро тоже программа и компилируется компилятором. Да, конечно. Но это ничего не меняет в том, что сказано ранее.Сергей Губанов писал(а): Ядро может запустить либо старую 32-разрядную прикладную программу в 32-разрядном legacy mode, или новую 64-разрядную в 64-разрядном long mode. Правильно.Сергей Губанов писал(а): Старую 32-разрядную невозможно запустить как 64-разрядную. Совершенно верно. Загрузчик прочитает заголовок исполняемого файла и... корректно запустит программу.Сергей Губанов писал(а): Для компиляции в 64-разрядную нужен специально обученный для этого компилятор. Тоже верно.Сергей Губанов писал(а): Там много чего по-другому. Например, первые четыре аргумента в процедуру передаются через регистры (уже одно только это делает невозможным смешивание 32-разрядного и 64-разрядного кода). А никто и не говорит про смешивание кода. Речь шла о том, что сохраняются таблицы кодогенерации. Да, раньше, например Код: в 16-разрядном режиме: Код операции сохраняется, меняется только разрядность регистров. Поэтому если в компиляторе используются отлаженные таблицы генерации, то они будут работать и с новой разрядностью операндов. Да, нужно пересчитывать переходы (размер констант тоже вырастет, адреса (ссылки/указатели) станут больше), да, нужно внести изменения в вызовы подпрограмм, да, надо сформировать новый заголовок (PE) исполняемого файла, да, надо откорректировать размеры памяти под стек, код и пр. Но самая тонкая часть работы: преобразование исходного текста в код, не будет делаться с нуля. Постепенно от версии к версии компилятора добавят использование новых команд процессора, сделают дополнительную оптимизацию по скорости, улучшат взаимодействие с новой ОС и т.п.
8B D8 MOV BX,AX в 32-разрядном: 8B D8 MOV EBX,EAX в 64-разрядном: 8B D8 MOV RBX,RAX |
Автор: | QWERTYProgrammer [ Вторник, 12 Июль, 2011 23:57 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
alexus писал(а): ... Но самая тонкая часть работы: преобразование исходного текста в код, не будет делаться с нуля. Постепенно от версии к версии компилятора добавят использование новых команд процессора, сделают дополнительную оптимизацию по скорости, улучшат взаимодействие с новой ОС и т.п. Да, вот если бы кто-то из понимающих вот так постепенно расширил компилятор ББ на x86-64... |
Автор: | Сергей Губанов [ Четверг, 14 Июль, 2011 00:39 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
alexus писал(а): Речь шла о том, что сохраняются таблицы кодогенерации. Да, раньше, например Приведённый пример кода операции "r1 := r0" не имеет силы ибо очевидно бессмысленно было бы вводить несколько разных кодов для одной и той же операции. А поскольку в legacy mode эта операция есть, то и числовой код её уже фиксирован. В тоже самое время у четырёх разных операций загрузки в регистр из памяти данных формата Int8, Int16, Int32 и Int64 коды разные.
Код: в 16-разрядном режиме: Код операции сохраняется, меняется только разрядность регистров. Поэтому если в компиляторе используются отлаженные таблицы генерации, то они будут работать и с новой разрядностью операндов.8B D8 MOV BX,AX в 32-разрядном: 8B D8 MOV EBX,EAX в 64-разрядном: 8B D8 MOV RBX,RAX |
Автор: | alexus [ Четверг, 14 Июль, 2011 07:47 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): В тоже самое время у четырёх разных операций загрузки в регистр из памяти данных формата Int8, Int16, Int32 и Int64 коды разные. Сергей, ну, посмотрите же документацию... вот, например, AMD64 Architecture Programmer’s Manual Volume 1: Application ProgrammingКод: Mnemonic Opcode Description
MOV reg/mem8, reg8 88 /r Move the contents of an 8-bit register to an 8-bit destination register or memory operand. MOV reg/mem16, reg16 89 /r Move the contents of a 16-bit register to a 16-bit destination register or memory operand. MOV reg/mem32, reg32 89 /r Move the contents of a 32-bit register to a 32-bit destination register or memory operand. MOV reg/mem64, reg64 89 /r Move the contents of a 64-bit register to a 64-bit destination register or memory operand. MOV reg8, reg/mem8 8A /r Move the contents of an 8-bit register or memory operand to an 8-bit destination register. MOV reg32, reg/mem32 8B /r Move the contents of a 32-bit register or memory operand to a 32-bit destination register. MOV reg64, reg/mem64 8B /r Move the contents of a 64-bit register or memory operand to a 64-bit destination register. MOV reg16/32/64/mem16, segReg 8C /r Move the contents of a segment register to a 16-bit, 32-bit, or 64-bit destination register or to a 16-bit memory operand. MOV segReg, reg/mem16 8E /r Move the contents of a 16-bit register or memory operand to a segment register. MOV AL, moffset8 A0 Move 8-bit data at a specified memory offset to the AL register. MOV AX, moffset16 A1 Move 16-bit data at a specified memory offset to the AX register. MOV EAX, moffset32 A1 Move 32-bit data at a specified memory offset to the EAX register. MOV RAX, moffset64 A1 Move 64-bit data at a specified memory offset to the RAX register. MOV moffset8, AL A2 Move the contents of the AL register to an 8-bit memory offset. MOV moffset16, AX A3 Move the contents of the AX register to a 16-bit memory offset. MOV moffset32, EAX A3 Move the contents of the EAX register to a 32-bit memory offset. MOV moffset64, RAX A3 Move the contents of the RAX register to a 64-bit memory offset. MOV reg8, imm8 B0 +rb ib Move an 8-bit immediate value into an 8-bit register. MOV reg16, imm16 B8 +rw iw Move a 16-bit immediate value into a 16-bit register. MOV reg32, imm32 B8 +rd id Move an 32-bit immediate value into a 32-bit register. MOV reg64, imm64 B8 +rq iq Move an 64-bit immediate value into a 64-bit register. MOV reg/mem8, imm8 C6 /0 ib Move an 8-bit immediate value to an 8-bit register or memory operand. MOV reg/mem16, imm16 C7 /0 iw Move a 16-bit immediate value to a 16-bit register or memory operand. MOV reg/mem32, imm32 C7 /0 id Move a 32-bit immediate value to a 32-bit register or memory operand. MOV reg/mem64, imm32 C7 /0 id Move a 32-bit signed immediate value to a 64-bit register or memory operand. |
Автор: | Сергей Губанов [ Пятница, 15 Июль, 2011 00:26 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Загрузка одного байта: 0F BE 00 movsx eax,byte ptr [eax] Загрузка двух байтов: 0F BF 00 movsx eax,word ptr [eax] Загрузка четырёх байтов: 8B 00 mov eax,dword ptr [eax] Сохранение одного байта: 88 02 mov byte ptr [edx],al Сохранение двух байтов: 66 89 02 mov word ptr [edx],ax Сохранение четырёх байтов: 89 02 mov dword ptr [edx],eax |
Автор: | alexus [ Пятница, 15 Июль, 2011 04:49 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): Загрузка одного байта: Смотрим в первоисточнике (ссылку приводил выше)0F BE 00 movsx eax,byte ptr [eax] Загрузка двух байтов: 0F BF 00 movsx eax,word ptr [eax] Загрузка четырёх байтов: 8B 00 mov eax,dword ptr [eax] Сохранение одного байта: 88 02 mov byte ptr [edx],al Сохранение двух байтов: 66 89 02 mov word ptr [edx],ax Сохранение четырёх байтов: 89 02 mov dword ptr [edx],eax Код: MOVSX Move with Sign-Extension Во втором примере, уберите префикс 66 и получите уже знакомую картину. Сергей, ну, зачем спорить о том, что написано в документации? Не проще ли внимательно посмотреть/прочитать...
Copies the value in a register or memory location (second operand) into a register (first operand), extending the most significant bit of an 8-bit or 16-bit value into all higher bits in a 16-bit, 32-bit, or 64-bit register. Mnemonic Opcode Description MOVSX reg16, reg/mem8 0F BE /r Move the contents of an 8-bit register or memory location to a 16-bit register with sign extension. MOVSX reg32, reg/mem8 0F BE /r Move the contents of an 8-bit register or memory location to a 32-bit register with sign extension. MOVSX reg64, reg/mem8 0F BE /r Move the contents of an 8-bit register or memory location to a 64-bit register with sign extension. MOVSX reg32, reg/mem16 0F BF /r Move the contents of an 16-bit register or memory location to a 32-bit register with sign extension. MOVSX reg64, reg/mem16 0F BF /r Move the contents of an 16-bit register or memory location to a 64-bit register with sign extension. |
Автор: | Сергей Губанов [ Пятница, 15 Июль, 2011 11:27 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Как это уберите префикс?.. Для трёх разных операций сохранения есть три разных кода. |
Автор: | alexus [ Пятница, 15 Июль, 2011 11:31 ] |
Заголовок сообщения: | Re: Ассиметрия IMUL и MUL |
Сергей Губанов писал(а): Как это уберите префикс?.. Разберитесь, зачем он нужен.Сергей Губанов писал(а): Для трёх разных операций сохранения есть три разных кода. Ладно... тому, кто не желает видеть, очки не помеха...
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |