Какова цель инструкции movss с [this] в качестве пункта назначения? - PullRequest
4 голосов
/ 13 июля 2011

Я нашел эту строку в коде, сгенерированном компилятором MSVC из Visual Studio 2008, пытаясь выяснить, что кажется ошибкой компилятора:

movss dword ptr [this], xmm2

Хотя я не думаю, что это связано с ошибкой, которую я искал, я был как то, что бип? Сохранение значения с плавающей запятой (полностью не связанного с this btw) в [this]?

Что именно делает эта строка? Потому что я точно не могу понять это! Или вид разборки играет на меня шутку?

Ответы [ 3 ]

4 голосов
/ 13 июля 2011

Предоставление дополнительных сборок и / или исходного кода действительно помогло бы, но я вижу по крайней мере две возможности:

  1. this это не указатель this, а случайный регистр, указывающий на некоторую область памяти. Дизассемблер назвал его так, потому что он использовался как указатель this ранее в функции или по какой-то другой причине.

  2. this указывает на экземпляр класса, и класс имеет поле с плавающей запятой в качестве первого члена и не имеет виртуальных методов.

3 голосов
/ 13 июля 2011

Согласно руководству Intel по инструкциям x86 , MOVSS копирует младшие 32 бита регистра XMM. (Каждый XMM-регистр имеет длину 128 битов.)

В то время как инструкция называется «перемещать скалярное значение с плавающей запятой одинарной точности», вы должны воспринимать ее как «перемещение 32-битного значения». Инструкция не заботится, являются ли данные на самом деле плавающей точкой или нет; он просто копирует биты без интерпретации.

В вашем случае инструкция копирует младшие 32 бита XMM2 в область памяти, указанную this. Я думаю, это потому, что ваш компилятор использует XMM2 в качестве регистра хранения (вместо использования общего регистра, такого как EAX).

3 голосов
/ 13 июля 2011

Регистры xmm не обязательно содержат значения с плавающей запятой. Это регистры SIMD шириной 128 бит, что в основном означает, что одно или несколько значений могут храниться в регистре SIMD; обычные конфигурации: 8 16-битных, 4 32-битных, 4 числа с плавающей запятой, 2 двойных; и т.д.

Тем не менее, компилятор может свободно помещать туда все, что ему нравится, и до тех пор, пока первый элемент «this» будет 32-битным, вы хороши.

...