汇编——SSE打包整数

SSE也可以进行整数向量的加法,示例如下:

;sse_integer.asm
extern printf

section .data
    dummy db 13
align 16
    pdivector1  dd  1
                dd  2
                dd  3
                dd  4
    pdivector2  dd  5
                dd  6
                dd  7
                dd  8

fmt1    db      "Packed Integer Vector 1: %d, %d, %d, %d", 10, 0
fmt2    db      "Packed Integer Vector 2: %d, %d, %d, %d", 10, 0
fmt3    db      "Sum Vector: %d, %d, %d, %d", 10, 0
fmt4    db      "Reverse of Sum Vector: %d, %d, %d, %d", 10, 0

section .bss
alignb 16
    pdivector_res   resd    4
    pdivector_other resd    4

section .text
    global main

main:
push rbp
mov rbp, rsp

; 打印向量1
    mov rsi, pdivector1
    mov rdi, fmt1
    call printpdi
; 打印向量2
    mov rsi, pdivector2
    mov rdi, fmt2
    call printpdi

; 添加两个对齐的双整数向量
    movdqa  xmm0, [pdivector1]
    paddd   xmm0, [pdivector2]
; 将结果保存在内存中
    movdqa  [pdivector_res], xmm0
; 打印内存中的向量
    mov     rsi, pdivector_res
    mov     rdi, fmt3
    call    printpdi

; 将内存向量复制到xmm3
    movdqa  xmm3, [pdivector_res]
; 从xmm3中提取打包值
    pextrd  eax, xmm3, 0
    pextrd  ebx, xmm3, 1
    pextrd  ecx, xmm3, 2
    pextrd  edx, xmm3, 3
; 以相反顺序插入xmm0
    pinsrd  xmm0, eax, 3
    pinsrd  xmm0, ebx, 2
    pinsrd  xmm0, ecx, 1
    pinsrd  xmm0, edx, 0
; 打印反转后的向量
    movdqa  [pdivector_other], xmm0
    mov     rsi, pdivector_other
    mov     rdi, fmt4
    call    printpdi

; 退出
mov rsp, rbp
pop rbp
ret

;打印函数------------------------------------
printpdi:
push rbp
mov rbp, rsp
    movdqa xmm0, [rsi]
    ; 从xmm0中提取打包值
        pextrd esi, xmm0, 0
        pextrd edx, xmm0, 1
        pextrd ecx, xmm0, 2
        pextrd r8d, xmm0, 3
        mov rax,0
        call printf
leave
ret

以上代码展现了两个整数向量的相加操作,并且将结果向量反向写进一个向量,然后输出。结果如下:
运行结果示例
需要注意的几个指令整理如下:

  • movdqa 把值复制到寄存器中,这个指令可以一下复制4个4字节的整型,字节/字/双字/四字有各自版本相同功能;
  • paddd 这个指令求寄存器和内存之和,这里应该不是pad-dd而是p-add-d,最后的那个d表示相加的是4字节的整型,字节/字/双字/四字有各自版本相同功能;
  • pextrd 这个指令把xmm寄存器中的指定双字提取出来,放到寄存器里,字节/字/双字/四字有各自版本相同功能;
  • pinsrd 这个指令和pextrd功能相反,字节/字/双字/四字有各自版本相同功能;
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾昵猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值