使用x86汇编将位域封装到32位寄存器中

时间:2015-03-27 12:42:57

标签: assembly x86 att

我目前正在使用汇编程序x86 AT& T中的RNS。我必须将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位寄存器?

1 个答案:

答案 0 :(得分:0)

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

    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