Function 程序集如何在满足条件时从函数调用返回

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相同的

所以我在学习汇编,我刚刚学习了创建一个函数,我创建了一个标签,使用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相同的方式工作
  • (可选)我的代码布局正确吗

在ARM模式下
BX
可以是有条件的,例如
BXEQ
。此外,您还可以转到
BX
,或者一般来说转到尾声代码
BEQ LR
无效(*),即使有效,它也不会处理
X
部分(模式交换)*实际上,它是有效的,但它只是把
lr
当作一个标签,而不是一个寄存器。我认为这是整个“模型交换”部分让我感到困惑,我认为,如果LR加载的位置是PC指向+4位的位置,那么返回到该位置的分支将返回到下一行?或者这更像是一种格式类型的东西?任何分支都有一个标签,bx有地址?您有两个(或更多)操作状态,通常是ARM和THUMB
BX
注意适当地切换回模式。伪代码描述了一个带有终止条件的循环,后跟一个直接的无条件返回,而描述和汇编代码是一个带有条件返回的无限循环。这是一个微妙的区别,但值得注意,特别是因为前者是更常见的构造。
.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