我正在分析的程式中有一段函式的匯編代碼。
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 嗎?
例如, bl 816a <_ZN10ImgChannel9pushValueEi>上面函式 <_ZN7CamTask7executeEv> 中的行呼叫下面的函式 _ZN10ImgChannel9pushValueEi ..is r0 in line 81f6: 4618 mov r0, r3in the above function 與8170: 6078 str r0, [r7, #4]下面函式中的r0 in line 相同。
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 更新的情況下回傳呼叫函式?
uj5u.com熱心網友回復:
暫存器使用由呼叫約定規定,它是 ABI 的一部分。呼叫約定非常詳細,包括如何傳遞引數、回傳回傳值以及可以使用/不保留哪些暫存器。有關呼叫約定的更多資訊,請參見此處。(搜索 ARM。)
它是由另一個呼叫此函式的函式作為引數傳遞的嗎?
是的
如果是這樣,它在傳遞之前也稱為 r0 嗎?
暫存器是物理存盤,任何機器代碼都可以訪問它們——沒有范圍,而是功能之間的共享協議。我們可以將暫存器視為永久的物理存盤,始終可用且可全域訪問。
下面的函式是否可以更改 r0 的值,然后在 r0 更新的情況下回傳呼叫函式?
是的,對于簡單的整數和指標引數,函式采用 r0 中的第一個引數(r1 中的下一個)并回傳 r0 中的值(如果更長,r1 也是如此)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313733.html
上一篇:在MIPS中查找陣列中的最大元素
