2011-10-25 59 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