1

所以我正在尝试为我的 Raspberry Pi 编写一个 ARM 程序集,我让它提示输入两个整数 a 和 b,然后比较它们以查看哪个更大,然后打印哪个数字更大。

我能够读取两个整数,但它总是打印出第二个整数“b”是最大的,然后有时会给我一个分段错误。我已经使用 gbd 来了解为什么我会遇到他的段错误,但我一直无法破译它的含义。

gdb 这么说

程序收到信号 SIGSEGV,分段错误。0x400b5c38 in strchrnul () from /lib/arm-linux-gnueabihf/libc.so.6

我的代码是这样的

.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}

谢谢

4

1 回答 1

1

无论结果如何,您都B在此处输入:r0cmp

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
于 2013-10-17T08:37:15.020 回答