2014-04-23 40 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; 
}