Как распечатать две переменные на языке ассемблера?

#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