我在分析程序中有一段函数的汇编代码。
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内的值来自哪里?是否由另一个调用此函数的函数作为参数传递?如果是,在传递之前是否也称为0 ?
,例如上面函数中的bl 816a <_ZN10ImgChannel9pushValueEi>
行<_ZN7CamTask7executeEv>调用函数_ZN10ImgChannel9pushValueEi下面。排队是r081f6: 4618 mov r0, r3
在上面的函数一样r08170: 6078 str r0, [r7, #4]
以下函数。
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的值,然后在r0被更新后返回调用函数吗?
寄存器的使用由调用约定规定,它是ABI的一部分。调用约定非常详细地说明了参数如何传递、返回值如何返回以及哪些寄存器可以带/不带保留使用。有关调用约定的更多信息,请参阅此处。(搜索ARM.)
是否被另一个调用该函数的函数作为参数传递?
是的
如果是,在传递之前是否也称为r0 ?
寄存器是物理存储器,任何机器码都可以访问它们——没有作用域,而是函数之间的共享协议。我们可以把寄存器看作是永久的物理存储,始终可用,并且全局可访问。
下面的函数可以改变r0的值,然后在r0被更新后返回调用函数吗?
是的,对于简单的整数和指针实参,函数的第一个形参是在r0中(下一个是在r1中),返回值是在r0中(如果更长,r1也是)。