Как сохранить целочисленный ввод из консоли в переменную - PullRequest
0 голосов
/ 28 января 2020

Я учусь на ассемблере ARM в колледже и работаю над тем, чтобы как можно больше узнать о том, как использовать язык. Мы используем Raspberry Pi с операционной системой Raspbian.

Я пытался создать простую программу, которая зацикливается на любое число, которое вводит пользователь. Все отлично работает, когда я сравниваю свой счетчик R3 с литеральным числом типа #4. Но когда я сравниваю счетчик с R4, где хранится пользовательский ввод, он не работает должным образом. Это будет либо l oop один раз, либо много раз в зависимости от того, что все я изменяю в программе, я не уверен, что я делаю неправильно.

Примечание: я знаю, что можно использовать C функция scanf(), но мне бы хотелось только решение для сборки. Я искал в Google, на этом сайте, и ссылался на мои учебники, но не нашел четкого ответа.

Я думал, что проблема, возможно, заключалась в том, что значение ascii хранилось вместо целого числа, но когда я попытался преобразовать значение, оно ничего не изменило. В любом случае, вот код и спасибо всем за ваше время!

.section .data

message:
    .ascii "Hello, World!\n"
    len = .-message

prompt:
    .ascii "Enter a number:\n"
    promptLen = .-prompt



.section .text

.balign 4 
count: .word 0



/*!!! Program Start !!!*/
.global main
main:

_prompt1:
    MOV R7, #4           @ Syscall for write
    MOV R0, #1           @ Write to console
    LDR R2, =promptLen  @ Buffer size 
    LDR R1, =prompt      @ Store string address in r1
    SWI 0               


_getInput:
    MOV R7, #3          @ Syscall for read
    MOV R0, #0          @ Read from keyboard
    MOV R2, #1          @ Buffer size
    LDR R1, =count      @ Store input to count var
    LDR R1, [R1]
    SWI 0

    MOV R4, R1          @ Store integer in R4


    MOV R3, #0          @ Start counter at 0
_loop:
    ADD R3, R3, #1      @ Increment counter


_printString:
    MOV R7, #4          @ Syscall for write
    MOV R0, #1          @ Write to console
    LDR R2, =len        @ Store message len in r2
    LDR R1, =message    @ Store message in r1
    SWI 0               


_checkCounter:
    CMP R3, R4         @ Check counter against user input
    BLT _loop          @ If counter <= count jump to loop


_exit:
    MOV R7, #1          @ Syscall for exit
    SWI 0               @ Return control to console

.end

Изменения, внесенные в getInput:

_getInput:
    MOV R7, #3          @ Syscall for read
    MOV R0, #0          @ Read from keyboard
    MOV R2, #1          @ Buffer size
    LDRB R1, =count     @ Store input to count var
    SWI 0

    LDRB R4, [R1]
    SUB R4, R4, #48
...