我目前正在学习使用 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
r0
到 r3
。因此,在第一个 printf
之后,r3
中的值就被丢弃了。相反,尝试使用 r4
或任何其他编号较高的寄存器来存储您的英寸。(也可以将 r3
存储和恢复到堆栈上,但这里有很多备用寄存器)。
例如,请参阅此答案,其中讨论了 ARM 调用约定,包括一些有用的链接:在 ARM C 调用约定中要保存哪些寄存器?