gpt4 book ai didi

assembly - 如何提取位于 AL 中定义的索引位置的字节

转载 作者:行者123 更新时间:2023-12-04 18:33:04 26 4
gpt4 key购买 nike

问题陈述:需要从ymm0寄存器中提取位于其值在寄存器AL中的位置的字节。

我的方法:(相当难看):

        ; Set XMM1 to be a "shift one byte by right" mask        ; XMM1 : 000F0E0D0C0B0A090807060504030201        cmp al,15   ; check if in lower xmmword of ymm0 or higher        ja  is_in_higher        xor CX,CX        mov CL,AL    loop_for_next :       vpextrb edx,ymm0,ymm0,0       vpshufb xmm0,xmm0,xmm1  ; right shifts xmm0 as mask       loop loop_for_next    ..    is_in_higher :        vperm2i128 ymm0,ymm0,ymm0,01 ; swaps upper 128 to lower 128    jmp loop_for_next

有没有更优雅的方式来做到这一点?任何建议表示赞赏。挑战的症结在于 VPEXTRB 仅采用立即索引值,而不是 CL(或 AL)寄存器作为索引值

谢谢...

最佳答案

您的代码需要 AVX2 (vperm2i128) 而我无法对其进行测试,因为我只有 AVX。无论如何,您的代码对不需要循环的任务使用循环。我的解决方案使用一个简单的查找表和 vpshufb(需要 SSSE3)指令来重新排序字节。在 YASM 中测试。

代码如下:

[bits 64]section .textglobal _start_start:set_example_values:        mov     al,0x1e                  ; byte index: 0...31, 0x00...0x1f        vmovaps ymm0,[example_data]      ; define the datacode_starts_here:        cmp     al,15        jna     no_need_to_reorder_octalwords        vperm2f128 ymm0,ymm0,ymm0,0x81   ; reorder ymm0. zero top 16 bytes.no_need_to_reorder_octalwords:        and     eax,15        shl     eax,4        vmovaps xmm1,[rax+shuffle_table] ; each byte is an index, f0 = set to 0.        vpshufb xmm0,xmm1                ; copy the right byte to byte 0 of xmm0.                                         ; zero the rest bytes of xmm0.        movq    rdx,xmm0                 ; copy to rdx.        ....dataalign 32;                  f e d c b a 9 8 7 6 5 4 3 2 1 0example_data do 0xafaeadacabaaa9a8a7a6a5a4a3a2a1a0;                 1f1e1d1c1b1a19181716151413121110             do 0xbfbebdbcbbbab9b8b7b6b5b4b3b2b1b0shuffle_table   dd 0xf0f0f000, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f001, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f002, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f003, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f004, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f005, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f006, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f007, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f008, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f009, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00a, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00b, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00c, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00d, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00e, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0                dd 0xf0f0f00f, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0

关于assembly - 如何提取位于 AL 中定义的索引位置的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com