当我在x86 Assembly中打印它们时,ANSI转义代码不起作用?

时间:2018-09-22 17:22:58

标签: assembly io x86 nasm

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

1 个答案:

答案 0 :(得分:6)

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 )不以这种方式支持反引号。适用于 NASM YASM 的另一种方法是将字符串分解并分别发出所需的转义序列\033,例如:

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

这将发出一个值为八进制33的字节,后跟字符串的其余部分。带后缀o的值被视为八进制值。此方法适用于 YASM NASM