使用 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,因为您似乎需要 3
、4
、5
、7
、13
。像这样:
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
我目前正在 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,因为您似乎需要 3
、4
、5
、7
、13
。像这样:
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