Инструкции SSE, как правило, не поддерживают немедленные действия, за исключением некоторых редких инструкций с однобайтовым немедленным для управления их работой.Таким образом, вам необходимо:
- сохранить
myfloat
в какой-нибудь соседней области памяти - создать операнд памяти, ссылающийся на эту область
Оба шага просты,Для первого шага я бы просто использовал начало memory
и позволил бы коду начать сразу после этого.Обратите внимание, что в этом случае вам необходимо обязательно вернуть указатель на начало функции, а не на начало memory
.Возможны и другие решения.Просто убедитесь, что myfloat
хранится в пределах ± 2 ГБ от кода.
Чтобы сгенерировать операнд, пересмотрите руководства Intel.Требуемый режим адресации - это 32-битный RIP-операнд.Это генерируется с mod = 0, r / m = 5. Смещение - это 32-разрядное число со знаком, которое добавляется к значению RIP прямо в конце инструкции (это то, откуда берется +4, так как нужно учитывать множитель).в длину смещения).
Таким образом, мы имеем что-то вроде:
memory[i++] = 0xf2; /*******************/
memory[i++] = 0x0f; /* MOVSD xmm0, m64 */
memory[i++] = 0x10; /*******************/
memory[i++] = 0005 | xmm(0) << 3; /* mod = 0, r/m = 5: [rip + disp32] */
*(int *)(memory + i) = memory + i + 4 - addr_of_myfloat;
i += 4;
memory[i++] = 0xc3; /* RET */
Обратите внимание, что префикс REX здесь не нужен.