使用 x86 汇编将位域打包到 32 位寄存器中

Pack bitfields into 32 bit register using x86 assembly

我目前正在 AT&T 的 x86 汇编程序中使用 RNS。我必须将 5 个余数放入一个寄存器,%eax。一段代码:

.macro division number
        mov [=10=], %ecx

    loop_getremainders:
        mov [=10=], %edx
        mov number, %eax
        mov dividers(,%ecx,4), %ebx
        div %ebx
        mov %edx, remainders(,%ecx,4)
        inc %ecx
        cmp , %ecx
        jne loop_getremainders
        int [=10=]x80
.endm

.section .data
     number: .long 158    
     remainders: .long 0,0,0,0,0
     dividers: .long 7,15,31,127,8192

.section .text
    .global _start
    _start:
        division number
        mov , %eax
        mov [=10=], %ebx
        int [=10=]x80

我知道要用二进制写 7 我需要 3 位、15 - 4 位等。我想将它们的每个剩余部分写在一个 %eax 中,"linked" 按此顺序: 111 1111 11111 1111111 1111111111111 (32bits, spaces for better presentation) 如何把十进制转二进制,把这5个数放到1个32bit的寄存器中?

看起来 shrd 指令在这种情况下会有所帮助。 要循环执行此操作,您可能需要制作一个包含移位量的 table,因为您似乎需要 345713。像这样:

    xor %eax, %eax                          # accumulator
    movl , %edx                           # counter
loop_shift:
    movb shifts(%edx), %cl                  # the shift amount
    movl remainders(, %edx, 4), %ebx        # next remainder
    shrd %cl, %ebx, %eax                    # shift in the bits
    subl , %edx
    jnc loop_shift
.data
    shifts: .byte 3, 4, 5, 7, 13