繁体   English   中英

x86 组件中的 SSE2 寄存器

[英]SSE2 registers in x86 assembly

我有以下代码:

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。

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

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

有关良好的 SSE 参考,请参阅 英特尔内部指南 另请查看英特尔软件开发手册 但在此之前,您应该了解基础知识,例如[...]表示 memory 操作数及其含义。 如果你不明白这一点,你就没有机会掌握汇编编程。 汇编程序的手册应该对此有一些详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM