我正在尝试实现一个简单的算法,使用IEEE.754浮点数表示法对浮点数进行加法运算。我已经在该算法中取得了相当大的进展,但它并没有给我给予预期的结果
这就是目前为止算法的情况。此时只尝试添加1.0 + 1.0。预期结果是R 0寄存器在命中BX lr时为0x 40000000,这是程序的结束。我现在得到的结果是令人失望的0x 40800000。
我用以下代码编译:arm-none-eabi-as -g-o float.o float.s arm-none-eabi-ld -0 float float.o
然后我运行与Qemu qemu-arm -g 30005。/第5部分
并使用gdb gdb-multiarch文件逐步完成。/float target remote:30005
使用gdb正常执行步骤
.section .data
@ Constants
exponent_mask: .word 0x7F800000
@ The two numbers we want to add
num1: .word 0x3f800000
num2: .word 0x3f800000
.section .text
.global main
main:
@ Load numbers directly
LDR r0, =num1
LDR r0, [r0]
LDR r1, =num2
LDR r1, [r1]
@ Load constant for exponent extraction just once
LDR r12, =exponent_mask
LDR r12, [r12]
@ Extract exponents
AND r2, r0, r12
AND r3, r1, r12
LSR r2, r2, #23
LSR r3, r3, #23
@ Clear the exponent parts
BIC r4, r0, r12
BIC r5, r1, r12
@ Add the implicit 1 to the fractions
ORR r4, r4, #0x00800000
ORR r5, r5, #0x00800000
@ Align exponents and adjust fractions
CMP r2, r3
BGT largerExponent
@ r3 has larger exponent
SUB r6, r3, r2
LSR r4, r4, r6
MOV r2, r3
B fractionsAligned
largerExponent:
SUB r6, r2, r3
LSR r5, r5, r6
fractionsAligned:
ADD r4, r4, r5 @ Add aligned fractions
@ Normalize if needed
TST r4, #0x01000000
BEQ doneNormalize
LSR r4, r4, #1
ADD r2, r2, #1
doneNormalize:
@ Construct the final number
LSL r2, r2, #23
ORR r0, r4, r2
BX lr
字符串
在程序结束时,寄存器值如下所示:Reg values
1条答案
按热度按时间ssgvzors1#
在添加和规范化之后,您的代码不会删除前导1位。