2017-04-26 1 views
0

직사각형의 면적을 계산하는 코드를 생성하고 있습니다. 곱셈을했는데 숫자 0-9 만 표시합니다. 교수님은 2 자리 숫자를 표시하기 위해 10을 루프에서 빼고 루프가 몇 번 발생하는지 계산해야한다고했습니다. 나는 그것을 시험해 보았고 누군가가 나를 도와 줄 수 없다.lc3에 두 자리 숫자를 표시하는 방법

.ORIG x3000 
AND R3, R3, #0 ;r3 stores the sum, set r3 to zero 
AND R4, R4, #0 ;r4 is the counter 
LD R5, INVERSE_ASCII_OFFSET ;inverse ascii offset 
LD R6, DECIMAL_OFFSET ;decimal offset 
;--------------------- 

;storing first input digits 
LEA R0, display1 ;load the address of the 'display1' message string 
PUTS ;Prints the message string 
GETC ;get the first number 
OUT ;print the first number 
ADD R1, R0, #0 ;store input value(ascii) to r1 
ADD R1, R1, R5 ;get real value of r1 

;storing second input digits 
LEA R0, display2 ;load the address of the 'display2' message string 
PUTS ;Prints the message string 
GETC ;get the first number 
OUT ;print the first number 
ADD R2, R0, #0 ;store input value(ascii) to r2 
ADD R2, R2, R5 ;get real value of r2 
;---------------------- 

ADD R4, R2, #0 ;fill counter with multiplier 
MULTIPLICATION: 
ADD R3, R3, R1 ;add to sum 
ADD R4, R4, #-1 ;decrease counter by one 
BRp MULTIPLICATION ;continue loop until multiplier is 0 
;---------------------- 

;Product in R3 
AND R1, R1, #0 ;r1 will hold -10 
AND R2, R2, #0 ;r2 = 10's counter 
AND R4, R4, #0 ;r4 = 1's counter 
AND R5, R5, #0 ;r5 will hold the answer 
LD R1, NEG_TEN ;r1 = -10 
ADD R5, R3, #0 ;copy answer to r5 

Loop1 
ADD R5, R5, R1 ;Product - 10 
BRn EndDec 
ADD R2, R2, #1 ;increment 10's counter by 1 
BRnzp Loop1 
;---------------------- 
LEA R0, stringResult 
PUTS 
ADD R0, R3, R6 ;move result to r0 
OUT ;print result 
HALT 
display1 .STRINGZ "\nenter the length: " 
display2 .STRINGZ "\nenter the width: " 
stringResult .STRINGZ "\nArea: " 
INVERSE_ASCII_OFFSET .fill xFFD0 ; Negative of x0030. 
DECIMAL_OFFSET .fill #48 
NEG_TEN .fill #-10 ; -10 

답변

0

의이 한 자리에 대해 어떻게 작동하는지 살펴 보자 : R0 = 4, 우리는 추가 여기에 '0' 합니다. 4 + '0'= '4'로 인쇄 할 수 있습니다.

이제 R0 = 14라고 상상해보십시오. 우리가 14 + '0'을 할 때 우리는 '>'(ascii 62)를 얻습니다. 우리가 원하는 것이 아닙니다! 우리는 한 번에 각 성격을 고려해야합니다. 즉, 먼저 '1'을 인쇄 한 다음 '4'를 인쇄하는 알고리즘을 생성해야합니다. 이전부터 우리는 1 -> '1'과 4 -> 4를 수행하는 방법을 알고 있으므로 문제는 "어떻게 14를 1 & 4로 바꿀 수 있습니까?"가됩니다.

위치 수를 생각하면 14 = 1x10^1 + 4x10^0이라는 것을 알 수 있습니다. 3 자리 숫자로 이동하면 142 = 1x10^2 + 4x10^1 + 2x10^0을 볼 수 있습니다. 이러한 사실을 살펴보면 142/100 = 1, 142/10 = 14 및 142/1 = 142임을 알 수 있습니다. 이것이 첫 번째 단계이며 첫 번째 숫자를 추출하는 방법을 알 수 있습니다.

그러나 이는 다른 숫자로는 도움이되지 않습니다. 그러나 그 부서가 버디, 모듈러스를 가지고 있음을 기억하면 142/100 = 1과 142 % 100 = 42를 수행 할 수 있음을 알 수 있습니다. 이 한 걸음 더 나아가 42/10 = 4, 42 % 10 = 2임을 알 수 있습니다. 이제 142를 142로 바꾸 었습니다. 우리는 이미 '1' '4' '2' '로 바뀌는 법을 이미 알고 있습니다.

물론 LC3에는 나누기 및 모듈러스 기능이 없지만 해결할 수있는 문제는 독자에게 맡깁니다.

관련 문제