Assembly x86汇编中的SSE2寄存器
我有以下代码:Assembly x86汇编中的SSE2寄存器,assembly,x86,sse2,Assembly,X86,Sse2,我有以下代码: global _start section .text input: mov edx, buffer_size mov ecx, buffer mov ebx, 0 ; stdin mov eax, 3 ; read int 0x80 mov ecx, eax
global _start
section .text
input:
mov edx, buffer_size
mov ecx, buffer
mov ebx, 0 ; stdin
mov eax, 3 ; read
int 0x80
mov ecx, eax ; number of read bytes
mov eax, 0 ; clear eax
mov ebx, 10
lea esi, [buffer]
convert:
mov edx, 0
mov dl, [esi]
sub dl, '0'
push edx
mul ebx ; edx = eax * ebx
pop edx
add eax, edx ; store result in eax
inc esi
dec ecx
cmp ecx, 1 ; conversion to int finished
jnz convert
xorpd xmm0, xmm0
movups xmm0, [eax] ; move number to SSE2 register
mov ecx, 1
movups xmm2, [ecx]
xorpd xmm1, xmm1 ; clear xmm1
movups xmm1, xmm2
factorial:
mulpd xmm1, xmm0 ; result in xmm1
subpd xmm0, xmm2
jnz factorial
基本上,我从用户那个里得到这个数字,然后我想用SSE2计算这个数字的阶乘。“阶乘”部分还没有完成,我只想检查这些寄存器是否得到正确的值。所以问题是当我尝试
movupsxmm0[eax]
时,我得到了分段错误,因此我的问题是,什么是将这个数字传输到sse2寄存器的正确方法?我找不到任何好的来源来学习如何处理SSE2,如果有任何提示,我将不胜感激。我在Linux上工作。movupsxmm0,[eax]
从eax中的地址加载16个字节,并将它们存储到xmm0
中。但是:在您的代码中,eax
似乎包含一个值,而不是一个地址。是否确实要将eax
解释为地址并从内存加载?这同样适用于第二个movupsxmm0,[ecx]
如果要将值作为整数移动到xmm0
,请使用movd
。如果要将其转换为单精度浮点,请使用cvtsi2ss xmm0,eax
。如果要将其转换为双精度浮点,请使用cvtsi2sd xmm0,eax
有关良好的SSE参考,请参阅。另外,请查看。但在此之前,您应该了解一些基础知识,比如表示内存操作数的
[…]
,以及这意味着什么。如果您不理解这一点,您就没有机会掌握汇编编程。汇编程序手册中应该有一些详细信息。movupsxmm0,[eax]
从eax中的地址加载16个字节,并将它们存储到xmm0
中。但是:在您的代码中,eax
似乎包含一个值,而不是一个地址。是否确实要将eax
解释为地址并从内存加载?这同样适用于第二个movupsxmm0,[ecx]
如果要将值作为整数移动到xmm0
,请使用movd
。如果要将其转换为单精度浮点,请使用cvtsi2ss xmm0,eax
。如果要将其转换为双精度浮点,请使用cvtsi2sd xmm0,eax
有关良好的SSE参考,请参阅。另外,请查看。但在此之前,您应该了解一些基础知识,比如表示内存操作数的
[…]
,以及这意味着什么。如果您不理解这一点,您就没有机会掌握汇编编程。您的汇编程序手册应该有一些关于这方面的详细信息。我如何将值从eax
复制到xmm0
?删除[]
不起作用,然后我得到错误:操作码和操作数的组合无效
谢谢,如果您愿意,您可以将您的评论作为答案发布,以便我可以接受;)如何将值从eax
复制到xmm0
?删除[]
不起作用,然后我得到错误:操作码和操作数的组合无效
谢谢,如果您愿意,您可以将您的评论作为答案发布,以便我可以接受;)