ARM Assebmly 算法中的 IEEE.754 给出了意想不到的结果

IEEE.754 in ARM Assebmly algorithm giving unexpected results

提问人:faliboiii 提问时间:10/20/2023 更新时间:10/20/2023 访问量:46

问:

我正在尝试实现一种简单的算法,以使用 IEEE.754 浮点表示法添加到浮点数中。我在算法上走得很远,但它并没有给我预期的结果

这就是算法到目前为止的样子。此时只尝试添加 1.0 + 1.0。预期结果是 R0 寄存器在命中 BX lr 时0x40000000,这是程序的结束。我现在得到的结果是一个令人失望的0x40800000

我编译: arm-none-eabi-as -g -o float.o float.s arm-none-eabi-ld -0 浮点浮点.o

然后我和 Qemu 一起运行 qemu-arm -g 30005 ./part5

并使用 GDB 逐步执行 gdb-multiarch 多架构 文件 ./float 目标远程: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 值

程序集 浮点 GDB

评论


答:

3赞 Eric Postpischil 10/20/2023 #1

添加和规范化后,代码不会删除前导 1 位。

评论

0赞 faliboiii 10/20/2023
哇,就这样它奏效了。非常感谢你,令人印象深刻的是你怎么这么快就看到了它!