OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 19 Июнь, 2019 16:36

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Ассиметрия IMUL и MUL
СообщениеДобавлено: Пятница, 08 Июль, 2011 17:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
В x86 процессорах операция целочисленного умножения с учётом знака IMUL может осуществляться в любом из 8 регистров общего назначения. А операция беззнакового целочисленного умножения MUL приделана только к регистру eax (с хвостом в edx).

Причём в 64-битном варианте тоже самое IMUL - везде (16 регистров), MUL -только в регистре rax (с хвостом в rdx).

Почему так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Суббота, 09 Июль, 2011 00:12 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Сергей Губанов писал(а):
В x86 процессорах операция целочисленного умножения с учётом знака IMUL может осуществляться в любом из 8 регистров общего назначения....
Почему так?
Это появилось в 80186 или 80286; в 8086 было симметрично --- неточного умножения не было. Мне кажется, что на беззнаковое умножение не стали выделять коды операций, исходя из критерия частота использования/ограниченность кодов.

Дальше могла примешаться обратная совместимость,...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Суббота, 09 Июль, 2011 22:48 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Не стали выделять коды операций = Чисел мало и на всех их не хватает? :? :? :?

Может, всё-таки, причина в материальной сфере, ну, например, транзисторы экономят?

И в 64-битном режиме бремени обратной совместимости нет - не с кем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Суббота, 09 Июль, 2011 23:04 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
И в 64-битном режиме бремени обратной совместимости нет - не с кем.
То есть, как не с кем?.. Кодогенерацию никто не отменял, а она практически идентична со времен 16-разрядных процессоров. Да, разрядность процессоров поменялась, а код команды остался прежний. Переделывать и отлаживать таблицы... очень затратно. Производителей процессоров просто не поймут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Воскресенье, 10 Июль, 2011 23:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
x64-тый поддерживает два режима работы. В long mode это совсем другой процессор. Например, у него 16 целочисленных регистров вместо восьми и плоская модель памяти вместо сегментированной. В long mode он ни с кем не совместим (нет предшественников).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Понедельник, 11 Июль, 2011 04:59 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
x64-тый поддерживает два режима работы. В long mode это совсем другой процессор. Например, у него 16 целочисленных регистров вместо восьми и плоская модель памяти вместо сегментированной. В long mode он ни с кем не совместим (нет предшественников).
В 32-х разрядных было ровно тоже самое... (за исключением увеличения количества целочисленных регистров). Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы... перекомпилировать/переделывать программы. Довольно долго старые процессоры сосуществуют с новыми, и этого нельзя не учитывать при создании нового процессора. Никто не станет менять кодогенерацию "из любви к искусству"... Лучшей иллюстрацией является Itanium.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Понедельник, 11 Июль, 2011 09:42 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1194
Есть "длинный" IMUL, полностью аналогичный MUL, и "короткий" IMUL.
Отдельный "короткий" MUL не нужен, так как он ничем не будет отличаться от IMUL.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 01:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Теперь понятно.

((2^32 + x)*(2^32 + y)) mod 2^32 = (x*y) mod 2^32


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 01:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
alexus писал(а):
Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы
Невозможно попасть в long mode не переделав компилятор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 06:32 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
alexus писал(а):
Дело очевидно в том, что с появлением новых архитектур, никто не бросается переделывать компиляторы
Невозможно попасть в long mode не переделав компилятор.
Хм?.. Зачем программе попадать в какой-то режим работы процессора? Наверное, это все же задача ядра ОС...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 21:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ядро тоже программа и компилируется компилятором.

Ядро может запустить либо старую 32-разрядную прикладную программу в 32-разрядном legacy mode, или новую 64-разрядную в 64-разрядном long mode. Старую 32-разрядную невозможно запустить как 64-разрядную. Для компиляции в 64-разрядную нужен специально обученный для этого компилятор. Там много чего по-другому. Например, первые четыре аргумента в процедуру передаются через регистры (уже одно только это делает невозможным смешивание 32-разрядного и 64-разрядного кода).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 22:55 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
Ядро тоже программа и компилируется компилятором.
Да, конечно. Но это ничего не меняет в том, что сказано ранее.
Сергей Губанов писал(а):
Ядро может запустить либо старую 32-разрядную прикладную программу в 32-разрядном legacy mode, или новую 64-разрядную в 64-разрядном long mode.
Правильно.
Сергей Губанов писал(а):
Старую 32-разрядную невозможно запустить как 64-разрядную.
Совершенно верно. Загрузчик прочитает заголовок исполняемого файла и... корректно запустит программу.
Сергей Губанов писал(а):
Для компиляции в 64-разрядную нужен специально обученный для этого компилятор.
Тоже верно.
Сергей Губанов писал(а):
Там много чего по-другому. Например, первые четыре аргумента в процедуру передаются через регистры (уже одно только это делает невозможным смешивание 32-разрядного и 64-разрядного кода).
А никто и не говорит про смешивание кода. Речь шла о том, что сохраняются таблицы кодогенерации. Да, раньше, например
Код:
в 16-разрядном режиме:
8B D8        MOV BX,AX
в 32-разрядном:
8B D8        MOV EBX,EAX
в 64-разрядном:
8B D8        MOV RBX,RAX
Код операции сохраняется, меняется только разрядность регистров. Поэтому если в компиляторе используются отлаженные таблицы генерации, то они будут работать и с новой разрядностью операндов. Да, нужно пересчитывать переходы (размер констант тоже вырастет, адреса (ссылки/указатели) станут больше), да, нужно внести изменения в вызовы подпрограмм, да, надо сформировать новый заголовок (PE) исполняемого файла, да, надо откорректировать размеры памяти под стек, код и пр. Но самая тонкая часть работы: преобразование исходного текста в код, не будет делаться с нуля. Постепенно от версии к версии компилятора добавят использование новых команд процессора, сделают дополнительную оптимизацию по скорости, улучшат взаимодействие с новой ОС и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Вторник, 12 Июль, 2011 23:57 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 233
alexus писал(а):
... Но самая тонкая часть работы: преобразование исходного текста в код, не будет делаться с нуля. Постепенно от версии к версии компилятора добавят использование новых команд процессора, сделают дополнительную оптимизацию по скорости, улучшат взаимодействие с новой ОС и т.п.

Да, вот если бы кто-то из понимающих вот так постепенно расширил компилятор ББ на x86-64...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Четверг, 14 Июль, 2011 00:39 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
alexus писал(а):
Речь шла о том, что сохраняются таблицы кодогенерации. Да, раньше, например
Код:
в 16-разрядном режиме:
8B D8        MOV BX,AX
в 32-разрядном:
8B D8        MOV EBX,EAX
в 64-разрядном:
8B D8        MOV RBX,RAX
Код операции сохраняется, меняется только разрядность регистров. Поэтому если в компиляторе используются отлаженные таблицы генерации, то они будут работать и с новой разрядностью операндов.
Приведённый пример кода операции "r1 := r0" не имеет силы ибо очевидно бессмысленно было бы вводить несколько разных кодов для одной и той же операции. А поскольку в legacy mode эта операция есть, то и числовой код её уже фиксирован. В тоже самое время у четырёх разных операций загрузки в регистр из памяти данных формата Int8, Int16, Int32 и Int64 коды разные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Четверг, 14 Июль, 2011 07:47 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
В тоже самое время у четырёх разных операций загрузки в регистр из памяти данных формата 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Пятница, 15 Июль, 2011 00:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Загрузка одного байта:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Пятница, 15 Июль, 2011 04:49 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
Загрузка одного байта:
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

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.
Во втором примере, уберите префикс 66 и получите уже знакомую картину. Сергей, ну, зачем спорить о том, что написано в документации? Не проще ли внимательно посмотреть/прочитать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Пятница, 15 Июль, 2011 11:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Как это уберите префикс?..

Для трёх разных операций сохранения есть три разных кода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассиметрия IMUL и MUL
СообщениеДобавлено: Пятница, 15 Июль, 2011 11:31 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Сергей Губанов писал(а):
Как это уберите префикс?..
Разберитесь, зачем он нужен.
Сергей Губанов писал(а):
Для трёх разных операций сохранения есть три разных кода.
Ладно... тому, кто не желает видеть, очки не помеха... :)


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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB