汇编代码寄存器的范围是什么?

what is the scope of assembly code registers?

我正在分析的程序中有一段函数的汇编代码。

000081e4 <_ZN7CamTask7executeEv>:
81e4:   b580        push    {r7, lr}
81e6:   b084        sub sp, #16
81e8:   af00        add r7, sp, #0
81ea:   6078        str r0, [r7, #4]
81ec:   230a        movs    r3, #10
81ee:   60fb        str r3, [r7, #12]
81f0:   687b        ldr r3, [r7, #4]
81f2:   6ddb        ldr r3, [r3, #92]   ; 0x5c
81f4:   68f9        ldr r1, [r7, #12]
81f6:   4618        mov r0, r3
81f8:   f7ff ffb7   bl  816a <_ZN10ImgChannel9pushValueEi>
81fc:   bf00        nop
81fe:   3710        adds    r7, #16
8200:   46bd        mov sp, r7
8202:   bd80        pop {r7, pc}

1 - 汇编函数中的寄存器范围是否仅限于该函数,例如这里的第 4 行 81ea: 6078 str r0, [r7, #4] r0 中的值来自哪里?它是否作为另一个参数传递调用此函数的函数?如果是这样,它在通过之前是否也被称为r0?

例如,上面函数 <_ZN7CamTask7executeEv> 中的行 bl 816a <_ZN10ImgChannel9pushValueEi> 调用下面的函数 _ZN10ImgChannel9pushValueEi ..上面函数中行 81f6: 4618 mov r0, r3 中的 r0 与行 [=15= 中的 r0 相同] 在下面的函数中。

0000816a <_ZN10ImgChannel9pushValueEi>:
816a:   b580        push    {r7, lr}
816c:   b082        sub sp, #8
816e:   af00        add r7, sp, #0
8170:   6078        str r0, [r7, #4]
8172:   6039        str r1, [r7, #0]
8174:   687b        ldr r3, [r7, #4]
8176:   683a        ldr r2, [r7, #0]
8178:   60da        str r2, [r3, #12]
817a:   687b        ldr r3, [r7, #4]
817c:   4618        mov r0, r3
817e:   f001 ff06   bl  9f8e <_ZN7Tasking7Channel4pushEv>
8182:   bf00        nop
8184:   3708        adds    r7, #8
8186:   46bd        mov sp, r7
8188:   bd80        pop {r7, pc}

2- 下面的函数可以更改 r0 的值,然后 return 到调用函数,现在 r0 正在更新吗?

寄存器的使用由调用约定规定,它是 ABI 的一部分。调用约定非常详细,参数如何传递,return值是returned,哪些寄存器可以用with/without保存。有关调用约定的更多信息,请参阅 here。 (搜索 ARM。)

was it passed as an argument by another function that calls this function?

If so is it also called r0 before it is passed?

寄存器是物理存储,任何机器代码都可以访问它们——没有作用域,而是函数之间的共享协议。我们可以将寄存器视为永久物理存储,始终可用且全局可访问。

Can the below function change the value of r0 and then return to the calling function with r0 being updated now?

是的,对于简单的整数和指针参数,函数在 r0 中获取它们的第一个参数(r1 中的下一个)和 r0 中的 return 个值(和 r1,如果更长的话)。