bra*_*oom 5 linux assembly gcc 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
Run Code Online (Sandbox Code Playgroud)
它编译并运行,但我没有看到任何打印.根据我的理解,我需要在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"
Run Code Online (Sandbox Code Playgroud)
如果要打印数字,可以使用 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"
Run Code Online (Sandbox Code Playgroud)
最后,如果您想使用 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: " "
Run Code Online (Sandbox Code Playgroud)
这种方法的最大缺点当然是它不处理任何超过一位数的数字。
我对此的解决方案非常丑陋,超出了此答案的范围,但如果您的胃很强壮,您可以在这里看到它:
| 归档时间: |
|
| 查看次数: |
19274 次 |
| 最近记录: |