Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос знатокам асм


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]

Байткот покажи, мошт там дизасм косячит


Наверх

Титульная страница Поиск, карта сайта Написать письмо