所以我正在编写一个程序(在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
但是控制台打印了商,旁边有一个空的勾勒框。
答案 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,依此类推。