2013-06-28 37 views
5

我想打印一個我已經存儲的數字。我不確定我是否接近或離開。任何幫助將不勝感激。這裏是我的代碼:如何在ARM程序集中打印數字?

.data 
.balign 4 
a: .word 4 

.text 
.global main 
main: 
     ldr r0, addr_of_a 
     mov r1, #8 
     str r1, [r0] 
write: 
     mov r0, #1 
     ldr r1, addr_of_a 
     mov r2, #4 
     mov r7, #4 
     swi #0 
     bx lr 

addr_of_a: .word a 

它編譯和運行,但我沒有看到任何打印。據我所知,我需要在r1中開始打印的地址,r2中有多少個字節,r0中的文件描述符以及r7是否指定寫入調用(如果它設置爲#4)。我只是試圖存儲#8,然後打印存儲的號碼。

+3

您需要將數字轉換爲字符串(例如'首先是123' - >'「123」')。 – Michael

回答

4

系統調用寫入需要第二個參數(r1)指向要打印的字符串的指針。你傳給它一個指向一個整數的指針。這就是爲什麼它不會打印任何內容,因爲在傳遞給它的內存區域上沒有ASCII字符。

下面你會發現一個使用系統調用寫入的「Hello World」程序。

.text 
.global main 
main: 
     push {r7, lr} 

     mov r0, #1 
     ldr r1, =string 
     mov r2, #20 
     mov r7, #4 
     svC#0 

     pop {r7, pc} 

.data 
string: .asciz "Hello World\n" 

如果要打印數字,可以使用C庫中的printf函數。就像這樣:

.text 
.global main 
.extern printf 
main: 
     push {ip, lr} 

     ldr r0, =string 
     mov r1, #1024 
     bl printf 

     pop {ip, pc} 

.data 
string: .asciz "The number is: %d\n" 

最後,如果你想與系統調用寫你也可以實現itoa函數(一個整數轉換爲字符串)打印數量。

+1

我已經搜索瞭如何將整數轉換爲ARM程序集中的字符的答案。我得到的所有結果都解釋瞭如何在C中做到這一點。如果沒有C庫在ARM中進行這種轉換,我該如何去做? –

+0

請記住,字符只不過是ASCII碼中的數字。數字48對應ASCII中的字符'0'。數字49到'1'等等。因此,如果要將整數轉換爲char,則可以將48添加到整數,然後將結果作爲一個字節(而不是整數,因爲ints有4個字節)存儲在某個內存位置。然後,如果您將該內存位置的指針發送到系統調用寫入,它將打印該字符。 –

3

嗨,我明白這是一個非常古老的線程,但我已經摸了一會兒,並想分享我的解決方案。也許它會幫助一路上的人!我只是意識到打印到數字而不以任何方式使用C++,但我意識到只是簡單地反編譯一個tostring() - 或者C++中存在的任何等價物 - 並且看到它會出現什麼樣的結果更快的路線。

基本上,我最終創建了一個指向部分.data中的空白.ascii字符串的指針,並在打印該數字之前添加了我想要打印的數字+ 48。

+48當然是指具體數字的ascii索引號。

.global _start 

_start: 
MOV R8, #8 
ADD R8, R8, #48 

LDR R9, =num 
STR R8, [R9] 

MOV R0, #1 
LDR R1, =num 
MOV R2, #1 
MOV R7, #4 
SWI 0 

.data 

num: 
.ascii: " " 

這種方法的最大缺點是,它當然不能處理超過一位數的任何數字。

我該解決方案是非常非常醜陋超越這個答案,這裏的範圍,但如果你已經強健脾胃,你可以看到它here

+0

許多彙編器讓你在表達式中使用ASCII常量,例如'#'0''而不是'#48'。如果ARM彙編程序允許的話,IDK可以使用,但它可以與x86的GNU彙編程序一起使用。另外,你不需要'.ascii'來初始化,因爲你在寫之前不會讀它。 –

+0

很高興知道。我會檢查一下,會救了我一些麻煩! – Tombas