繁体   English   中英

无法使用ARM Linux程序集打印换行符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM