在x86汇编中打印它们时,ANSI转义码无法正常工作?

Sec*_*Sam 4 io x86 assembly printf 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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用以下内容时使用这些宏:

SetColorFRed ; Set text color
print Hello  ; Print "Hello!:
section .data
Hello:
    db "Hello!",0
Run Code Online (Sandbox Code Playgroud)

输出是:

\033[31mHello!  <- Output color is plain old black, not red
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*tch 6

NASM不会将双引号之间的字符串"作为C样式字符串处理.这意味着,Ç像转义序列\033,\n等没有特殊处理和字面上发射.如果将字符串放在反引号而不是双引号之间,NASM可以解释C样式字符串`.

修改:

db       "\033[31m",0 ; ANSI Fore Red code
Run Code Online (Sandbox Code Playgroud)

成为:

db       `\033[31m`,0 ; ANSI Fore Red code
Run Code Online (Sandbox Code Playgroud)

此信息可在NASM文档的3.4.2字符串一节中找到


YASM(像汇编程序一样的NASM)不支持这种方式的反引号.适用于NASMYASM的替代方法是打破字符串并\033单独发出所需的转义序列,例如:

db       33o, "[31m",0 ; ANSI Fore Red code
Run Code Online (Sandbox Code Playgroud)

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

  • 如果把它写成普通值,我宁愿使用`27`而不是`33o`,因为我只记得ASCII中的"27"是"逃逸",我认为使用八进制形式没有任何特别的好处?是一些常见的ANSI控制代码吗? (2认同)
  • @ ped7g:我正在使用八进制,因为这就是OP在字符串中表示的方式.我实际上更倾向于使用十六进制中的"1b"for Escape,因为这是我第一次看到80年代早期代表的Escape角色.有些人喜欢小数值27.选择你的毒药.但是对于ANSI控制序列,八进制形式的\ 033是表示它的非常普遍的方式(或\ e`) (2认同)