我正在尝试打印我存储的号码。我不确定我是否亲近或离开。任何帮助将不胜感激。这是我的代码:
.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,然后打印存储的号码。
答案 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: