0

C51でコンパイルしていたプログラムをSDCCでコンパイルしたい..

// Somewhere in a header file for C51:
sfr TCON = 0xA8; // C51 syntax

// somewhere in a .c-file
#pragma asm

    mov     TCON, #0

#pragma endasm

これは75A800(16 進数)に変換されます。

     opcode  direct, #immed
mov: 75      A8      00

SDCCでこれをコンパイルすると、これ

     opcode  direct, #immed
mov: 75      88      00

SDCC は、次のような TCON レジスタの私の定義を無視しているように見えます。

// Somewhere in a header file for SDCC
__sfr __at(0xa8) TCON; // SDCC syntax

だからここに私の質問があります:

別のヘッダー ファイルで定義したアドレスを使用するように SDCC に指示するにはどうすればよいですか?

もちろん、全体は次のようになります。

#include "the-header-file-that-defines-my-registers.h" // defines TCON

void main(void)
{
 // code ..
 #pragma asm

   // more code ..

    mov     TCON, #0

 #pragma endasm

 // more and more code ..
}
4

1 に答える 1

0

SDCC-Dev Team に連絡しました

2013 年 7 月 27 日、Stefan Falk は次のように書いています。

これを受け取った皆さん、こんにちは!

ASXXXX Cross Assembler についておそらくかなり単純な質問をして申し訳ありませんが、標準の SFR アドレスを変更できるかどうか、またはどのように変更できるか疑問に思っていましたか?

私が使用しているプロセッサは Intel 8051 に基づいていますが、そのレジスタの多くは新しいアドレスを持っています。

それで、SDCC に ASXXXX に事前定義された SFR を無視し、代わりに私のものを使用するように指示する方法はありますか?


答え

ASXXXX ソースを編集せずにはできないと思います。ただし、SDCC は、コード ジェネレーターでアセンブラーの組み込みシンボル (メモリからは、ACC、B、DPL、DPH、PSW、および SP だけだと思います) のいくつかしか使用しません。誰かがこれらの基本的な CPU 関連のレジスタを移動したとしたら、私は非常に驚かれることでしょう。C レベルとして定義された (たとえば、 #include を使用して) すべての SFR レジスタは、アセンブリ レベルで明示的に定義されますが、アンダースコアのプレフィックスが付いているため、これらのシンボルのアドレスを必要なものに変更することができます。定義済みの記号を無視します。作成するすべてのアセンブリで、アンダースコアのプレフィックスが付いたシンボルが使用されていることを確認する必要があります (つまり、"mov a,P2" ではなく "mov a,_P2")。

エリック

于 2013-07-28T20:19:59.100 に答える