Упакуйте битовые поля в 32-битный регистр, используя сборку x86

В данный момент я работаю с RNS на ассемблере x86 AT&T. Мне нужно поместить 5 остатков в один регистр, %eax. Часть кода:

.macro division number
        mov $0, %ecx

    loop_getremainders:
        mov $0, %edx
        mov number, %eax
        mov dividers(,%ecx,4), %ebx
        div %ebx
        mov %edx, remainders(,%ecx,4)
        inc %ecx
        cmp $5, %ecx
        jne loop_getremainders
        int $0x80
.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 $1, %eax
        mov $0, %ebx
        int $0x80

Я знаю, что для записи 7 в двоичном формате мне нужно 3 бита, 15 - 4 бита и т. д. Я хочу записать каждый остаток в один %eax, «связанный» в следующем порядке: 111 1111 11111 1111111 1111111111111 (32 бита, пробелы для лучшего представления) Как изменить его с десятичного на двоичный и поместить эти 5 чисел в 1 32-битный регистр?


person 1kka    schedule 27.03.2015    source источник


Ответы (1)


Похоже, в этом случае поможет инструкция shrd. Чтобы сделать это в цикле, вам, вероятно, потребуется создать таблицу, содержащую суммы смен, поскольку вам, похоже, нужны 3, 4, 5, 7, 13. Что-то вроде этого:

    xor %eax, %eax                          # accumulator
    movl $5, %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 $1, %edx
    jnc loop_shift
.data
    shifts: .byte 3, 4, 5, 7, 13
person Jester    schedule 27.03.2015
comment
Подскажите, как распаковать эти остатки из регистра %eax в массив? абв: .byte 0, 0, 0, 0, 0 - person 1kka; 11.04.2015