Перемещение числа четверного слова в регистры xmm

Я пытаюсь переместить число из 64-битного регистра в регистр xmm для выполнения арифметических операций. Мои мысли были такими:

movq xmm1, r14

В моей программе r14 держит счетчик, и мне нужно, чтобы он был перемещен в xmm1, чтобы я мог разделить его на сумму чисел, которые я сохранил в xmm0. А потом отображать.

Когда я выполняю код, он сохраняет 0 в xmm1.

Кто-нибудь, пожалуйста, помогите.


person GolfinGamer    schedule 04.09.2013    source источник
comment
SSE2 не поддерживает перемещение из регистров общего назначения в регистры XMM, поэтому инструкция должна быть недопустимой. Во что он компилируется?   -  person DocMax    schedule 04.09.2013
comment
@DocMax Все компилируется и собирается правильно. Единственное, число в r14 не сохраняется в xmm1, поэтому я просто получаю 0,000 в xmm1.   -  person GolfinGamer    schedule 04.09.2013
comment
Моя ошибка. Теперь я вижу, что MOVQ задокументирован в двух местах справочника инструкций Intel. Я просто поместил 0x123456789abcdef0 в r14, выполнил вашу строку, и нижние 64 бита xmm1 заполнены правильно. Я в тупике.   -  person DocMax    schedule 04.09.2013
comment
@DocMax Что вы имеете в виду, что он заполнен правильно? Может ли быть что-то еще, вызывающее эту проблему в моей программе?   -  person GolfinGamer    schedule 04.09.2013
comment
Я имею в виду, что XMM1 содержит (в виде 8 16-битных значений) 0:0:0:0:1234:5678:9abc:def0. Если вы видите, что r14 не равен нулю, а xmm1 равен 0 после этой строки, я не уверен, что еще это могло быть.   -  person DocMax    schedule 04.09.2013


Ответы (1)


Я создал test.asm как:

section .code
global _start
_start:
    mov r14,0x123456789abcdef0
    movq xmm1, r14
    int 3

Скомпилировано и связано с:

nasm.exe -f win64 -o test.obj test.asm
link.exe test.obj /entry:_start /subsystem:console

И запускал его под 64-битной WinDbg. Когда он попал в int 3, WinDbg показал регистры как:

r14      123456789abcdef0
xmm1     0.000000e+000: 0.000000e+000: 5.690457e-028:-7.811515e-023
xmm1/0   9abcdef0
xmm1/1   12345678
xmm1/2   0
xmm1/3   0
xmm1l    1234:5678:9abc:def0
xmm1h    0:0:0:0

... и, набрав все это, возможно ли, что вы смотрите на xmm1 как на число с плавающей запятой, а не на целочисленные значения?

person DocMax    schedule 04.09.2013
comment
Возможно, я использую xmm1 как число с плавающей запятой. Если это так, я должен использовать другую строку кода или можно преобразовать? - person GolfinGamer; 04.09.2013
comment
Неважно. Я нашел ответ, но спасибо за идею. Я только что использовал cvtsi2sd xmm1, r14, и он отлично работает. Даже не думал о том, что целое число с плавающей запятой не работает должным образом. - person GolfinGamer; 04.09.2013
comment
Я написал тот же комментарий через несколько минут после вас. :) Рад, что у вас все получилось. - person DocMax; 04.09.2013