Руководство NASM говорит об этих макросах, но, насколько я понимаю, не объясняет, как их использовать. Раздел 3.4.6 гласит:
Плавающие точечные константы приемлемы только в качестве аргументов
DB
,DW
,DW
,DQ
,DT
, иDO
или в качестве аргументов специальных операторов__?float8?__
__?float16?__
>,__?bfloat16?__
,__?float32?__
,__?float64?__
,__?float80m?__
,__?float80e?__
,__?float128l?__
и__?float128l?__
и <4908037042015><260420153
Сначала я подумал, что это связано с использованием констант с плавающей запятой вне раздела данных. Но когда я попробовал mov xmm0, __?float32?__(1.23)
, я получил ошибку «Неверная комбинация кода операции и операндов». В конце концов я увидел, что foo: dd __?float32?__(1.23)
работает. Хотя мне это кажется странным; если вы можете сделать dd 1.23
напрямую, какой смысл в этих макросах? Одна из возможностей может заключаться в том, что вам нужно определить, например, число с плавающей запятой одинарной точности в четверном слове. Это действительно единственное применение этих макросов, или я использую их неправильно?
Ах да, я только что попробовал это с
eax
, и это сработало. Довольно глупо с моей стороны не попробовать это задним числом ... Я не знал, что вы вообще не можете помещать литералы в регистрыxmm
(я пытаюсь изучить векторы и SIMD). В любом случае, вы дали мне ответ, который я искал.@mediocrevegetable1: Также имейте в виду, что
mov
может никогда не иметь назначения XMM (felixcloutier.com/x86/mov), так что это еще одна вещь, которую нужно проверить в следующий раз, когда инструкция не соберется. Инструкции, которые могут записывать регистр XMM, включаютmovd xmm, r/m32
,movdqu xmm, xmm/mem
,vbroadcastss xmm, xmm/mem
.Ок, я этого не понял. Инструкцию поищу, спасибо за ссылку.
@mediocrevegetable1: Обновил мой ответ другим правдоподобным и, может быть, интересным вариантом использования: mov-немедленно в память или дальнейшие математические вычисления с константным выражением для битового шаблона float32.
Спасибо за обновления. Я не думал об их использовании для этого, особенно с битовым сдвигом. Интересный.