【问题标题】:SDCC/C51: Redefine SDCC symbolsSDCC/C51:重新定义 SDCC 符号
【发布时间】:2013-07-26 10:58:44
【问题描述】:

我想在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 ..
}

【问题讨论】:

  • 但我想知道,SDCC 从哪里获得它实际使用的 0x88?如果它只是忽略您的定义,则 TCON 应该是未定义的。除非代码中某处隐藏了另一个定义?
  • SDCC 使用一些标准包含和标准库。文档说使用 --nostdinc 作为参数应该防止链接器使用例如8051.h(定义所有寄存器 - 包括 TCON)。但即使我使用这个..列表文件告诉我我已经定义了一个符号 TCON == 0xA8 但是 > 在同一个列表中 mov TCON, #0x0 被转换为 758800 而不是 75A800 ..
  • 嗯 8051.h 将 TCON 定义为 0x88,所以看起来确实是这个定义以某种方式被使用。
  • 不,我已经改变了——甚至删除了这个文件——但它似乎没有影响任何东西。生成了一个.sym 文件。我可以在那里找到定义为_TCON = 00A8 G 的符号,但在我找到TCON = 0088 L 下的某些行我仍然不知道如何阻止SDCC 这样做..

标签: assembly compiler-construction microcontroller sdcc c51


【解决方案1】:

我已联系 SDCC 开发团队

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”)。

埃里克

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2018-05-05
    相关资源
    最近更新 更多