汇编如何将两个8位数据合并成一个16位且为(a7b7a6b6a5b5……a0b0)?

发布于 2022-09-07 23:19:29 字数 49 浏览 12 评论 0

汇编如何将两个8位数据合并成一个16位且为(a7b7a6b6a5b5……a0b0)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

油饼 2022-09-14 23:19:29
short foo(char a_8,char b_8) {
    short a_16=a_8,b_16=b_8;
    short a=0,b=0,result;
    for(short i=0,mask=1;i<8;i++){
        a+=(a_16&mask)<<i;
        b+=(b_16&mask)<<i;
        printf("%d,%d\n",a_16&mask,a_16);
        mask<<=1;
    }
    result=a<<1+b;
    return result;
}

gcc

foo(char, char):
        push    rbp
        mov     rbp, rsp
        mov     eax, edi
        mov     edx, esi
        mov     BYTE PTR [rbp-20], al
        mov     eax, edx
        mov     BYTE PTR [rbp-24], al
        movsx   ax, BYTE PTR [rbp-20]
        mov     WORD PTR [rbp-10], ax
        movsx   ax, BYTE PTR [rbp-24]
        mov     WORD PTR [rbp-12], ax
        mov     WORD PTR [rbp-2], 0
        mov     WORD PTR [rbp-4], 0
        mov     WORD PTR [rbp-6], 0
        mov     WORD PTR [rbp-8], 1
.L3:
        cmp     WORD PTR [rbp-6], 7
        jg      .L2
        movzx   eax, WORD PTR [rbp-10]
        and     ax, WORD PTR [rbp-8]
        movsx   edx, ax
        movsx   eax, WORD PTR [rbp-6]
        mov     ecx, eax
        sal     edx, cl
        mov     eax, edx
        mov     edx, eax
        movzx   eax, WORD PTR [rbp-2]
        add     eax, edx
        mov     WORD PTR [rbp-2], ax
        movzx   eax, WORD PTR [rbp-12]
        and     ax, WORD PTR [rbp-8]
        movsx   edx, ax
        movsx   eax, WORD PTR [rbp-6]
        mov     ecx, eax
        sal     edx, cl
        mov     eax, edx
        mov     edx, eax
        movzx   eax, WORD PTR [rbp-4]
        add     eax, edx
        mov     WORD PTR [rbp-4], ax
        movsx   eax, WORD PTR [rbp-8]
        add     eax, eax
        mov     WORD PTR [rbp-8], ax
        movzx   eax, WORD PTR [rbp-6]
        add     eax, 1
        mov     WORD PTR [rbp-6], ax
        jmp     .L3
.L2:
        movsx   edx, WORD PTR [rbp-2]
        movsx   eax, WORD PTR [rbp-4]
        add     eax, 1
        mov     ecx, eax
        sal     edx, cl
        mov     eax, edx
        mov     WORD PTR [rbp-14], ax
        movzx   eax, WORD PTR [rbp-14]
        pop     rbp
        ret

clang

foo(char, char):                               # @foo(char, char)
        push    rbp
        mov     rbp, rsp
        mov     al, sil
        mov     cl, dil
        mov     byte ptr [rbp - 1], cl
        mov     byte ptr [rbp - 2], al
        movsx   esi, byte ptr [rbp - 1]
        mov     dx, si
        mov     word ptr [rbp - 4], dx
        movsx   esi, byte ptr [rbp - 2]
        mov     dx, si
        mov     word ptr [rbp - 6], dx
        mov     word ptr [rbp - 8], 0
        mov     word ptr [rbp - 10], 0
        mov     word ptr [rbp - 14], 0
        mov     word ptr [rbp - 16], 1
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        movsx   eax, word ptr [rbp - 14]
        cmp     eax, 8
        jge     .LBB0_4
        movsx   eax, word ptr [rbp - 4]
        movsx   ecx, word ptr [rbp - 16]
        and     eax, ecx
        movsx   ecx, word ptr [rbp - 14]
        shl     eax, cl
        movsx   edx, word ptr [rbp - 8]
        add     edx, eax
        mov     si, dx
        mov     word ptr [rbp - 8], si
        movsx   eax, word ptr [rbp - 6]
        movsx   edx, word ptr [rbp - 16]
        and     eax, edx
        movsx   ecx, word ptr [rbp - 14]
        shl     eax, cl
        movsx   edx, word ptr [rbp - 10]
        add     edx, eax
        mov     si, dx
        mov     word ptr [rbp - 10], si
        movsx   eax, word ptr [rbp - 16]
        shl     eax, 1
        mov     si, ax
        mov     word ptr [rbp - 16], si
        mov     ax, word ptr [rbp - 14]
        add     ax, 1
        mov     word ptr [rbp - 14], ax
        jmp     .LBB0_1
.LBB0_4:
        movsx   eax, word ptr [rbp - 8]
        movsx   ecx, word ptr [rbp - 10]
        add     ecx, 1
        shl     eax, cl
        mov     dx, ax
        mov     word ptr [rbp - 12], dx
        movsx   eax, word ptr [rbp - 12]
        pop     rbp
        ret
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文