【发布时间】: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