ARM 汇编 - 为什么输出打印不同?

问题描述 投票:0回答:1

我目前正在学习使用 ARM 进行编码,并且正在完成这项作业,我需要将英寸转换为英尺。我相信我已经一切正常,但是当涉及到在终端上打印输出时,我没有得到我想要的结果。当我去调试我的代码时,我可以看到我已经按照我想要的方式实现了所有内容,并且我正在使用的寄存器的值是它们应该的值,但输出最终不同。例如,当我在程序中输入 67 英寸时,输出结果为 5 英尺 -307609856 英寸。我错过了什么?看来我搞乱了寄存器的引用?任何指示或指导将不胜感激。预先感谢您!

.text
.global main
main:
        SUB sp, sp, #4
        STR lr, [sp]

        # provide prompt for user
        LDR r0, =prompt
        BL printf

        # read in the input
        LDR r0, =formatString
        LDR r1, =inches
        BL scanf

        # divide the input by 12 - remainder operation
        LDR r0, =inches
        LDR r0, [r0]
        MOV r1, #12
        MOV r2, #0
        MOV r3, r0

        # compare the remainder wth 12
        loop:

        CMP r3, r1
        BLT exit //if the remainder < 12, stop the comparison

        # subtract 12 from the dividend - this is the remainder
        SUB r3, r3, r1
        ADD r2, r2, #1 //tracks how many times the dividend is subtracted by 12 - this is the number of feet
        B loop

        exit:

        # print the output in units feet
        MOV r1, r2
        LDR r0, =output1
        BL printf

        # print the output in units inches
        MOV r1, r3
        LDR r0, =output2
        BL printf


        LDR lr, [sp]
        ADD sp, sp, #4
        MOV pc, lr
.data
        prompt: .asciz "enter height in inches: "
        formatString: .asciz "%d"
        inches: .word 0
        output1: .asciz "\nheight in feet is %d\n"
        output2: .asciz "height in inches is %d\n"e

我尝试更改此代码块的寄存器,因为运行时的 r3 被赋予了我正在寻找的值,但它不断重置为 r3 的初始值,而不是保存预期值

# print the output in units inches
        MOV r1, r3
        LDR r0, =output2
        BL printf
linux loops assembly arm cpu-registers
1个回答
0
投票
在 ARM 汇编中调用函数时,通常不会保留

r0
r3
。因此,在第一个
printf
之后,
r3
中的值就被丢弃了。相反,尝试使用
r4
或任何其他编号较高的寄存器来存储您的英寸。(也可以将
r3
存储和恢复到堆栈上,但这里有很多备用寄存器)。

例如,请参阅此答案,其中讨论了 ARM 调用约定,包括一些有用的链接:在 ARM C 调用约定中要保存哪些寄存器?

© www.soinside.com 2019 - 2024. All rights reserved.