gpt4 book ai didi

assembly - 当我在 x86 程序集中 printf 时,ANSI 转义码不起作用?

转载 作者:行者123 更新时间:2023-12-02 19:12:31 24 4
gpt4 key购买 nike

我正在尝试制作一个简单的 x86 汇编程序(我使用 NASM 作为我的汇编程序),它使用 ANSI 代码将终端文本颜色更改为红色,然后打印一些内容,然后以红色前景打印。代码如下:

; This macro is equivalent to printf(message)
%macro print 1
lea rdi, [rel %1]
call _printf
%endmacro
; Example call:
; print prompt
; Where prompt is something like:
; prompt:
; db "Hiya dude! What's your name?", 0

; These are the terminal colors, they are ANSI codes that, when printed, will change the color of the text.
section .data
COLOR_FORE_RED:
db "\033[31m",0 ; ANSI Fore Red code

%define SetColor_FRed print COLOR_FORE_RED

但是当我尝试使用这些宏时,例如:

SetColorFRed ; Set text color
print Hello ; Print "Hello!:
section .data
Hello:
db "Hello!",0

输出为:

\033[31mHello!  <- Output color is plain old black, not red

为什么不将文本颜色更改为红色?据我所知,这段代码相当于在 C 中使用 printf("\033[31m Hiya!") ,它在我的计算机上运行得很好,并且确实将输出颜色更改为红色。我的平台是 Mac OSX,我在 64 位 x86 中编程,并且运行的是 Intel Core i7 处理器。

最佳答案

NASM 不会将双引号 " 之间的字符串处理为 C 样式字符串。这意味着 C \033\n 等转义序列未经过特殊处理,而是按字面意思发出。NASM 可以解释 C> 样式字符串,如果将字符串放在反引号 ` 之间而不是双引号之间。

修改:

db       "\033[31m",0 ; ANSI Fore Red code

成为:

db       `\033[31m`,0 ; ANSI Fore Red code

此信息可以在 NASM documentation 中找到在 3.4.2 字符串

部分下<小时/>

YASM(类似于NASM的汇编器)不支持这种方式的反引号。适用于 NASMYASM 的替代方法是将字符串分解并分别发出所需的转义序列 \033,例如:

db       33o, "[31m",0 ; ANSI Fore Red code

这会发出八进制 33 值的字节,后跟字符串的其余部分。带有后缀 o 的值被视为八进制值。此方法应该适用于 YASMNASM

关于assembly - 当我在 x86 程序集中 printf 时,ANSI 转义码不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459086/

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