Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly SDCC/C51:重新定义SDCC符号_Assembly_Compiler Construction_Microcontroller_Sdcc_C51 - Fatal编程技术网

Assembly SDCC/C51:重新定义SDCC符号

Assembly SDCC/C51:重新定义SDCC符号,assembly,compiler-construction,microcontroller,sdcc,c51,Assembly,Compiler Construction,Microcontroller,Sdcc,C51,我想在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(十六进制) 当我在SDCC下编译时 opcode direct, #immed mov: 75 88

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

当我在SDCC下编译时

     opcode  direct, #immed
mov: 75      88      00
在我看来,SDCC忽略了我对TCON寄存器的定义,如下所示:

// Somewhere in a header file for SDCC
__sfr __at(0xa8) TCON; // SDCC syntax
#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使用我在另一个头文件中定义的地址

整个事情当然是这样的:

// Somewhere in a header file for SDCC
__sfr __at(0xa8) TCON; // SDCC syntax
#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开发团队

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

大家好,收到这封信的人

很抱歉,我要问一个很简单的问题 ASXXXX交叉汇编程序,但我想知道是否或如何 更改标准SFR地址

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

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


答案

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

埃里克


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