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