所以我试图为我的Raspberry Pi编写一个ARM程序集,我正在提示两个整数,a和b,然后比较它们以查看哪个更大,然后打印哪个数字是大。
我能够读取两个整数,但它总是打印出第二个整数'b'是最大的,然后有时会给我一个分段错误。我使用gbd看看为什么我会达到他的段错误,但我无法破译它意味着什么。
gdb说这个
编程接收信号SIGSEGV,分段故障。 来自/lib/arm-linux-gnueabihf/libc.so.6的strchrnul()中的0x400b5c38
我的代码就是这个
.section .rodata
promptA:
.ascii "a: \000"
promptB:
.ascii "b: \000"
readA:
.ascii "%d\000"
readB:
.ascii "%d\000"
printLargest:
.ascii "largest=%d\n\000"
.section .data
.align 2
.comm a,4,4
.comm b,4,4
.text
addra: .word a
addrb: .word b
addrPromptA: .word promptA
addrPromptB: .word promptB
addrReadA: .word readA
addrReadB: .word readB
addrPrintLargest: .word printLargest
main:
stmfd sp!, {fp, lr}
ldr r0, addrPromptA
bl printf
ldr r0, addrReadA
ldr r1, addra
bl scanf
ldr r0, addrPromptB
bl printf
ldr r0, addrReadB
ldr r1, addrb
bl scanf
ldr r0,addra
ldr r0, [r0]
ldr r1, addrb
ldr r1, [r1]
cmp r1, r0
mov r0, r1
bgt bgreater
blt agreater
agreater:
ldr r0, addrPrintLargest
bl printf
bgreater:
ldr r1, addrPrintLargest
bl printf
ldmfd sp!, {fp, pc}
谢谢
答案 0 :(得分:1)
无论B
的结果如何,您都会r0
放入cmp
:
cmp r1, r0
mov r0, r1
在这里打印B
(因为它也在r1
中):
agreater:
ldr r0, addrPrintLargest
bl printf
然后你继续执行这个代码,因为在上面bl
之后没有分支:
bgreater:
ldr r1, addrPrintLargest
bl printf
这可能是导致段错误的原因,具体取决于r0
碰巧包含的内容。
我建议做这样的事情:
ldr r0,addra
ldr r0, [r0]
ldr r1, addrb
ldr r1, [r1]
cmp r0, r1
movgt r1, r0 @ if (r0 > r1) r1 = r0
ldr r0, addrPrintLargest
bl printf