SDCC/C51: переопределить символы SDCC

Я хочу скомпилировать программу под 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 ..
}

1 ответ

Решение

Я связался с командой разработчиков SDCC

В субботу 27 июля 2013 года Стефан Фальк написал:

Привет всем, кто получает это!

Извините, что задаю, вероятно, довольно простой вопрос о ASXXXX Cross Assembler, но мне было интересно, можно ли или как изменить стандартные адреса SFR?

Процессор, который я использую, основан на Intel 8051, но у многих его регистров есть новые адреса.

Итак, есть ли способ сообщить SDCC, чтобы ASXXXX игнорировал предопределенный SFR и использовал вместо него мой?


Ответ

Я не думаю, что вы можете без редактирования источника ASXXXX. Тем не менее, SDCC использует только несколько встроенных символов ассемблера (из памяти, я думаю, это просто ACC, B, DPL, DPH, PSW и SP) в своем генераторе кода. Я был бы очень удивлен, если бы кто-нибудь переместил эти основные регистры, связанные с процессором. Все регистры SFR, определенные как уровень C (например, с помощью #include), будут явно определены на уровне сборки, но с префиксом подчеркивания, поэтому можно изменить адреса для этих символов на все, что вам нужно, и игнорировать предопределенные символы. Вам просто нужно убедиться, что любая написанная вами сборка использует символы с префиксом подчеркивания (то есть "mov a,_P2" вместо "mov a, P2").

Erik

Другие вопросы по тегам