gpt4 book ai didi

gcc - 用 printf 程序集打印新行

转载 作者:行者123 更新时间:2023-12-01 07:29:38 30 4
gpt4 key购买 nike

嗨,我正在尝试编写一些使用 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

然后调用打印两次。有没有更好的方法来做到这一点?

提前致谢!

最佳答案

NASM 接受单引号 ( '...' ) 或双引号 ( "..." ) 中的字符串,它们是等效的,并且不提供任何转义;或在反引号 ( `...` ) 中,它提供对 C 样式转义的支持,这正是您想要的。

(见 section 3.4.2, "Character Strings", in the documentation。)

要在内存中的数据中获取实际的 ASCII 换行符,而不是文字反斜杠 n:

sentence0: db `Hello\nWorld\n`, 0

或者手动执行:
sentence0: db 'Hello', 10, 'World`, 10, 0

YASM(另一个 NASM 语法汇编器)不接受反引号,因此手动选项是您唯一的选择。

顺便说一句,你可以调用 puts而不是 printf如果您的格式字符串中没有任何实际格式(省略尾随换行符)。

关于gcc - 用 printf 程序集打印新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533408/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com