在 LC-3 中打印两位数
Printing double digit numbers in LC-3
最近一直在学习 LC-3,想知道如何打印大于 9 的数字?在这个程序中,我让它询问宽度和长度并将两者相乘以获得形状的面积。我的问题是任何大于 9 的输出都会开始打印一个不接近我想要的字母或数字。我应该怎么做呢?我的代码:
.ORIG x3000
; Reset Registers
AND R0, R0, #0
AND R1, R1, #0
AND R2, R2, #0
AND R3, R3, #0
AND R4, R4, #0
AND R5, R5, #0
AND R6, R6, #0
AND R7, R7, #0
LEA R0, numberone
PUTS
GETC
OUT
LD R3, HEXN30
ADD R0, R0, R3
ADD R1, R0, #0
LEA R0, numbertwo
PUTS
GETC
OUT
ADD R0, R0, R3
ADD R6, R0, #0
LOOP
ADD R2, R2, R1
ADD R6, R6, #-1
BRp LOOP
LEA R0, MESG
PUTS
ADD R0, R2, x0
LD R2, NEG_TEN
ADD R2, R2, R0
BRn JUMP
AND R4, R4, #0
ADD R4, R4, R2
LD R0, ASCII_1
OUT
AND R0, R0, #0
ADD R0, R0, R4
JUMP
LD R3, HEX30 ;add 30 to integer to get integer character
ADD R0, R0, R3
OUT
HALT ;{TRAP 25}
numberone .stringz "\nPlease enter the length: "
numbertwo .stringz "\nPlease enter the width: "
MESG .STRINGZ "\n\nThe Area of the Rectangle is: "
HEXN30 .FILL xFFD0 ; -30 HEX
HEX30 .FILL x0030 ; 30 HEX
NEG_TEN .FILL #-10
ASCII_1 .FILL x0031 ; ASCII char '1'
.END
示例输出:
Please enter the length: 4
Please enter the width: 5
The area of the object is: 20
此代码将始终打印 1
:
LD R0, ASCII_1
OUT
它没有机会像您想要的那样从 4 乘以 5 打印 2
。
下一个字符打印为 :
,因为您在 R4
中有 10
,因为您没有通过重复减法在除法中减去 10
足够的次数。您只减去 10
一次,而 20
需要减去 10
两次(得到 0
作为余数)。
您只需阅读那里的代码就应该能够看到第一个问题。加载 ascii 1
并打印它除了打印 1
之外还能做什么?所以那里缺少一些代码。
后一个问题是一种错误形式(循环一次到几次迭代),这是您在单步调试期间应该寻找的问题。您希望通过重复减法除法得到 0 到 9 之间的余数——绝对不是 10!
边界条件很容易出错。例如,在应该 <=
(或反之亦然)时使用 <
可能会导致关闭一个错误。我们所做的是尝试使用成语来避免这些问题(例如for(int i = 0; i < n; i++)
),但是当成语不适用时,您要怀疑并测试那些边界条件:在边界处,少一个, 再多一个。
最近一直在学习 LC-3,想知道如何打印大于 9 的数字?在这个程序中,我让它询问宽度和长度并将两者相乘以获得形状的面积。我的问题是任何大于 9 的输出都会开始打印一个不接近我想要的字母或数字。我应该怎么做呢?我的代码:
.ORIG x3000
; Reset Registers
AND R0, R0, #0
AND R1, R1, #0
AND R2, R2, #0
AND R3, R3, #0
AND R4, R4, #0
AND R5, R5, #0
AND R6, R6, #0
AND R7, R7, #0
LEA R0, numberone
PUTS
GETC
OUT
LD R3, HEXN30
ADD R0, R0, R3
ADD R1, R0, #0
LEA R0, numbertwo
PUTS
GETC
OUT
ADD R0, R0, R3
ADD R6, R0, #0
LOOP
ADD R2, R2, R1
ADD R6, R6, #-1
BRp LOOP
LEA R0, MESG
PUTS
ADD R0, R2, x0
LD R2, NEG_TEN
ADD R2, R2, R0
BRn JUMP
AND R4, R4, #0
ADD R4, R4, R2
LD R0, ASCII_1
OUT
AND R0, R0, #0
ADD R0, R0, R4
JUMP
LD R3, HEX30 ;add 30 to integer to get integer character
ADD R0, R0, R3
OUT
HALT ;{TRAP 25}
numberone .stringz "\nPlease enter the length: "
numbertwo .stringz "\nPlease enter the width: "
MESG .STRINGZ "\n\nThe Area of the Rectangle is: "
HEXN30 .FILL xFFD0 ; -30 HEX
HEX30 .FILL x0030 ; 30 HEX
NEG_TEN .FILL #-10
ASCII_1 .FILL x0031 ; ASCII char '1'
.END
示例输出:
Please enter the length: 4
Please enter the width: 5
The area of the object is: 20
此代码将始终打印 1
:
LD R0, ASCII_1
OUT
它没有机会像您想要的那样从 4 乘以 5 打印 2
。
下一个字符打印为 :
,因为您在 R4
中有 10
,因为您没有通过重复减法在除法中减去 10
足够的次数。您只减去 10
一次,而 20
需要减去 10
两次(得到 0
作为余数)。
您只需阅读那里的代码就应该能够看到第一个问题。加载 ascii 1
并打印它除了打印 1
之外还能做什么?所以那里缺少一些代码。
后一个问题是一种错误形式(循环一次到几次迭代),这是您在单步调试期间应该寻找的问题。您希望通过重复减法除法得到 0 到 9 之间的余数——绝对不是 10!
边界条件很容易出错。例如,在应该 <=
(或反之亦然)时使用 <
可能会导致关闭一个错误。我们所做的是尝试使用成语来避免这些问题(例如for(int i = 0; i < n; i++)
),但是当成语不适用时,您要怀疑并测试那些边界条件:在边界处,少一个, 再多一个。