我想在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 ..
}发布于 2013-07-28 20:19:59
我已经联系了SDCC小组
2013年7月27日,星期六,斯特凡·福尔克写道:
大家好,谁收到这个! 很抱歉,问这个问题可能相当简单的ASXXXX十字汇编程序,但我想知道我是否可以或如何改变标准的SFR地址? 我使用的处理器是基于英特尔8051,但它的许多寄存器确实有新的地址。 那么,有没有办法告诉SDCC让ASXXXX忽略预定义的SFR,而使用我的呢?
答案
我不认为你可以不编辑ASXXXX的源代码。然而,SDCC在其代码生成器中只使用了一些汇编程序内置符号(从内存中,我认为它只是ACC、B、DPL、DPH、PSW和SP)。如果有人移动这些与CPU相关的基本寄存器,我会感到非常惊讶。定义为C级别的所有SFR寄存器(例如,通过使用#include )将在程序集级别显式定义,但具有下划线前缀,因此可以将这些符号的地址更改为所需的任何地址,并忽略预定义的符号。您只需确保所编写的任何程序集都使用带有下划线前缀的符号(即"mov a,_P2“而不是"mov a,P2")。 埃里克
https://stackoverflow.com/questions/17879619
复制相似问题