【问题标题】:ARM Assembly register return to initial stateARM 汇编寄存器返回初始状态
【发布时间】:2016-05-02 15:57:39
【问题描述】:

当我尝试运行我的汇编程序时,我遇到了一个错误 - 分段错误(错误 139)。据我了解,这是因为我使用 r3 以上的寄存器,并且不将它们返回到初始状态。我该怎么做?

以下是我的代码,可能是什么问题?

.text
.align  2
    .global matmul
    .type   matmul, %function
    matmul:
    @-- check if matrices can be multiplied
    cmp r1,r3
    beq  loadvalues @-- matrices can be multiplied
    mov r0,#1
    bx lr

@-- load matrice values
loadvalues:
    stmdb SP!, { r4-r15 }
    ldr r4, [sp, #0]
    ldr r5, [sp, #4]
    ldr r6, [sp, #8]
    mov r7, #0
    mov r8, #0
    mov r9, #0
    mov r10, #4
    b firstloop     
    mov r0, #0
    bx lr

@-- Loop r7 to r0
firstloop:
    cmp r7, r0
    blt firstloopex
firstloopex:
    add r7, r7, #1
    b secondloop
    LDMIA SP!, { r4-r15 }
endfirstloop:
    mov r0, #0
    bx lr   

@-- Loop r8 to r4
secondloop:
    cmp r8, r4
    blt secondloopex
secondloopex:
    add r8, r8, #1
    b thirdloop
endsecondloop:
    mul r11, r7, r8
    mul r11, r10, r11
    sub r11, r11, r10
    str r0, [r6, r11]
    mov r8, #0

@-- Loop r9 to r1
thirdloop:
    cmp r9, r1
    blt thirdloopex
thirdloopex:
    add r9, r9, #1
    @-- load value of matrice 1
    mul r11, r7, r9
    mul r11, r10, r11
    sub r11, r11, r10
    ldr r12, [r2, r11]
    @-- load value of matrice 2
    mul r11, r9, r8
    mul r11, r10, r11
    sub r11, r11, r10
    ldr r13, [r5, r11]
    @-- sum up value
    mul r14, r12, r13
    add r0, r0, r14
endthirdloop:
    mov r9, #0

【问题讨论】:

  • push修改前的寄存器,pop返回前的?
  • 看起来您已经在保留被调用者保存的寄存器(或至少尝试保留)。然而,LDMIA SP!, { r4-r15 }ldr r13, [r5, r11] 尤其突出 - 尝试在调试器中单步执行它们(如果你完全接触到它们),然后看看会发生什么。然后去看看r13r15服务的角色... ;)
  • 您似乎已经迷上了 ARM 关于具有大型通用寄存器文件的体系结构的宣传。它不是。另外,请阅读架构参考手册。

标签: assembly arm


【解决方案1】:

在 ARM 中,您需要保存和恢复 {r4-r11}。过去那些都是特殊的寄存器。以下是 ARM 中的函数骨架。

my_func:
    push {r4-r11}    # Save callee-saved registers. stmdb sp!, {r4-r11}
    ...
    pop  {r4-r11}    # Restore callee-saved registers. ldmia sp!, {r4-r11}
    mov r0, #0       # Save return value to r0
    bx lr

注意:有时 r9 也是一个特殊寄存器,不应保存-恢复。我不会详细介绍,因为它足够稀有。您可以在 AAPCS(Arm 架构过程调用标准)http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf 中了解它。

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多