Sar*_*all 3 assembly printf gcc newline nasm
嗨,我正在尝试编写一些使用printf打印给定字符串的汇编代码.我在.data部分中使用之前声明我的字符串,测试示例如下所示:
extern printf
extern fflush
LINUX equ 80H ; interupt number for entering Linux kernel
EXIT equ 60 ; Linux system call 1 i.e. exit ()
section .data
outputstringfmt: db "%s", 0
sentence0: db "Hello\nWorld\n", 0
segment .text
global main
main:
mov r8, sentence0
push r8
call print_sentence
add rsp, 8
call os_return
print_sentence:
push rbp
mov rbp, rsp
push r12
mov r12, [rbp + 16]
push rsi
push rdi
push r8
push r9
push r10
mov rsi, r12
mov rdi, outputstringfmt
xor rax, rax
call printf
xor rax, rax
call fflush
pop r10
pop r9
pop r8
pop rdi
pop rsi
pop r12
pop rbp
ret
os_return:
mov rax, EXIT ; Linux system call 1 i.e. exit ()
mov rdi, 0 ; Error code 0 i.e. no errors
syscall ; Interrupt Linux kernel 64-bit
Run Code Online (Sandbox Code Playgroud)
我正在编译如下:
nasm -f elf64 test.asm; gcc -m64 -o test test.o
Run Code Online (Sandbox Code Playgroud)
最后运行:
./test
Run Code Online (Sandbox Code Playgroud)
我的输出如下:
Hello\nWorld\n
Run Code Online (Sandbox Code Playgroud)
我真的不想把句子分成以下内容:
sentence0: db "Hello", 10, 0
sentence1: db "World", 10, 0
Run Code Online (Sandbox Code Playgroud)
然后调用打印两次.有没有更好的方法呢?
提前致谢!
Mat*_*ery 10
NASM接受单引号('...')或双引号("...")的字符串,它们是等价的,不提供任何转义; 或者在backquotes(`...`)中,它提供对C风格转义的支持,这是你想要的.
(请参阅文档中的第3.4.2节"字符串".)
要在内存中获取数据中的实际ASCII换行符,而不是字面反斜杠n:
sentence0: db `Hello\nWorld\n`, 0
Run Code Online (Sandbox Code Playgroud)
或者手动完成:
sentence0: db 'Hello', 10, 'World`, 10, 0
Run Code Online (Sandbox Code Playgroud)
YASM(另一个NASM语法汇编程序)不接受反引号,因此手动选项是您唯一的选择.
顺便说一下puts,printf如果您的格式字符串中没有任何实际格式,则可以调用而不是调用尾部换行符.