2

我试图在我的程序中删除中断向量表以减少闪存的使用。

我已经成功使用了这个-nostartfiles标志,它在输出中删除了很多汇编代码。

要使用该程序,我必须设置堆栈指针。我发现这段代码可以这样做:

asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );

但是在编译时,它什么也不做,而其他汇编代码就像

asm volatile ( "clr __zero_reg__" );      
asm volatile ( "rjmp main");

行得通。

这是我当前的 C 代码:

void __init(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
void __init(void)
{
    asm volatile(".set __stack, %0" :: "i" (RAMEND) );
    asm volatile ( "clr __zero_reg__" );      
    asm volatile ( "rjmp main");             
}

编译为程序集(7892 和 7894 行):

void __jMain(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
void __jMain(void)
{
    asm volatile(".set __stack, %0" :: "i" (RAMEND) );
    asm volatile ( "clr __zero_reg__" );        
    7892:   11 24           eor r1, r1
    asm volatile ( "rjmp main");                
    7894:   02 c0           rjmp    .+4         ; 0x789a <main>
}

为什么不.set __stack编译?我错过了一些编译器标志吗?尝试了很多东西.. 还审查了具有相同代码的引导加载程序,他们正在做同样的事情,但不知何故,我的编译不正确。

4

2 回答 2

1

怎么样:

asm volatile(
        "ldi  r28, lo8(RAMEND)" "\n\t"
        "ldi  r29, hi8(RAMEND)" "\n\t"
        "out __SP_L__, r28" "\n\t"
        "out __SP_H__, r29" "\n\t"
 );

主要来源: https ://ucexperiment.wordpress.com/2015/01/02/arduino-stack-painting/

于 2015-07-31T16:29:11.173 回答
0

我发现正确的“c”方式是:

void __init(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
void __init(void)
{   
    asm volatile ("clr __zero_reg__");
    SP = RAMEND;   
    asm volatile ( "rjmp main");             
}

最后,它跳转到您的主要功能。这会产生 yumbrad 提出的以下汇编输出:

// asm volatile ("clr __zero_reg__");
7800:   11 24           eor r1, r1

// SP = RAMEND;   
7802:   8f ef           ldi r24, 0xFF   ; 255
7804:   98 e0           ldi r25, 0x08   ; 8
7806:   9e bf           out 0x3e, r25   ; 62
7808:   8d bf           out 0x3d, r24   ; 61

// asm volatile ( "rjmp main");             
780a:   00 c0           rjmp    .+0         ; 0x780c <main>
于 2015-08-02T18:21:40.967 回答