2016-11-15 2 views
0
start 

read 

    BL getkey    ; read key from console 
    CMP R0, #0x0D   ; while (key != CR) 
    BEQ endRead    ; { 
    BL sendchar   ; echo key back to console  

    CMP R0, #' '   ; if (ro = ' ') 
    BNE nocount    ;{       
    ADD R7, R7, #1   ; r7 += 1 
    LDR R4, =0    ; r4 = 0 
nocount      ;} 

    MOV R6, R0    ; Store input in R6 
    SUB R6, R6, #'0'  ; Convert from decimal to hex 
    MULS R4, R5, R4   ; If there is another input, multiply total by 10 
    ADDS R4, R4, R6   ; Add the input to the total 

    ADD R8, R4, R8   ;sum 

    B read  

endRead     

end      

stop B stop 

    END 

Привет, Я пытаюсь, чтобы мой код, когда есть пространство вошел в консоль, 1 будет добавлен R7 и R4 будет установлен в 0.ARM Assembly, регистр не установлен в 0?

При добавлении пространства , R4 установлен в 0xFFFFFFF0, но когда я добавляю '5' к этому, я получаю 0xFFFFFFF65. Я ожидаю получить только 0x00000005. Это странно, потому что когда я кладу ту же команду за пределы сравнения, она работает. Любая помощь приветствуется, спасибо.

Также я хочу, чтобы r8 была суммой введенных чисел, она, похоже, не работает должным образом, может ли кто-нибудь сказать мне, почему?

+0

Я не, я просто не включил эту часть кода. Каждый раз, когда есть вход, я забираю его «0». –

+2

ОК - вам нужно предоставить [mcve]. –

+2

Не является ли «BEQ» неправильным тестом? Когда вводится «пробел», он пропускает 2 строки. –

ответ

1

Вы изучили условное выполнение ADD и т. Д.?

Предполагает: ARMv7 Моя машина = Linux raspberrypi 4.4.26-v7 + # 915 SMP чт 20 октября 17:08:44 BST 2016 armv7l GNU/Linux

 cmp r0, #0x20   // white space - space char 
     addeq r7, r7, #1  // conditional add 
     eoreq r4, r4   // conditional zero 
+0

Я не слишком горячий на ARM, но не 'addeq r7, r7, # 1' влияет на флаг' Z' перед 'eoreq r4, r4'? –

+0

@WeatherVane Нет, потому что это 'add', а не' add';) – Notlikethat

+0

О, и нет необходимости в неясных x86-isms на ARM - когда все кодировки команд имеют одинаковый размер, вы ничего не сохраняете не используя очевидные 'moveq, r4, # 0'. – Notlikethat

0
LDR R4, =0 

не Обнулить в регистр. Он загружает регистр из адреса памяти 0. Используйте

MOV R4, #0 

вместо этого.

+0

Пробовал это уже, тот же результат –

+0

Тогда это не ваша единственная ошибка :) –

+1

Это ** делает ** присваивает ноль регистру. Фактически GAS даже заменяет его «mov» автоматически. – Jester

0

относительно суммирования чисел; пожалуйста, пример ниже простого декрементированного цикла, где сумма каждого числа добавляется к R1. Надеюсь это поможет.

main: nop 

     eor r2, r2 
     mov r1, #0xf 
     1: 

     add r2, r2, r1 
     bl write 

     subs r1, #1 
     bne 1b 

ВЫВОД:

15 15 
14 29 
13 42 
12 54 
11 65 
10 75 
9 84 
8 92 
7 99 
6 105 
5 110 
4 114 
3 117 
2 119 
1 120 
0

К сожалению все, код правильный, он был просто не в правильном положении, спасибо всем!

+0

Нет, это не так. Вам нужно, по крайней мере, установить регистры на начальные известные значения. –

Смежные вопросы