如何在ARM程序集中打印数字?

时间:2013-06-28 04:57:13

标签: linux gcc assembly arm system-calls

我正在尝试打印我存储的号码。我不确定我是否亲近或离开。任何帮助将不胜感激。这是我的代码:

.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,然后打印存储的号码。

2 个答案:

答案 0 :(得分:4)

syscall 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写入打印数字,还可以实现itoa函数(将整数转换为字符串)。

答案 1 :(得分:4)

嗨,我很欣赏这是一个非常古老的帖子,但我已经对此感到困惑,并希望分享我的解决方案。也许它会帮助一路上的人!

我的目标是打印到数字而不用任何方式使用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