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