SDCC / C51:重新定义SDCC符号

时间:2013-07-26 10:58:44

标签: assembly compiler-construction microcontroller sdcc c51

我想在SDCC下编译一个程序,我曾经在C51下编译。

// 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(hex)

     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 ..
}

1 个答案:

答案 0 :(得分:0)

我已经联系过SDCC-Dev团队

2013年7月27日星期六,Stefan Falk写道:

  

欢迎收到此邮件的所有人!

     

我很遗憾地问这个可能相当简单的问题   ASXXXX Cross Assembler但我想知道我是否或如何   更改标准SFR地址?

     

我使用的处理器基于Intel 8051但是   很多寄存器都有新的地址。

     

那么,有没有办法告诉SDCC告诉ASXXXX   忽略预定义的SFR并使用我的?


答案

  

我不认为你可以不编辑ASXXXX源代码。但是,SDCC在其代码生成器中仅使用了一些汇编器的内置符号(来自内存,我认为它只是ACC,B,DPL,DPH,PSW和SP)。如果有人移动这些基本的CPU相关寄存器,我会非常惊讶。所有定义为C级的SFR寄存器(例如,通过使用#include)将在汇编级别显式定义,但使用下划线前缀,因此可以将这些符号的地址更改为您需要的任何值,以及忽略预定义的符号。您只需要确保您编写的任何程序集都使用带下划线前缀的符号(即“mov a,_P2”而不是“mov a,P2”)。

     

Erik