计算臂组件中两个整数中较大的一个

时间:2013-10-17 04:29:31

标签: assembly arm

所以我试图为我的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}

谢谢

1 个答案:

答案 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