#assembly #arm
#сборка #arm
Вопрос:
Для моей программы он попросит пользователя ввести положительное число, а затем выполнить вычисление двойного факториала и распечатать результат. Однако в настоящее время у меня есть то, что выходные данные будут распечатаны как «Результат = 15», когда я наберу 5. Я хочу распечатать вывод как «Результат 5 = 15». Как я могу это сделать?
.global main @ start of the assembly code
main:
PUSH {LR}
BL _getInput
BL _calculate
BL _output
POP {PC}
_getInput:
PUSH {LR}
BL _displayPrompt
SUB SP, SP, #4 @ create word on stack
LDR R0, addr_format @ get the address of the the input entered by user
MOV R1, SP @ copy as parameter
BL scanf
LDR R1, [SP] @ load the data from memory address of SP into R1
LDR R2, addr_iterations @ load the address of iterations into R2
STR R1, [R2] @ store data from R1 into iterations
ADD SP, SP, #4
POP {PC}
_displayPrompt:
PUSH {LR}
LDR R0, =prompt
BL printf
POP {PC}
_calculate:
LDR R0, addr_product
LDR R0, [R0]
LDR R1, addr_iterations
LDR R1, [R1] @ Load the iteration counter
MUL R0, R0, R1 @ R0 *= R1 / product = product * counter
SUBS R1, R1, #2 @ R1-- / counter = counter - 1
LDR R2, addr_iterations @ write back
LDR R3, addr_product @ address of where to store the result
STR R0, [R3] @ store the final product back into addr_product
STR R1, [R2]
MOVLE PC, LR @ go back to main once the variable interations is 0 / return
BGT _calculate @ continue looping as long as not 0
_output:
PUSH {LR}
LDR R0, addr_message
LDR R1, addr_product
LDR R1, [R1]
BL printf
POP {PC}
addr_format: .word scanformat
addr_iterations: .word iterations
addr_product: .word product
addr_message: .word message
.data
prompt: .asciz "Enter a positive integer number: "
scanformat: .asciz "%d"
iterations: .word 1
product: .word 1
message: .asciz "Result: %dn"
Комментарии:
1. передайте 3-й аргумент в printf в r2, точно так же, как и в C. (С соответствующей строкой формата, конечно). en.cppreference.com/w/c/io/fprintf
2. И измените строку формата на
"Result of %d = %dn"
3. Это означает, что в _ouput добавьте «LDR R2, addr_format», а затем «LDR R2, [R2]» перед BL printf?
4. Вы, конечно, имеете в виду
add_iterations
? Иiterations
значение должно входитьR1
, в то времяproduct
как значение должно входитьR2
. поскольку вы хотите, чтобы они были напечатаны в таком порядке.5. я получил -1, когда я изменил его на add_iterations, а не 5, когда я ввел 5