2017-05-31 246 views
0

我應該重寫代碼從C到內聯彙編。代碼將十進制數轉換爲十六進制。C到內聯彙編

代碼我應該轉移是:

#include <stdio.h> 
static int a; 
int main() { 
char str[]="XX je hex\n"; 

if (scanf("%i", &a)==1) { 

    /* This part of code i am supposed to transfer */ 

    int tmp = (a>>4)&0x0f; 
    if (tmp <= 9) { 
    tmp+='0'; 
    } else { 
    tmp+='A'-10; 
    } 
    str[0]=tmp; 
    tmp = a&0x0f; 
    if (tmp <= 9) { 
    tmp+='0'; 
    } else { 
    tmp+='A'-10; 
    } 
    str[1]=tmp; 
    /* Ends here */ 
    write(1, str, 10); 
} 
return 0; 
} 

到目前爲止,我得到這個

asm volatile (

     "mov %a,%bx;" 
     "shrw $4,%%bx;" 
     "and $0x0f, %%bx;" 

     "cmp $9,%bx;" 
     "jle lessOrEq;" 
     "jg greater;" 

     "mov %bx,%str[0];" 

     "mov %a,%bx;" 
     "and $0x0f, %%bx;" 

     "cmp $9,%bx;" 
     "jle lessOrEq;" 
     "jg greater;" 


     "mov %bx,%str[1];" 

     "lessOrEq: add '0',%bx; ret;" 

     "greater: add 'A',%bx; sub 10,%bx; ret;" 

    :"=c"(str[0]), "=d" (str[1]) 
    :"a"(a),"c"(str[0]),"d"(str[1]) 
    : 
); 

和我收到此錯誤:無效的 'ASM':%-letter後數編號缺失。

任何想法我有什麼錯誤?任何意見,將不勝感激。

+2

可能是一個好主意,提及哪一行會給出錯誤。 –

+0

對不起..它給第一行上的錯誤..錯誤:無效'asm':操作數編號在%-letter asm volatile後丟失( –

+0

)爲什麼你把它寫成內聯程序集呢?這很容易出現類似的錯誤你的經驗 – fuz

回答

2

在gcc內聯彙編中,寄存器名稱需要以兩個百分號爲前綴,您實際上在第二條和第三條指令中執行了這些操作,但在其他地方忘記了。只需更換%bx%%bx即可解決您的錯誤。

+0

謝謝!我現在編譯成功了,但它給了我Segmentation fault(核心轉儲)作爲輸出。 –

+1

@ a.vele我建議你自己做一些調試工作(例如,用調試標誌進行編譯並用調試器遍歷你的程序),並且一旦你確定了段錯誤發生的地方(或者更好的原因),看看如果你可以自己修復它,如果沒有,請打開一個新的問題,因爲這個問題所涉及的問題已經修復,如果你被卡住了,我會很樂意幫助你:) –