簡體   English   中英

如何在ARM匯編中打印一個數字?

[英]How to print a number in ARM assembly?

我正在嘗試打印一個我存儲的數字。 我不確定我是近還是遠。 任何幫助將不勝感激。 這是我的代碼:

.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,然后打印存儲的數字。

系統調用 write 將第二個參數 (r1) 作為指向要打印的字符串的指針。 您將一個指向整數的指針傳遞給它,這就是它不打印任何內容的原因,因為您傳遞給它的內存區域上沒有 ASCII 字符。

您將在下面找到一個使用系統調用寫入的“Hello World”程序。

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

        mov r0, #1
        ldr r1, =string
        mov r2, #12
        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"

最后,如果您想使用 syscall write 打印數字,您還可以實現一個 itoa 函數(將整數轉換為字符串的函數)。

嗨,我很欣賞這是一個非常古老的線程,但我已經為此撓頭一段時間了,想分享我的解決方案。 也許它會幫助某人一路走來!

我的目標是在不以任何方式使用 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: " "

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

我對此的解決方案非常丑陋,超出了此答案的范圍,但如果您的胃很強壯,則可以在這里看到:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM