【问题标题】:Print Newline for Armv7 assembly program打印 Armv7 装配程序的换行符
【发布时间】:2018-05-10 01:34:20
【问题描述】:

我正在研究这个 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"

【问题讨论】:

  • 您为什么操作系统编程?你真的可以给你的函数起更具描述性的名字。 mysub1mysub2mysub3 都是很没用的名字。
  • @fuz 我只是使用在 raspbian 上运行的树莓派。我知道 mysubs 没有意义,这就是我将 cmets 放在它们旁边的原因。
  • 尝试重命名你的函数!
  • @fuz 没有修复它!
  • 重命名函数是为了让其他人更容易理解代码,而不是直接修复错误。

标签: linux assembly newline armv7


【解决方案1】:

这是罪魁祸首:

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

这段代码有两个错误:

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

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

【讨论】:

  • @Breezyb12 基本上,您将r4 除以十。商是你的第一个数字,余数是你的第二个数字。如果你有两个以上的数字,你需要多次划分。如果您的 CPU 没有 udivsdiv 指令,请参阅 this answer 了解如何执行此操作。
  • 知道了,非常感谢!
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2016-08-11
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多