2014-04-23 36 views
2

我觉得我要疯了。我试图编写一个模拟ARM汇编中硬件浮点加法的函数。我有一个函数float simulate_fp_add(float, float)目前看起来是这样的:(ARM程序集)向右移位寄存器1将所有位设置为零

.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} 

我的主文件(简体)目前只是调用我的两个任意花车ARM功能,结果以十进制和二进制输出:

#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 

输出WITH变速:

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

我的所有的simulated_fp_add函数都会将r0中的浮点数右移1,但结果为零?我错过了什么吗?

回答

2

你有一系列对你不利的事情。

float simulated_fp_add(float, float); 

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

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

您的simulated_fp_add()的返回值(C)转换为一个无符号的int和然后变换该回浮子(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; 
}