【发布时间】:2016-08-17 23:19:08
【问题描述】:
我从一本 Raspberry Pi 汇编语言书中的代码开始。它以二进制形式打印出 15:
00000000000000000000000000001111pi@raspberrypi:$
我想在最后添加一个换行符,所以我实现了代码的_newline: 和new: .ascii "\n" 部分。
我重新组装了它,但输出保持不变。我在输出换行符时错过了什么吗?
.global _start
_start:
mov r6, #15
mov r10, #1
mov r9, r10, lsl #31
ldr r1, =string
_bits:
tst r6, r9
moveq r0, #48
movne r0, #49
str r0, [r1]
mov r8, r6
bl _write
mov r6, r8
movs r9, r9, lsr #1
bne _bits
_newline:
mov r0, #1
mov r2, #1
mov r7, #4
ldr r1, =new
swi 0
_exit:
mov r7, #1
swi 0
_write:
mov r0, #1
mov r2, #1
mov r7, #4
swi 0
bx lr
.data
string: .ascii " "
new: .ascii "\n"
strace输出的最后几行是:
write(1, "1", 11) = 1
write(1, "1", 11) = 1
write(1, "1", 11) = 1
write(1, "1", 11) = 1
write(1, "\0", 11) = 1
exit(1) =?
+++ exited with 1 +++
【问题讨论】:
-
尝试使用
strace ./a.out看看你的进程做了什么系统调用。 -
另外,我会通过将字符写入一个 17 字节的缓冲区来实现这一点,并在末尾添加一个换行符。将 ASCII 0 或 1 存储到缓冲区中,然后使用单个系统调用将其写入,而不是为每个字节单独调用
write()。不过,你的方法行得通,只是效率较低。 -
strace 的最后几行给了我这个:write(1, "1", 11) = 1 write(1, "1", 11) = 1 write(1, "1", 11) = 1 写入(1, "1", 11) = 1 写入(1, "\0", 11) = 1 退出(1) =? +++ 以 1 +++ 退出
-
我几乎没有学习手臂组装,所以我只是按照书中的例子,但我也会研究你的方式。
-
我将您的 strace 输出添加到您的问题中,就像您应该拥有的那样,而不是将其作为评论发布。至少您选择了要包含的 strace 输出的正确部分。 :) 它让我在大约 10 秒内找到了解决方案:我只需要问:什么可以用
\0覆盖\n?然后回头看看另一家商店,因为我知道它正在存储相邻的数据。
标签: linux assembly raspberry-pi arm system-calls