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处理器.
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)不支持这种方式的反引号.适用于NASM和YASM的替代方法是打破字符串并\033单独发出所需的转义序列,例如:
db 33o, "[31m",0 ; ANSI Fore Red code
Run Code Online (Sandbox Code Playgroud)
这将使用八进制值33后跟字符串的其余部分发出字节.带后缀的值o被视为八进制值.此方法应适用于YASM和NASM
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |