8

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

.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 中的文件描述符,如果设置为 #4,则 r7 指定写入调用。我只是想存储#8,然后打印存储的号码。

4

2 回答 2

7

系统调用 write 将第二个参数 (r1) 作为指向要打印的字符串的指针。您将一个指向整数的指针传递给它,这就是它不打印任何内容的原因,因为您传递给它的内存区域上没有 ASCII 字符。

下面你会发现一个使用系统调用 write 的“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"

最后,如果您想使用系统调用 write 打印数字,您还可以实现 itoa 函数(将整数转换为字符串的函数)。

于 2013-06-28T12:06:43.817 回答
5

嗨,我很欣赏这是一个非常古老的线程,但我已经为此摸索了一段时间,并想分享我的解决方案。也许它会一路帮助别人!

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

这种方法的最大缺点是它当然不能处理任何超过一位数的数字。

我对此的解决方案要丑得多,而且超出了此处答案的范围,但是如果您胃口大,可以在这里看到:

于 2016-02-27T08:55:23.777 回答