x86 程序集中的 SSE2 寄存器

Posted

技术标签:

【中文标题】x86 程序集中的 SSE2 寄存器【英文标题】:SSE2 registers in x86 assembly 【发布时间】:2020-12-26 12:11:17 【问题描述】:

我有以下代码:

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 计算这个数字的阶乘。 “阶乘”部分尚未完成,我只想检查这些寄存器是否获得正确的值。所以问题是当我尝试movups xmm0, [eax] 时出现分段错误,因此我的问题是将这个数字传输到 sse2 寄存器的正确方法是什么?我找不到任何好的资源来学习如何处理 SSE2,我会很感激任何提示。我在 Linux 上工作。

【问题讨论】:

如何将值从eax 复制到xmm0?删除[] 不起作用,然后我得到error: invalid combination of opcode and operands 谢谢,如果您愿意,可以发布您的 cmets 作为答案,以便我接受;) 【参考方案1】:

movups xmm0, [eax] 从 eax 中的地址加载 16 个字节并将它们存储到 xmm0 中。但是:在您的代码中,eax 似乎包含一个值,而不是一个地址。您确定要将eax 解释为地址并从内存中加载吗?这同样适用于您的第二个movups xmm0, [ecx]

如果要将值作为整数移动到xmm0,请使用movd。如果要将其转换为单精度浮点数,请使用cvtsi2ss xmm0, eax。如果要将其转换为双精度浮点数,请使用cvtsi2sd xmm0, eax

如需良好的 SSE 参考,请参阅 Intel Intrinsics Guide。另请查看Intel Software Development Manuals。但在此之前,您应该了解一些基础知识,例如 [...] 表示内存操作数及其含义。如果你不明白这一点,你将没有任何机会掌握汇编编程。你的汇编器手册应该有一些细节。

【讨论】:

以上是关于x86 程序集中的 SSE2 寄存器的主要内容,如果未能解决你的问题,请参考以下文章

如何在x86程序集中正确索引数组

如何在 x86(32 位)程序集中将无符号整数转换为浮点数?

将 TBB 与 SSE2 内在函数混合

将 64 位整数加载到双精度 SSE2 寄存器的最佳方法?

SSE/SSE2 指令的打包和解包数据?

通过绕行特定地址获取寄存器值[Windows上的x86程序集]