gpt4 book ai didi

调用汇编例程的 C 代码 - ARM

转载 作者:太空狗 更新时间:2023-10-29 17:20:38 26 4
gpt4 key购买 nike

我目前正在为 ARM Cortex M3 开发引导加载程序。

我有两个函数,一个在 C 中,一个在 assembly 中,但是当我尝试调用 assembly 函数 时,我的程序挂起并生成某种错误。

功能如下,

C:

extern void asmJump(void* Address) __attribute__((noreturn));

void load(void* Address)
{
asmJump(Address);
}

程序集:

.section .text

.global asmJump

asmJump: @ Accepts the address of the Vector Table
@ as its first parameter (passed in r0)

ldr r2, [r0] @ Move the stack pointer addr. to a temp register.
ldr r3, [r0, #4] @ Move the reset vector addr. to a temp register.

mov sp, r2 @ Set the stack pointer

bx r3 @ Jump to the reset vector

我的问题是:

代码通过串行打印“Hello”,然后调用load。加载的代码打印“再见”,然后重置芯片。

如果我慢慢地逐步完成 load 调用 asmJump 的部分,一切都会完美无缺。但是,当我让代码运行时,我的代码遇到了“内存故障”。我知道这是一个内存故障,因为它以某种方式导致 Hard Fault(当我在 4 或 5 秒后暂停时,Hard Fault 处理程序的无限 while 循环正在执行)。

有没有人遇到过这个问题?如果是这样,您能告诉我如何解决吗?

如您所见,我已尝试使用函数属性来解决问题,但尚未找到解决方案。我希望有人能帮助我首先了解问题所在。

编辑:

感谢@JoeHass 的回答,以及@MartinRosenau 的评论,此后我继续寻找 this SO answer这对为什么我需要这个标签有一个非常详尽的解释。这是一本很长的书,但值得一读。

最佳答案

我认为您需要告诉汇编程序使用统一语法并将您的函数显式声明为拇指函数。 GNU 汇编器有这样的指令:

  .syntax unified
.section .text
.thumb_func
.global asmJump
asmJump:

.syntax unified 指令告诉汇编程序您正在使用汇编代码的现代语法。我认为这是一些遗留语法的不幸遗留物。

.thumb_func 指令告诉汇编程序该函数将以拇指模式执行,因此用于符号 asmJump 的值将其 LSB 设置为 1 .当 Cortex-M 执行分支时,它会检查目标地址的 LSB 以查看它是否为 1。如果是,则目标代码以拇指模式执行。由于这是 Cortex-M 支持的唯一模式,如果目标地址的 LSB 为零,它将出错。

关于调用汇编例程的 C 代码 - ARM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841693/

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