为 Armv7 汇编程序打印换行符

Print Newline for Armv7 assembly program

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

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

这是罪魁祸首:

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

此代码有两个错误:

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

要解决第一个问题,您需要用余数除以将r4中的数字分成两位数。要解决第二个问题,请使用 strbstrh 来存储字节或半字,以免超出缓冲区。