字符串常量中字符的新行未被 nasm 识别



我正在使用Assembler编写一个"Hello world"程序。我已经声明了两个字符串常量,每个字符串的末尾都有换行符n

section .data
    str1: db "abcdn"
    str2: db "efghn"
section .text
    global _start
_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, str1
    mov     rdx, 6  
    syscall
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, str2
    mov     rdx, 6  
    syscall
    mov     rax, 60
    mov     rdi, 0 
    syscall

在我构建并执行了这个代码之后,我得到了以下结果:

$ nasm -f elf64 -o first.o first.asm 
$ ld -o first first.o 
$ ./first 
abcdnefghn$ 

为什么打印出换行符n

您需要在字符串周围使用"后引号"来支持转义序列:

str1: db `abcdn`
str2: db `efghn`

参考:http://www.nasm.us/doc/nasmdoc3.html

3.4.2字符串:

"用后引号括起来的字符串支持C样式-特殊情况下的转义符字符。"

另一种方法是为新行放入ASCII代码0xA:

section .data
    str1: db "abcd", 0xA
    str2: db "efgh", 0xA

最新更新