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