Я учусь на ассемблере 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