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