汇编代码寄存器的范围是什么?
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,如果更长的话)。
我正在分析的程序中有一段函数的汇编代码。
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,如果更长的话)。