【发布时间】:2012-01-21 22:26:29
【问题描述】:
您好,我正在尝试编写一些使用 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
然后我编译如下:
nasm -f elf64 test.asm; gcc -m64 -o test test.o
最后运行:
./test
我的输出如下:
Hello\nWorld\n
我真的不想将句子0分成以下内容:
sentence0: db "Hello", 10, 0
sentence1: db "World", 10, 0
然后调用 print 两次。有没有更好的方法?
提前致谢!
【问题讨论】:
-
更好的方法到底是什么?
-
我不想将字符串拆分为多个字符串声明。我只想能够将换行符打印为字符串的一部分,并且只需要在 sentence0 中声明它。
-
你是说 \n:s 是逐字打印的吗?
-
目前他们是,但我不希望他们成为。我希望它们打印为换行符。
标签: gcc assembly newline printf nasm