Экранирующие коды ANSI не работают, когда я печатаю их в сборке x86? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь создать простую программу сборки 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

Почемуэто не меняет цвет текста на красный?Насколько я могу судить, этот код эквивалентен использованию printf("\033[31m Hiya!") в C, который прекрасно работает на моем компьютере и меняет цвет вывода на красный.Моя платформа - Mac OSX, я программирую на 64-битной x86 и использую процессор Intel Core i7.

1 Ответ

0 голосов
/ 22 сентября 2018

NASM не обрабатывает строки между двойными кавычками " как строки типа C . Это означает, что C экранирует последовательности типа \033, \n и т. Д. Специально не обрабатываются и испускаются буквально. NASM может интерпретировать строку стиля C , если поместить строку между обратными галочками `чем двойные кавычки.

Изменить:

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

Быть:

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

Эта информация может быть найдена в NASM документация в разделе 3.4.2 Строка символов


YASM ( NASM как ассемблер) не поддерживает обратные меткиТаким образом, альтернатива, которая работает для NASM и YASM , состоит в том, чтобы разбить строку и выдать требуемую escape-последовательность \033 отдельно с чем-то вроде:

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

При этом создается байт со значением восьмеричного 33, за которым следует остальная часть строки. Значения с суффиксом o обрабатываются каквосьмеричные значения.Этот метод должен работать с YASM и NASM

...