如何在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中有多less个字节,r0中的文件描述符,r7是否指定写入调用,如果它设置为#4。 我只是试图存储#8,然后打印存储的号码。

系统调用写入第二个参数(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" 

最后,如果你想用syscall写打印数字,你也可以实现一个itoa函数(把整数转换成字符串)。

嗨,我明白这是一个非常古老的线程,但我已经挠了一下头,这一段时间,并希望分享我的解决方案。 也许它会帮助一路上的人!

我的目标是打印数字而不求助于使用C ++,尽管我意识到简单地反编译一个tostring() – 或者C ++中存在的任何等价物 – 并且看到这些将会是一条更快的路线。

基本上,我最终创建了一个指向一个空的.ascii字符串的指针.data节,并添加了数字,我想打印+ 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: " " 

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

我的解决方案非常非常丑陋,超出了这个答案的范围,但如果你有一个强大的胃你可以在这里看到: