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



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

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也是)。

最新更新