[英]Can't get newline to print with ARM Linux assembly
我开始使用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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.