如何使用ARM200汇编语言打印大于10的数字

时间:2011-10-25 02:45:25

标签: assembly

我们正在使用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个字节的空间,但这对于这个项目并不重要。

2 个答案:

答案 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--