我正在计算 16 个 64 位数字相加的平均值,我认为我已经正确完成了所有加法,但现在我需要弄清楚如何将 64 位数字除以 16,但我被困住了!任何帮助都会非常感谢你。这是到目前为止我的代码。
tableSize EQU 16
sum EQU 0x40000000
average EQU 0x40000008
MOV r8, #14
ADR r0, table
LDR r9, =sum
LDR r10,=average
LDR r1, [r0], #1 ;hi #1
LDR r2, [r0], #1 ;lo #1
SUM
SUB r8, r8, #1
LDR r3, [r0], #1 ;hi #2
LDR r4, [r0], #1 ;lo #2
ADDS r5, r2, r4 ;lo 1 + lo 2 set flags
ADC r6, r1, r3 ;hi 1 + hi 2 + carry
MOV r1, r6
MOV r2, r5
CMP r8, 0
BNE SUM
STR r1, [r9], #8
STR r2, [r9]
average
;stuck here
table DCQ 0x0200200AD00236DD
DCQ 0x00003401AAC4D097
DCQ 0x000001102ACFF200
DCQ 0x00010AA0AD3C66DF
DCQ 0x0000FC3D76400CCB
DCQ 0x000090045ACDD097
DCQ 0x00000FF000004551
DCQ 0x00000000003C66DF
DCQ 0x1000200AD00236DD
DCQ 0x00003401AAC4D097
DCQ 0x000001102ACFF200
DCQ 0x00010AA0AD3C66DF
DCQ 0x1000FC3D76400CCB
DCQ 0x000090045ACDD097
DCQ 0x00000FF000004551
DCQ 0x00000000003C66DF
最佳答案
鉴于 r0
和 r1
中有一个 64 位有符号整数,可以使用以下指令将其除以 16:
lsl r2, r0, #28
asr r0, r0, #4
orr r1, r2, r1, lsr #4
简而言之,我们需要做的就是将两半移位四位,并将r0
的低四位放入r1
的高四位。
要获得无符号除法,应使用 lsr
而不是 asr
。
在这两种情况下,结果都会向负无穷大舍入。要将结果四舍五入到最接近的整数,可以在除法之前将整数加 8。此外,还可以加 15 来四舍五入到正无穷大。
关于assembly - ARM 汇编 SOS 中的 64 位除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633800/