TRAP保持打印相同的值lc3

时间:2017-11-19 08:11:50

标签: printing lc3 machine-language

所以我正在编写一个程序(在LC-3 ISA机器语言中,虽然我不确定这是否是特定类型的机器语言代码的实际名称,但它只是我能描述它的最佳方式。我是我不熟悉机器语言编程,因此我对LC-3的不同类型的机器语言代码并不十分熟悉,其中我显示了一个字母出现在押韵(诗)和诗歌中的次数。我应该让这个程序打印一个字母出现的次数(最多为99)。

一切都很好,除了最后一条指令,它是TRAP x23(用于打印)。我使用了两次陷阱指令,这样我就可以打印掉两个数字(通过将计数除以10并将商和余数存储到寄存器中来获得)。这是代码:

0011000000000000 ;pc starts here
0101010010100000 ;clear r2
0010101000100011 ; ld x3500 r5 
0010011000100000 ;ld x3012, r3
1111000000100011 ;trap in
0110001011000000 ;ldr r1, base r3(x3100), 
0001100001111100 ;r4 = r1 - 4, top of loop
0000010000001100 ;start loop check if r1 == 4(if it does, exit)
1001001001111111 ;NOT R1 and store in R1
0001001001100001 ;Add r1 + 1 and store in r1
0001001001000000 ;Add r1 + r0 and store in r1


0000101000000101 ;skip if r1 != 0
0001010010100001 ;r2++
0101110110000000 ;clear r6
0001110110000011 ;r6 = r6 + r3
0111110101000000 ;str r6 in the address r5 points to.
0001101101100001 ;increment r5 pointer.


0001011011100001 ;r3++(increment pointer)
0110001011000000 ;ldr into r1, content in the address r3 points to.
0000111111110010 ;GOTO TOP OF LOOP


;COUNT DIVISION
0101101100000000 ;clear r5
0001010010100000 ;r2 = r2(changes the flags for the upcoming loop).
0000110000000101 ;if r2 is <= 0, skip loop
0011010000001111 ; store r2 in PC + 15
0001010010110110 ;r2 = r2 - 10
0000110000000001 ; if r2 is negative or zero, skip the next instruction.
0001101101100001 ;r5++
0000111111111010 ;go to top of loop
0010010000001010 ;load value in PC + 10 to r2(remainder).


0010000000000111 ;LD into r0 x3014 
0001000000000101 ;Add r0 and x3013(ASCII character) store in r0
1111000000100001 ;trap print out quotient
0101000000100000 ;clear r0
0001000000000010 ; r0 = r0 + r2
1111000000100001 ;trap print out remainder.
1111000000100101 ;HALT

0011000100000000 ;data variables
0000000000110000
0011010100000000 ;x3500

在我使用寄存器0打印剩余部分之前(在第2节中),我只使用它打印出商,我使用下面的代码来尝试更改要打印的值(我想TRAP x23将打印最近调用的寄存器的值:

0001010010100000 ;r2 = r2 + 0

但是它只打印了两次商,所以我尝试了以下操作来查看是否有任何改变:

0101001001100000 ;clear r1
0001001001000010 ;r1 = r1+r2

什么都没做。所以我开始相信TRAP x23只打印出r0的值,所以我将代码更改为:

0101000000100000 ;clear r0
0001000000000010 ;r0 = r0 + r2

但是控制台打印了商,旁边有一个空的勾勒框。

1 个答案:

答案 0 :(得分:0)

你的意思是Trap x21(OUT)?您的代码不显示Trap x23。陷阱x23是IN,它将读取一个不是你想要的字符。

  

什么都没做。所以我开始相信TRAP x23只打印出r0的值,所以我将代码更改为:

是来自TRAP的ISA文档 x21

OUT:将R0 [7:0]中的字符写入控制台显示屏。

它只会打印出R0的低8位。

  

但是控制台打印了商,旁边有一个空的勾勒框。

记住ASCII table如果R0包含0,它将不会打印出0,而是从下表中打出一个NUL字符。如果要打印出0,则R0必须包含48.如果要打印1然后打49,依此类推。