2012-05-10 233 views
1

我想写一个LC3汇编语言程序,需要两个输入数字并打印出x * y = zLC3汇编语言

我可以让它工作的号码0-9然而任何数字上面,我得到奇怪的字母或符号。

另外我怎样才能使它不仅可以只采取每个GETC 1个输入,但两个数字,例如。 10 * 12= 120? 任何帮助,将不胜感激! :)

这是我迄今所做

.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 
LEA R0, stringResult 
PUTS 
ADD R0, R3, R6 ;move result to r0 
OUT ;print result 
HALT 
display1 .STRINGZ "\nenter the 1st no.: " 
display2 .STRINGZ "\nenter the 2nd no.: " 
stringResult .STRINGZ "\nResult: " 
INVERSE_ASCII_OFFSET .fill xFFD0 ; Negative of x0030. 
DECIMAL_OFFSET .fill #48 
.END 

回答

1

你的显示功能的工作原理是将一个数字的'0'基地ASCII值。这是有效的,因为ascii表的排列方式很方便。例如,'0' + 1 = '1',相当于0x30 + 1 = 0x31。但是,如果您可能发现'0' + 12 = '<'。这是因为'0' = 0x30,所以0x30 + 12 (0xC) = 0x3C。看看ascii图表我们看到0x3C = '<'。也就是说,这是一种仅打印出单个数字的有效方法。

这两个问题的答案都在于编写一个迭代处理数字并与它们形成数字的例程。换句话说,您将需要一个循环来确定下一个打印出哪个字符并将其打印出来。

+0

你可以看看这个吗? http://superuser.com/questions/904324/which-of-the-following-instructions-can-reference-a-memory-location-that-is-100 – committedandroider