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

标签 linux assembly raspberry-pi arm system-calls

我从 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/

相关文章:

linux - 使用 ssh 在 linux 上安装 java

java - 加载启动文件

ios - Apple 处理器上的独家预留颗粒 (ERG)

c++ - 在位流中扫描位模式的最快方法

c++ - 内部编译器错误 : Segmentation fault On Raspberry Pi

c++ - 确定下载的文件是否与现有文件相同的函数

python - 如何检查参数是否存在于python中

将 C 和汇编编译为纯机器代码?

python - 使用 Nginx 在树莓派上部署 Flask

gcc - 如何解决交叉编译中的 crt0.o 链接问题?