1

私のコンパイラは、私が持っているアセンブリ ファイルでは動作しません。また、私の他のコンパイラは、私が持っている c ファイルでは動作しません。組み立てがわかりません。これを移動する必要がありますが、どこにもすぐには行きません。助けてくれる人はいますか?翻訳者がいないなんて信じられない。ファイルの冒頭は次のとおりです。

    list        p=18F4480       
    #include    <p18F4480.inc> 

    #define _Z      STATUS,2
    #define _C      STATUS,0

    GLOBAL  AARGB0,AARGB1,AARGB2,AARGB3     
    GLOBAL  BARGB0,BARGB1,BARGB2,BARGB3
    GLOBAL  ZARGB0,ZARGB1,ZARGB2
    GLOBAL  REMB0,REMB1
    GLOBAL  TEMP,TEMPB0,TEMPB1,TEMPB2,TEMPB3
    GLOBAL  LOOPCOUNT,AEXP,CARGB2


LSB         equ 0
MSB         equ 7

math_data   UDATA   
AARGB0      RES 1       
AARGB1      RES 1
AARGB2      RES 1
AARGB3      RES 1
BARGB0      RES 1   
BARGB1      RES 1
BARGB2      RES 1
BARGB3      RES 1
REMB0       RES 1   
REMB1       RES 1
REMB2       RES 1
REMB3       RES 1   
TEMP        RES 1
TEMPB0      RES 1
TEMPB1      RES 1
TEMPB2      RES 1
TEMPB3      RES 1
ZARGB0      RES 1
ZARGB1      RES 1
ZARGB2      RES 1
CARGB2      RES 1
AEXP        RES 1
LOOPCOUNT   RES 1


math_code   CODE
;---------------------------------------------------------------------
;       24-BIT ADDITION             
_24_BitAdd
    GLOBAL  _24_BitAdd
    movf    BARGB2,w
    addwf   AARGB2,f

    movf    BARGB1,w
    btfsc   _C
    incfsz  BARGB1,w
    addwf   AARGB1,f

    movf    BARGB0,w
    btfsc   _C
    incfsz  BARGB0,w
    addwf   AARGB0,f
    return

とにかく、デバイス定義が私のmain.cにあるので、最初の2行をほとんど除外できることがわかりました。2 つの #defines はまさにそれですが、最も簡単な方法 (私が思うに) は、_Z と _C のインスタンスを STATUS,2 と STATUS,0 に適宜置き換えることです。次の行 (GLOBAL) は、私が収集している単なる変数宣言です。LSB と MSB も値を割り当てることを除いて同じです。次のチャンクは、それらの名前 (AARGB0 など) を持つ整数の束を宣言するだけで、その後のチャンクは関数です。

私のコンパイラには #asm/#end asm ディレクティブがあるので、その関数を変換することさえ気にしません。

私はそれをすべて持っていると思います...ビルドして、コンパイラが STATUS が定義されていないことを叫ぶまで。そしてもちろんそうではありません。しかし、それは何ですか?ネットで STATUS レジスタが何か特別なものだと読んだのですが、実際にどのように機能するのかわかりません。

あなたが気づいていないなら、私はそれが本当に何を求めているのかさえわかりません. 私は血まみれのことを機能させたいだけです。

4

3 に答える 3

6

あなたのコンパイラはあなたのソースを拒否していますか?

壊れたツールを使用しているか、ソース ファイルにバグがあります。どちらの場合も、問題は「ASM から C への変換」などではなく、ソース/ツールチェーンのバグです。問題を回避しようとせず、解決してください。

于 2009-09-07T07:20:10.750 に答える
3

STATUS は PIC アーキテクチャの組み込みレジスタであり、大部分の大型 CPU の「ステータス」フラグまたは「状態」フラグ レジスタと同じ機能を実装しています。これには、マイクロコントローラがコードを実行するときに設定およびクリアされるビットフラグが含まれており、操作の結果が通知されます。

たとえば、Z フラグは算術演算の結果がゼロになるたびにセットされ、C (キャリー) フラグは算術オーバーフローが検出されたときにセットされます。

これらは通常、C からは見えないフラグです。C はホスト プロセッサにステータス ビットさえも要求したくないため、このコードを C に直接変換するのは困難です。ステータス読み取りビット テストを C コードに含める方法を見つけ、可能な場合はそれらの命令を使用する必要があります。C からは、どのレジスタが使用されているかを制御できず、適切な場所で適切なフラグをチェックしていることを確認するのが難しくなるため、これは面倒かもしれません。

他の人の拡張精度 PIC コードへのリンクをいくつか示します。ほとんどが組み立てられたままのようですが、参考資料やインスピレーションとして役立つ可能性があります。

于 2009-09-07T07:33:10.413 に答える
1

逆アセンブリのリバース エンジニアリングを試みることができます。しかし、あなたは何を学びますか?

アセンブリを (コンパイラ 1 を使用して) オブジェクト ファイルにコンパイルし、それを C ファイルからコンパイラ 2 によってコンパイルされたオブジェクト ファイルにリンクできるはずです。

于 2009-09-07T07:24:33.587 に答える