cortex M4 Thumb Assembly 函数地址
cortex M4 Thumb Assembly function address
我目前正在尝试了解 Cortex-M 内核的 ARM 汇编。
我知道 Thumb 模式(这是核心支持的唯一模式)中的函数是通过它们的地址调用的,地址的 LSB 为高表明目标是 Thumb 代码。
在汇编中我在函数"Reset_Handler"前面写了下面的内容来告诉汇编程序标签处的数据是executable/a函数:
.type Reset_Handler, %function
Reset_Handler:
MOV R0, R0 # just do something
如果我现在加载标签的地址
LDR R0, =Reset_Handler
R0 的 LSB 已设置。
我是否必须将这个 .type 指令放在每个我想用作间接调用函数的标签前面?
或者有没有办法让汇编器自动决定正确的地址?
如果我要将函数的代码复制到RAM中,并加载这个函数的地址,我必须自己清除LSB才能得到数据所在的"real"地址,我说的对吗?
在这种情况下是否需要 .type 指令?我知道一旦我想将地址放入向量 table 中就必须这样做,因为这需要设置 LSB。
好吧,有两种类型的地址(标签)。一种类型是您要调用的地址,函数入口点的地址,对于拇指 bx 或 pop 需要设置 lsbit。另一个是数据项的地址、字符串的开头、数组的开头等等,并且不希望 lsbit 损坏,因为这会导致对齐错误。因此,除非你想在使用 bx 之前必须将代码添加到地址或一个地址上,否则你真的希望汇编器在你定义标签或使用标签时有一个解决方案。
因此,对于 gnu 汇编程序,您需要在标签前加上 .thumb_func(可能还有其他方法),对于您的汇编程序,您似乎需要您的汇编程序所需要的。
我目前正在尝试了解 Cortex-M 内核的 ARM 汇编。
我知道 Thumb 模式(这是核心支持的唯一模式)中的函数是通过它们的地址调用的,地址的 LSB 为高表明目标是 Thumb 代码。
在汇编中我在函数"Reset_Handler"前面写了下面的内容来告诉汇编程序标签处的数据是executable/a函数:
.type Reset_Handler, %function
Reset_Handler:
MOV R0, R0 # just do something
如果我现在加载标签的地址
LDR R0, =Reset_Handler
R0 的 LSB 已设置。
我是否必须将这个 .type 指令放在每个我想用作间接调用函数的标签前面?
或者有没有办法让汇编器自动决定正确的地址?
如果我要将函数的代码复制到RAM中,并加载这个函数的地址,我必须自己清除LSB才能得到数据所在的"real"地址,我说的对吗?
在这种情况下是否需要 .type 指令?我知道一旦我想将地址放入向量 table 中就必须这样做,因为这需要设置 LSB。
好吧,有两种类型的地址(标签)。一种类型是您要调用的地址,函数入口点的地址,对于拇指 bx 或 pop 需要设置 lsbit。另一个是数据项的地址、字符串的开头、数组的开头等等,并且不希望 lsbit 损坏,因为这会导致对齐错误。因此,除非你想在使用 bx 之前必须将代码添加到地址或一个地址上,否则你真的希望汇编器在你定义标签或使用标签时有一个解决方案。
因此,对于 gnu 汇编程序,您需要在标签前加上 .thumb_func(可能还有其他方法),对于您的汇编程序,您似乎需要您的汇编程序所需要的。