2013-07-24 432 views
0

我不是很喜歡彙編,但對於一個項目,我不得不將C51 C編譯器的幾行彙編代碼修改爲SDCC。C51 C編譯器內聯彙編到SDCC內聯彙編

這是代碼C51

setb T1Run 
setb T0Run 

setb IDLE 
jnb  T0Full, $ 

其中,與SDCC編譯產生

?ASlink-Warning-Undefined Global 'IDLE' referenced by module 'Com_Func' 

?ASlink-Warning-Undefined Global '$' referenced by module 'Com_Func' 

?ASlink-Warning-Undefined Global 'T0Run' referenced by module 'Com_Func' 

?ASlink-Warning-Undefined Global 'T1Run' referenced by module 'Com_Func' 

?ASlink-Warning-Byte PCR relocation error for symbol $ 
     file    module   area    offset 
    Refby ./Com_Func.rel Com_Func   CSEG      004A 
    Defin ./Com_Func.rel Com_Func   CABS      0000 

爲編譯器錯誤/警告。

  • 我知道$ -symbol被彙編程序指令的實際地址替換 - 但是SDCC是什麼?
  • 如何解決T0Run等的警告?

回答

1

我想你可以用同一行上定義的標籤替換$。

00001$: 
    jnb  T0Full, 00001$ 

注意的是,根據SDCC Compiler User Guide

聯彙編器代碼中定義的所有標籤都成爲形式 NNNNN $其中nnnnn是數字小於100(這意味着的限制每個功能最多有100個內聯彙編器標籤)。

至於其他編譯器警告,那些是假定在任何地方都沒有定義的符號。他們如何定義在原來的C51代碼?

+0

這些符號在C頭文件中定義。包括這個文件沒有幫助。到現在爲止,我用實際數字替換了這些符號。仍然沒有線索如何告訴解析器它沒關係 – displayname

1

大聲笑...這聽起來像sdcc它很有趣。我現在剛開始添加頭文件。我不得不把它放在bin目錄中,因爲它沒有發現它在項目文件夾中的keil。

這可能有幫助。現在我還不是專家,但他們說的一些話並不像他們說的那樣有效。我不得不同時使用SDCC手冊及移植手冊最終我找到了正確的語法,我想要的......

http://www.infineon.com/dgdl/AP0806510_XC800_Migration_Keil_2_SDCC.pdf?folderId=db3a30431375fb1a01138c57204603bd&fileId=db3a304314dca389011517efc5860d61&ack=t

+0

有趣的..當時我正在爲此工作,我在格拉茨的英飛凌做過:D – displayname