(ARM组件)向右移位寄存器1将所有位设置为零

时间:2014-04-23 23:24:16

标签: assembly arm bit-shift

我觉得我疯了。我试图在ARM组件中编写一个模拟硬件浮点加法的函数。我有一个函数float simulate_fp_add(float, float),目前看起来像这样:

    .global simulated_fp_add
    .type simulated_fp_add, %function
simulated_fp_add:
    push {r3, r4, r5, r6, lr}

    mov r0, r0, lsr #1

    pop {r3, r4, r5, r6, pc}

我的主文件(简化版)目前只用两个任意浮点调用我的AR​​M函数,并以十进制和二进制形式输出结果:

#include <stdio.h>

float simulated_fp_add(float, float);
void prt_bin(unsigned int, unsigned int);

int main() {
    float x,y,z;
    unsigned int a,b,c;

    union
    {
       float f;
       unsigned int i;
    } u;

    x = 125;
    y = 0.5;

    u.f = x; 
    a = u.i;

    u.f = y;
    b = u.i;

    c = simulated_fp_add( a, b );
    u.f = c;

    printf("simulated_fp_add(%d, %d) = %f\n", a, b, u.f);

    printf("result in binary: ");
    prt_bin(c, 32);
    putchar('\n');

    return 0;
}

void prt_bin(unsigned int value, unsigned int length) {
    int i;
    for (i=(length-1); i>=0; i--) {
       if ((value >> i) & 1)
          putchar('1');
       else
          putchar('0');
    }
}

移除换档线的输出:

simulated_fp_add(1123680256, 1056964608) = 125.000000
result in binary: 01000010111110100000000000000000

带有移位的输出:

simulated_fp_add(1123680256, 1056964608) = 0.000000
result in binary: 00000000000000000000000000000000

我所有的simulation_fp_add函数都是将r0中的float移位到右边1,但结果为零?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

你有一些对你不利的事情。

float simulated_fp_add(float, float);

c = simulated_fp_add( a, b );
u.f = c;

您正在调用一个函数,该函数采用具有浮点位模式的整数值的浮点数。在调用之前,这些值被转换为(垃圾)浮点值,这可能不是您想要的。

您正在将simulated_fp_add()的返回值转换为unsigned int(c),然后将其转换回float(u.f)。

最后,simulated_fp_add()对将被解释为float的值进行逻辑右移。这种效果是不可预测的,但可能会给你一个次正规浮点值,在上面的整数转换中将向下舍入为零。

您应该首先编写一小段代码,对其进行测试,然后再进行构建。从这样的事情开始:

unsigned int shift(unsigned int a);

int main() {
    unsigned int a, c;

    a = 5;
    printf("a = %0x\n", a);
    c = shift(a);
    printf("c = %0x\n", c);
    return 0;
}