gpt4 book ai didi

c - 修改avr上函数的返回地址

转载 作者:行者123 更新时间:2023-11-30 16:34:33 25 4
gpt4 key购买 nike

我将 C 代码与汇编程序混合起来,以了解 AVR 上的任务切换。这仅供我个人学术使用,我知道有 freeRTOS,但我想了解。目前我正在努力解决返回地址如何存储在堆栈上的问题。

假设有三个函数:

extern void call(void(*)() fn);

void f1() {
// Do something
while(1){};
}

void f2() {
// Do something
while(1){};
}

int main() {
caller(&f1);
while(1){};
}

汇编程序文件如下所示:

.section .text

.global caller
caller:
// Register r25 and r24 contain the pointer
pop r0
pop r0
push r25
push r24
ret

AVR指令集文档指出,当执行调用指令时,两个字节(对于16位的PC)被压入堆栈。当 avr-gcc 与汇编器结合使用时,这不会按预期工作。据我了解堆栈上的返回地址,此汇编代码应该返回到 f2 的地址,但这不会发生。

关于 gcc 如何传递函数指针,我是否忘记了什么?我知道这不是现实世界的代码,但目的是帮助我理解返回行为。调用调用者函数的 list 告诉我 r25 和 r24 加载了一些地址。

最佳答案

Is there anything I forgot about how gcc passes function pointers?

没有。关键在于您如何插入值(value)观:

push r25
push r24
ret

您必须首先推送地址的部分(R24)。比照。例如 avr-gcc 如何实现 indirect jump如果它无法获取 Z 寄存器:

关于c - 修改avr上函数的返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com