所以我正在编写一个程序(使用 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 打印出余数(在 reg. 2 中)之前,我只用它打印出商,我使用以下代码尝试更改要打印的值(我认为 TRAP x23将打印最近调用的寄存器的值):
0001010010100000 ;r2 = r2 + 0
但它只打印了两次商,所以我尝试执行以下操作以查看是否有任何变化:
0101001001100000 ;clear r1
0001001001000010 ;r1 = r1+r2
什么也没做。所以我开始相信 TRAP x23 只打印出 r0 的值,所以我将代码更改为:
0101000000100000 ;clear r0
0001000000000010 ;r0 = r0 + r2
但是控制台打印了商,旁边有一个空的轮廓框。