打印Armv7装配程序的新行

时间:2017-11-26 19:48:51

标签: linux assembly newline armv7

我正在研究这个armv7汇编程序,它找到两个整数的最大公约数(gcd)。除了换行功能外,一切正常。当我组装并运行程序时,它不会打印任何换行符,只会打印一行中的整数。关于我如何解决这个问题的任何建议?

  .global _start
_start:
    mov r2, #24     @first set of integers
    mov r4, #18
    bl mysub1
    bl mysub2
    bl mysub3

    mov r2, #78     @second set of integers
    mov r4, #34
    bl mysub1
    bl mysub2
    bl mysub3

    mov r2, #99     @third set of integers
    mov r4, #36
    bl mysub1
    bl mysub2
    bl mysub3

_exit:
    mov r7, #1
    swi 0


mysub1:             @subroutine to find gcd
    cmp r2, r4
    beq done
    bgt greater
    blt less
greater:
    sub r2, r2, r4
    bal mysub1

less:
    sub r4, r4, r2
    bal mysub1
done:
    bx lr

mysub2:             @subroutine to convert gcd result to ascii value
    add r4, #48
    ldr r9, =store
    str r4, [r9]

    mov r7, #4      @print out a newline
    mov r0, #1
    mov r2, #1
    ldr r1, =newline
    swi 0

    bx lr

mysub3:             @subroutine to print out the ascii value
    mov r7, #4
    mov r0, #1
    mov r2, #2
    ldr r1, =store
    swi 0

    bx lr


    .data
store:
    .space 2

newline:
    .ascii "\n"

1 个答案:

答案 0 :(得分:1)

这是谴责:

add r4, #48
ldr r9, =store
str r4, [r9]

此代码有两个错误:

  • 它仅适用于0到9之间的数字
  • str r4, [r9]将四个字节存储到store,在两字节缓冲区后立即覆盖换行符。

要修复第一个问题,您需要使用rest进行除法,以将r4中的数字分成两位数。要解决第二个问题,请使用strbstrh来存储字节或半字,而不是超出缓冲区。