我从 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 输出是线索:write(1, "\0", 11) = 1
告诉我们你写了一个 0 字节而不是 \n< 的 ASCII 编码
.
当您str r0, [r1]
时,您正在存储 4 个字节。
那家商店的目的地是
.data
string: .ascii " "
new: .ascii "\n"
这是真的:
.data
string: .byte ' '
new: .byte '\n'
因此,每次将 '0'
或 '1'
存储到 string
时,您还会再写入 3 个零字节,造成破坏您的 '\n'
和超出数据部分末尾的 2 个字节。 (它不会出现段错误,因为您不在页面末尾。)
最简单的修复是使用单字节存储:strb r0, [r1]
而不是字大小的 str
。
关于linux - 无法使用 ARM Linux 程序集换行打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007665/