0

我想在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(十六进制)

     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 开发团队

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

大家好,收到这个!

很抱歉问这个关于 ASXXXX 交叉汇编器的可能相当简单的问题,但我想知道是否或如何更改标准 SFR 地址?

我使用的处理器基于 Intel 8051,但它的许多寄存器确实有新地址。

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


答案

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

埃里克

于 2013-07-28T20:19:59.100 回答