繁体   English   中英

在 LC-3 中打印两位数

[英]Printing double digit numbers in LC-3

最近一直在学习 LC-3,想知道如何打印一个大于 9 的数字? 在这个程序中,我让它要求宽度和长度,并将两者相乘以获得形状的面积。 我的问题是任何 output 大于 9 它开始打印一个字母或数字不接近我想要的。 我应该如何 go 这样做? 我的代码:

.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

示例 Output:

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作为余数)。


只需阅读那里的代码,您应该能够看到第一个问题。 除了 print a 1之外,加载 ascii 1并打印它怎么做? 所以那里有一些缺失的代码。

后一个问题是一种逐个错误的形式(循环一次到几次迭代),这是您在单步调试期间应该寻找的问题。 您希望通过重复减法得到的除法余数在 0 到 9 之间——绝对不是 10!

边界条件很容易出错。 例如,当它应该是<= (或反之亦然)时使用< ,可能会导致一个错误。 我们所做的是尝试使用成语来避免这些问题(例如for(int i = 0; i < n; i++) ),但是当成语不适用时,您需要怀疑并测试这些边界条件: 在边界处,少一,多一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM