Function 程序集如何在满足条件时从函数调用返回
所以我在学习汇编,我刚刚学习了创建一个函数,我创建了一个标签,使用BL分支到标签,然后使用BX LR从函数调用返回 我知道LR存储PC+4位的地址,然后程序指针移动到标签的地址,然后PC通过代码递增,直到到达BX LR,然后PC现在指向LR指向的地址 我的问题是我是否有以下伪代码:Function 程序集如何在满足条件时从函数调用返回,function,assembly,arm,Function,Assembly,Arm,所以我在学习汇编,我刚刚学习了创建一个函数,我创建了一个标签,使用BL分支到标签,然后使用BX LR从函数调用返回 我知道LR存储PC+4位的地址,然后程序指针移动到标签的地址,然后PC通过代码递增,直到到达BX LR,然后PC现在指向LR指向的地址 我的问题是我是否有以下伪代码: func initArr() for(i = 0; i < max; i++) arr[i] = i return; 更具体地说: 与LR配对的条件分支是否以BX LR相同的
func initArr()
for(i = 0; i < max; i++)
arr[i] = i
return;
更具体地说:
- 与LR配对的条件分支是否以BX LR相同的方式工作
- (可选)我的代码布局正确吗
BX
可以是有条件的,例如BXEQ
。此外,您还可以转到BX
,或者一般来说转到尾声代码BEQ LR
无效(*),即使有效,它也不会处理X
部分(模式交换)*实际上,它是有效的,但它只是把lr
当作一个标签,而不是一个寄存器。我认为这是整个“模型交换”部分让我感到困惑,我认为,如果LR加载的位置是PC指向+4位的位置,那么返回到该位置的分支将返回到下一行?或者这更像是一种格式类型的东西?任何分支都有一个标签,bx有地址?您有两个(或更多)操作状态,通常是ARM和THUMBBX
注意适当地切换回模式。伪代码描述了一个带有终止条件的循环,后跟一个直接的无条件返回,而描述和汇编代码是一个带有条件返回的无限循环。这是一个微妙的区别,但值得注意,特别是因为前者是更常见的构造。
.global _start
_start:
LDR R1, =A
MOV R2, #0x00
BL _initArr
_end:
MOV R1, #0
MOV R7, #1
SWI 0
_initArr:
CMP R2, #MAX
BEQ LR @this
STR R2, [R1]
ADD R1, #0x04
ADD R2, #0x01
B _initArr
.data
.equ MAX, 10
A: rept MAX
byte 0x00
endr