2011-10-25 60 views
0

我们使用ARM200学习汇编语言。我有一部分内存填充32个整数。我需要能够将这32个整数打印到屏幕上。只是添加了数字0到什么是寄存器的ASCII值9很容易的,但我很困惑,你如何打印出的数字大于9如何在ARM200中打印大于10的数字汇编语言

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 - 我可以打印出数字0是用于打印的寄存器,r2指向所有整数的内存位置。 r5是我把内存中的值和r6用于计数器的值。
是的,我意识到在内存中每个数字之间有4个字节的空间,但这对这个项目无关紧要。

+0

类似这样的问题提醒我很感激,其他人做这项工作,这样我就不必: p –

+0

什么是ARM200?你想打印十进制或十六进制或八进制或二进制的数字......? –

+0

ARM200是一个用于Windows XP的装配编程模拟器,与我的教科书一起提供。我确实想打印出十进制数字,并感谢上面和下面的帮助。再次感谢你们。 – gluestick

回答

1

既然你是学习(即,可能的作业),我只会给一般建议。

假设您的号码是247,并且您想要逐个打印出它的三位数字。

如何从247获得百位数2并且为下一次迭代留下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个副本转换为程序集将是非常乏味的一段代码。

+0

非常感谢您的理解,我很欣赏您解释算法的方式。这帮了我很多。 – gluestick

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-- 
+0

非常感谢。我有一种感觉,我必须沿着这些路线做些事情,但我并不确定。谢天谢地,我的号码很小,范围从0到32. – gluestick

+0

不用担心,祝你好运。 ;) – AusCBloke