簡體   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