Неверное значение в регистре после запуска сборки LC3

Я создаю программу LC3 для отображения суммы и количества положительных и отрицательных чисел, но когда я запускаю программу в программе Simulate - я смотрю на R5, который, как предполагается, содержит сумму положительных чисел, показывает только первое добавленное число + ve. Мой код ниже - любые новые предложения по использованию lc3 / assembly

.ORIG x3000


and r1, r1,#0 ; clear r1
and r2, r2, #0 ; neg counter amount of negative numbers
and r3, r3, #0 ; positive counter amount of pos numbers
and r4, r4, #0; negative sum
and r5,r5, #0; positive sum
and r6,r6,#0; clear register


LEA R1, DATA



loop            
        ldr r6, r1, #0
        BRn negativecountm ;if negative go to branch to ncount method
        BRp positivecountm ;if positive go to branch to pcount method
        BRz Escape ;if 0 encountered program done go to escape method


negativecountm 
        add r2, r2, #1 ; increment count for neg numbers
        add r4, r4, r6 ; sum of neg number
        add r1, r1,#1 ; increment pointer to point to next number in data
        BRp loop ; go back to original loop

positivecountm 
        add r3, r3, #1 ; increment count for positive num
        add r5, r5, r6; sum of +ve num
        add r1, r1, #1 ; increment pointer to point to next num in data
        BRn loop;


Escape  
        ST r2, negativecount ;
        ST r3, positivecount;
        ST r5, positivesum;
        ST r4, negativesum;
        TRAP x25 ;


   DATA     .Fill 1244
            .Fill -23
            .Fill 17
            .Fill 6
            .Fill -12
            .Fill 0


negativecount .BLKW 1
positivecount .BLKW 1
positivesum .BLKW 1
negativesum .BLKW 1


.END

person rahulchawla    schedule 29.11.2017    source источник


Ответы (1)


BRp loop ; go back to original loop
[...]
BRn loop;

Оба этих оператора ветвления не совсем верны. Помните, что коды условий устанавливаются каждый раз, когда инструкция записывает в регистр (то есть LD, LEA, LDR, LDI, ADD, AND, NOT).

Коды условий устанавливаются, когда вы делаете

add r1, r1, #1 ; increment pointer to point to next num in data

В случае положительного числа, конечно, r1 не будет содержать отрицательного значения после этой инструкции ADD.

Простое изменение ветвей, чтобы они были безусловными, исправит это.

Поэтому вместо BRn / p просто скажите

BR loop 

Сделаю свое дело.

person Brandon    schedule 29.11.2017