Печать двойных ди git чисел в L C -3 - PullRequest
0 голосов
/ 22 апреля 2020

Недавно я узнал о L C -3, и мне было интересно, как мне go печатать число, которое больше 9? В этой программе я сделал запрос ширины и длины и умножил их на два, чтобы получить площадь фигуры. Моя проблема заключается в том, что любой вывод больше 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

Пример вывода:

Please enter the length: 4
Please enter the width: 5
The area of the object is: 20

1 Ответ

1 голос
/ 22 апреля 2020

Этот код будет всегда печатать 1:

LD R0, ASCII_1 
OUT 

У него нет шансов напечатать 2 так, как вы хотели бы из 4 раз 5.


Следующий символ печатается как :, потому что у вас есть 10 в R4, поскольку вы не вычитали 10 достаточное количество раз при делении на повторяющееся вычитание. Вы только вычли 10 один раз, а 20 нужно вычесть 10 дважды (чтобы получить 0 в качестве остатка).


Вы должны увидеть первую проблему просто читая код там. Как можно загрузить ascii 1 и распечатать его, кроме печати 1? Таким образом, здесь есть некоторый пропущенный код.

Последняя проблема - это форма ошибки «один на один» (цикл от одной до нескольких итераций), которую вы должны искать во время одношаговой отладки. Вы хотите, чтобы ваше деление путем повторного вычитания оставляло вам остаток от 0 до 9 - определенно не 10!

Граничные условия очень подвержены ошибкам. Например, использование <, когда оно должно быть <= (или наоборот), может привести к отключению на одну ошибку. Что мы делаем, это пытаемся использовать идиомы, чтобы избежать этих проблем (например, for(int i = 0; i < n; i++)), но когда идиома не применима, вы хотите быть подозрительными и тестировать эти граничные условия: на границе, на один меньше, на еще один.

...