![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос знатокам асм
Dmk © (2016-02-26 17:44:00)Почему если указать например такой код:
movd mm0, eax, то Delphi заменяет его на такой:movq mm0, rax. Постоянно такая «лажа». Глюк или настройки? Может чего не знаю?
invis (2016-02-26 20:23:00) [1]
> Мне старшие биты mm0 нужны, а он мне их чистит.
Судя по описанию, в любом случае будет чистить.
(* MOVD instruction when destination operand is MMX technology register *)
DEST[31:0] = SRC;
DEST[63:32] = 00000000H;
http://www.tptp.cc/mirrors/siyobik.info/instruction/MOVD%252FMOVQ.html
Rouse_ (2016-02-26 19:48:00) [2]Все таки вангую han_malign-а :)
У него получается популярно и просто все обьяснить :)
Rouse_ (2016-02-26 19:43:00) [3]Ну как-же так? Я ж еще в четвертом посте заострил на этом внимание :)
Dmk (2016-02-26 19:34:00) [4]>Я знаю что такое REX префикс и прочие ModRM/SIB
Дык я с поклоном :) Без намеков всяких.
На самом деле не важно какой из mmX, просто непонятно почему он заменяет на свой вариант.
Rouse_ (2016-02-26 19:32:00) [5]Вообще, если честно я очень сильно вангую в эту вету han_malign-а, потому что я умею только технически разьяснять, а он по правильному, чтоб ты понял :)
Rouse_ (2016-02-26 19:28:00) [6]Я знаю что такое REX префикс и прочие ModRM/SIB
movd mm0, ecx
В ХЕ4 работает без выдачи сообщения, как у тебя.
Это первое.
Второе:
байткод db $0F, $6E, $E1 соответствует регистру mm4, а ты хотел работать с mm0.
Для этого нужно писать вот так:
db $0F, $6E, $C1
Третье - впрочем с третьим я пока обожду.
Dmk (2016-02-26 19:14:00) [7]Если без REX префикса забросить, то все нормально работает. Компилятор чудит.
db $0F, $6E, $E1 - так работает как MOVD mm0, ecx. А может он тупо REX везде подставляет из-за 64 битного режима.
Из интеловского руководства:
0F 6E /r
MOVD mm, r/m32
RM V/V MMX Move doubleword from r/m32 to mm.
REX.W + 0F 6E /r
MOVQ mm, r/m64
RM V/N.E. MMX Move quadword from r/m64 to mm.
Dmk (2016-02-26 19:12:00) [8]XE6.
Rouse_ (2016-02-26 19:07:00) [9]Версия дельфи?
Dmk (2016-02-26 19:06:00) [10]А если написать movd mm0, ecx, то операнд сайз мисматч получается.
Rouse_ (2016-02-26 19:05:00) [11]А что ты хотел?
Никто не говорил что будет легко :)
Dmk (2016-02-26 19:00:00) [12]я его прошу сделать MOVD, т.е. uint32, а он мне 64 бита запихивает MOVQ, т.е. uint64. Замена происходит MOVD на MOVQ. В этом и проблема. Мне старшие биты mm0 нужны, а он мне их чистит.
Rouse_ (2016-02-26 18:59:00) [13]ЗЫ: судя по твоей картинке AColor и APixel входные параметры.
Ты ухохочешся их через по другому (не считая стека) передавать.
Пусть они хоть байтовыми будут - CL вместо RCX ты не получишь.
Rouse_ (2016-02-26 18:49:00) [14]Абсолютно логичный код. В чем проблема именно?
Ты же не изумляешся когда у тебя булевая переменная в целом регистре идет?
Dmk (2016-02-26 18:29:00) [15]http://hkar.ru/GYBv
AColor и APixel соответственно ColorRef на входе в функцию. т.е. uint32
Rouse_ (2016-02-26 17:51:00) [16]Байткот покажи, мошт там дизасм косячит