运行 LC3 组装后寄存器中的值不正确

Incorrect Value in Register After Run LC3 Assembly

我正在创建一个 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
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 

会成功的。