我目前正在使用汇编程序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位寄存器?
答案 0 :(得分:0)
在这种情况下看起来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