【发布时间】: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]尤其突出 - 尝试在调试器中单步执行它们(如果你完全接触到它们),然后看看会发生什么。然后去看看r13和r15服务的角色... ;) -
您似乎已经迷上了 ARM 关于具有大型通用寄存器文件的体系结构的宣传。它不是。另外,请阅读架构参考手册。