我们正在使用ARM200来学习汇编语言。我有一部分内存,32个整数填充它。我需要能够将这32个整数打印到屏幕上。我可以通过将数字0的ASCII值添加到寄存器中的内容来简单地打印0到9的数字,但是我很困惑如何打印出大于9的数字。
Print LDR r5, [r2] ;load whats in that part of memory to r5.
CMP r5, #9 ;compare if number is greater or less then 9
ADDLE r0, r5, #"0" ;add value in array to ascii value of 0 to print
SWI SWI_WriteC ;Print Value
ADD r6, r6, #1 ;increment counter
ADD r2, r2, #4 ;move portion of memory to the next int.
CMP r6, #32 ;check if you are done printing 32 ints
BNE Print ;if not loop back up to print
MOV pc, r14 ;return
r0是用于打印的寄存器,r2指向内存中所有整数的位置。 r5是我把记忆中的值放入,而r6用于计数器 是的我确实意识到内存中每个数字之间有4个字节的空间,但这对于这个项目并不重要。
答案 0 :(得分:1)
由于你学习(即可能的家庭作业),我只会给出一般建议。
假设您的号码为247,并且您希望逐个打印出它的三位数字。
如何从2
获得数百位247
并在下一次迭代中离开47
?
将该值放入临时变量并将计数器设置为零。然后,当临时值大于99时,从中减去100并将1加到计数器上。
这将为您提供2
的计数器和临时值47
。使用2
输出您的数字(您说明您已经可以这样做了)。
现在转向数十。
将计数器设置回零。
然后,当临时值大于9时,从中减去10并将1加到计数器上。
这将为您提供4
的计数器和临时值7
。使用4
输出您的数字。
最后,单位。
使用最后的余数7
输出最后一位数。
这是一些类似于汇编程序的伪代码,我在另一个答案(稍作修改)中用来做类似的事情。
val = 247
units = val
tens = 0
hundreds = 0
loop1:
if units < 100 goto loop2
units = units - 100
hundreds = hundreds + 1
goto loop1
loop2:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop2
done:
if hundreds > 0: # Don't print leading zeroes.
output hundreds
if hundreds > 0 or tens > 0:
output tens
output units
;; hundreds = 2, tens = 4, units = 7.
另外一件事,所有这些东西都需要进入子程序,以便你可以重复使用它们。上面转换为汇编的那个算法有32个副本将是一段非常繁琐的代码。
答案 1 :(得分:1)
你可以用一个简单的循环,将你的数字除以10并每次存储余数,直到数字最终变为0.你基本上会得到一个0-9的数字数组,你可以然后一次打印一个。您必须在打印前存储它们,因为您将以相反的顺序结束每个数字。例如:
Number | Buffer
123 | { EMPTY }
12 | 3 (123 / 10 = 12, remainder 3)
1 | 3 2 (12 / 10 = 1, remainder 2)
0 | 3 2 1 (1 / 10 = 0, remainder 1)
每次向缓冲区添加数字时,请递增计数器。完成分割后,您的数字现在为0,然后您就可以开始打印了。从count
循环到0
,打印出Buffer + count
处存储的数字。
对于缓冲区,如果你说每个数字最多可以是4个字节(32位),那么你知道十进制中可以表示的最大数字是2147483647(有符号)或4294967295(无符号) 。在这两种情况下,最大的数字位数是10,因此您可以分配10个字节的缓冲区(1个字节足以容纳0-9的每个数字)。
另一种替代方法(我在为不同的芯片执行相同的任务之前已完成)是使用堆栈而不是分配缓冲区,并在循环的每次迭代中将每个数字推送到堆栈。两种方式都相当简单。
我会让你提出代码,因为你的目的是学习如何去做。
编辑:这是我上面描述的常用方法的一些伪代码:
Buffer[10]
Num = 123
count = 0
// Split the number into an array of digits
WHILE Num IS NOT 0
Buffer[count] = Num % 10 // Store the remainder
Num = Num / 10
count++
count-- // count will be 1 more than the amount in Buffer
// Print the digits
WHILE count IS >= 0
PRINT Buffer[count]
count--