【问题标题】:ANSI escape codes not functioning when I printf them in x86 Assembly?当我在 x86 程序集中打印它们时,ANSI 转义码不起作用?
【发布时间】:2019-02-26 18:29:06
【问题描述】:

我正在尝试制作一个简单的 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 处理器。

【问题讨论】:

  • @MichaelPetch 哇!谢谢!反引号对我有用,颜色现在是红色。 (还没有尝试过八进制选项)介意发表您的评论作为答案,以便我可以标记它?

标签: assembly io x86 printf nasm


【解决方案1】:

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

修改:

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

成为:

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

此信息可在 3.4.2 字符串部分下的NASM documentation 中找到


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

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

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

【讨论】:

  • 如果把它写成普通值,我宁愿用27而不是33o,因为我只记得“27”在ASCII中是“转义”,我没有看到任何特别的使用八进制形式的好处?是不是一些ANSI控制代码通用?
  • @ped7g :我使用八进制,因为这就是 OP 在他们的字符串中呈现它的方式。实际上,我更偏爱十六进制的1b Escape,因为这是我在 80 年代初第一次看到 Escape 字符的方式。有些人喜欢十进制值 27。选择你的毒药。然而,对于 ANSI 控制序列,八进制形式的 \033 是非常普遍的表示方式(或 \e`)
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 2015-07-11
  • 2018-05-24
  • 2015-09-22
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多