Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2023, 15:14   #1
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию Console + ENABLE_VIRTUAL_TERMINAL_PROCESSING

Приветствую. Пытаюсь повторить пример:
Код:
; test.asm
;
; nasm -fwin64 -o test.o test.asm
; ld -s -o test.exe test.o -lkernel32
;
  bits  64
  default rel

  %define ENABLE_VIRTUAL_TERMINAL_PROCESSING 4

  section .bss

mode:
  resd  1

  section .rodata

msg:
  db    `\033[1;31mH\033[1;32me\033[1;33ml\033[1;34ml\033[1;35mo\033[m\r\n`
msg_len equ $ - msg

  section .text

  ; From kernel32.dll
  extern __imp_GetStdHandle
  extern __imp_GetConsoleMode
  extern __imp_SetConsoleMode
  extern __imp_WriteConsoleA
  extern __imp_ExitProcess

  global _start

_start:
  mov   ecx,-11                 ; STD_OUTPUT_HANDLE
  call  [__imp_GetStdHandle]

  mov   rbx,rax                 ; Preserve handle in RBX.

  ; Enable VT100 on Windows Terminal.
  mov   rcx,rax
  lea   rdx,[mode]
  call  [__imp_GetConsoleMode]
  mov   edx,[mode]
  or    edx,ENABLE_VIRTUAL_TERMINAL_PROCESSING
  mov   rcx,rbx
  call  [__imp_SetConsoleMode]

  ; Write to Console.
  mov   rcx,rbx
  lea   rdx,[msg]
  mov   r8d,msg_len
  xor   r9d,r9d
  push  0
  call  [__imp_WriteConsoleA]

  xor   ecx,ecx
  jmp  [__imp_ExitProcess]
Под fasm
Код:
format PE64 console
entry start
include 'WIN64AX.INC'

section '.data' data readable writeable
 w1		dd 0
 output	dq 0
 msg	du    '\033[1;31mH\033[1;32me\033[1;33ml\033[1;34ml\033[1;35mo\033[m\r\n',0
 cMode 	dq ?

section '.code' code readable executable
  start:
    invoke	GetStdHandle,STD_OUTPUT_HANDLE
    mov		[output],rax
	invoke	GetConsoleMode, [output],  cMode
	mov		rdx, [cMode]
	or		rdx, 4
	or		rdx, 1
	invoke 	SetConsoleMode, [output], [cMode]
	cmp		rax, 0
	jz 		@f

    invoke  WriteConsole,[output],msg,65,w1,0
 @@:
	invoke  Sleep, 10000
    invoke  ExitProcess,0
	
section '.idata' import data readable writeable 	
	library	kernel32, 'kernel32.dll',\
			user32,	  'user32.dll'

	include "api\kernel32.inc"
	include "api\user32.inc"

Выпуск Windows 10 Корпоративная
Версия 21H2
Сборка ОС 19044.2006

В Итоге цвета не меняются. Выводит \ 0 3 3 [ 1 ; 3 1 m H \ 0 3 3 [ 1 ; 3 2 m e \ 0 3 3 [ 1 ; 3 3 m l
mikado3333 вне форума Ответить с цитированием
Старый 21.03.2023, 15:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что байт от слова отличается
p51x вне форума Ответить с цитированием
Старый 21.03.2023, 16:09   #3
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

заменил
Код:
 msg	du    '\033[1;31mH\033[1;32me\033[1;33ml\033[1;34ml\033[1;35mo\033[m\r\n',0
на
Код:
 msg	db    '\033[1;31mH\033[1;32me\033[1;33ml\033[1;34ml\033[1;35mo\033[m\r\n',0
Ни чего не изменилось
Вложения
Тип файла: zip console 64.zip (539 байт, 0 просмотров)
mikado3333 вне форума Ответить с цитированием
Старый 21.03.2023, 16:11   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
format PE64 console
entry start
; Вы используете AX - значит функции без префиксов будут с суффиксом A
include 'WIN64AX.INC'

section '.data' data readable writeable
 w1		dd 0
 output	dq 0
; Для функции WriteConsoleA нужна строка CP866 (из byte, а не из word)
; У fasm нету преобразования символов
 msg	db    27,'[1;31mH', 27, '[1;32me', 27, '[1;33ml', 27, '[1;34ml', 27, '[1;35mo', 27, '[m\r\n',0
 cMode 	dq ?

section '.code' code readable executable
  start:
    invoke	GetStdHandle,STD_OUTPUT_HANDLE
    mov		[output],rax
	invoke	GetConsoleMode, [output],  cMode
	mov		rdx, [cMode]
	or		rdx, 4
	or		rdx, 1
	invoke 	SetConsoleMode, [output], [cMode]
	cmp		rax, 0
	jz 		@f

; Это функция WriteConsoleA т.к. используете WIN64AX.INC
    invoke  WriteConsole,[output],msg,65,w1,0
 @@:
	invoke  Sleep, 10000
    invoke  ExitProcess,0

; Используя WIN64AX.INC нет необходимости добавлять секцию импорта.
; Она уже объявлена в WIN64AX.INC
;section '.idata' import data readable writeable 	
;	library	kernel32, 'kernel32.dll',\
;			user32,	  'user32.dll'

;	include "api\kernel32.inc"
;	include "api\user32.inc"

Последний раз редактировалось macomics; 21.03.2023 в 16:24.
macomics вне форума Ответить с цитированием
Старый 21.03.2023, 16:36   #5
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

macomics, что-то не получается.
Вывело '←[1;31mH←[1;32me←[1;33ml←[1;34ml←[1;35mo←[m\r\n '.
mikado3333 вне форума Ответить с цитированием
Старый 21.03.2023, 17:14   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
format PE64 console
entry start
; Вы используете AX - значит функции без префиксов будут с суффиксом A
include 'WIN64AX.INC'

section '.data' data readable writeable
 w1		dd 0
 output	dq 0
; Для функции WriteConsoleA нужна строка CP866 (из byte, а не из word)
; У fasm нету преобразования символов
 msg	db    27,'[1;31mH', 27, '[1;32me', 27, '[1;33ml', 27, '[1;34ml', 27, '[1;35mo', 27, '[m',13,10,0
 msg.Length = $ - msg
 cMode 	dq ?

section '.code' code readable executable
  start:
    push rax
    invoke	GetStdHandle,STD_OUTPUT_HANDLE
    mov		[output],rax
	invoke	GetConsoleMode, [output],  cMode
	mov		rdx, [cMode]
	or		rdx, 4
	or		rdx, 1
	invoke 	SetConsoleMode, [output], [cMode]
	cmp		rax, 0
	jz 		@f

; Это функция WriteConsoleA т.к. используете WIN64AX.INC
    invoke  WriteConsole,[output],msg,msg.Length,w1,0
 @@:
	invoke  Sleep, 10000
    invoke  ExitProcess,0

section '.idata' import data readable writeable 	
	library	kernel32, 'kernel32.dll',\
			user32,	  'user32.dll'

	include "api\kernel32.inc"
	include "api\user32.inc"
Я попробовал выполнить у себя эту программу. Первый скрин - kconsole от KDE и она правильно поняла управляющие последовательности. Второй скрин - wineconsole. На нём управляющие символы не воспринимаются и выведены как есть даже после включения режима виртуального терминала.
Изображения
Тип файла: png Screenshot_20230321_165852.png (13.9 Кб, 9 просмотров)
Тип файла: png Screenshot_20230321_165930.png (3.8 Кб, 9 просмотров)
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Console Gtnz8 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 27.12.2012 19:37
C# Console Uimbldon C# (си шарп) 3 20.11.2012 12:52
Console Євгеній Бєлік Помощь студентам 0 13.11.2011 14:07
CS 1.6 console zxcasds Фриланс 14 24.04.2011 16:21
console Aleander_beHDeP Общие вопросы C/C++ 6 13.03.2010 15:36