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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2020, 18:32   #1
Тимох
Пользователь
 
Регистрация: 13.04.2015
Сообщений: 32
По умолчанию Вывод кириллица

Привет! Подскажите как можно вывести строку на русском в консольном приложении.
Код:
.386
.model flat, stdcall
option casemap:none
include C:\MASM\INCLUDE\WINDOWS.INC
include C:\MASM\INCLUDE\kernel32.inc							
includelib C:\MASM\LIB\kernel32.lib
.data
	msg BYTE "Вывод в консоль", 0dh, 0ah
	cWritten DWORD ?
	stdout DWORD ?
.code
	main:
		invoke GetStdHandle, STD_OUTPUT_HANDLE
		mov stdout, eax
		invoke WriteConsoleA, stdout, ADDR msg,\
			sizeof msg, ADDR cWritten, 0
		invoke ExitProcess, 0
	end main
Использую компилятор MASM.
Компилирую так:
ML.EXE /c /coff "Prog.asm"
LINK.EXE /SUBSYSTEM:CONSOLE "Prog.obj"
При запуске получившейся программы, в консоли символы отображаются не корректно.
Тимох вне форума Ответить с цитированием
Старый 01.12.2020, 20:11   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Тимох Посмотреть сообщение
вывести строку на русском
перед выводом преобразуй строку в OEM:
Код:
invoke  CharToOem,ADDR msg,ADDR msg
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.12.2020, 21:37   #3
Тимох
Пользователь
 
Регистрация: 13.04.2015
Сообщений: 32
По умолчанию

Спасибо за ответ! Добавил вызов данной процедуры перед процедурой вывода. Вывод поменялся, выводит другие символы, но всё равно какой то непонятный набор символов.
Тимох вне форума Ответить с цитированием
Старый 02.12.2020, 07:23   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

строка должна заканчиваться нулём:
Код:
msg  BYTE  "Вывод в консоль",0
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.12.2020, 08:57   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
строка должна заканчиваться нулём:
Зачем? Размер строки передается в функцию.
waleri вне форума Ответить с цитированием
Старый 02.12.2020, 09:07   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
передается в функцию.
CharToOem() ориентируется на терминальный нуль
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.12.2020, 09:12   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

есть ещё другой вариант - сменить общую кодировку консоли на 1251 например так:
Код:
       invoke   SetConsoleOutputCP,1251  ;// для вывода на консоль
       invoke   SetConsoleCP,1251        ;// для ввода с клавы
но для этого шрифт должен быть установлен "Lucida Console"
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.12.2020, 19:35   #8
Тимох
Пользователь
 
Регистрация: 13.04.2015
Сообщений: 32
По умолчанию

Спасибо за ответы!
Добавил в конец строки 0, вывод не поменялся.
Затем попробовал сменить общую кодировку и задать шрифт "Lucida Console" - вывод изменился, но всё равно он не правильный.
Тимох вне форума Ответить с цитированием
Старый 02.12.2020, 20:09   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Тимох Посмотреть сообщение
вывод изменился, но всё равно он не правильный.
не знаю что там может быть не правильно - у меня всё выводит.
например вот вывожу 2-раза в разных кодировках:
Код:
; fasm-code
; stdIn = 3, stdOut = 7
;-----------------------
format   pe console
include 'win32ax.inc'
.code
start:  invoke   SetConsoleTitle,title             ; заголовок окна
        invoke   WriteConsoleA,7,msg,len,wSize,0   ; выводим в кодировке DOS/OEM-866

        invoke   SetConsoleOutputCP,1251           ; меняем кодировку на СР-1251
        invoke   WriteConsoleA,7,msg,len,wSize,0   ; выводим ту-же мессагу

@exit:  invoke   ReadConsoleA,3,buff,1,wSize,0     ; ждём клавишу..
        invoke   ExitProcess,0                     ;
.end start
;---------
.data
title    db  'CodePage 1251',0
msg      db  13,10,'Вывод на консоль!',0
len      =   ($ - msg)-1   ; длина строки без терминального нуля
wSize    dd  0
buff     db  0
Изображения
Тип файла: png 1251.png (6.0 Кб, 27 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.12.2020, 20:25   #10
Тимох
Пользователь
 
Регистрация: 13.04.2015
Сообщений: 32
По умолчанию

Вот полный текст программы:
Код:
.386
.model flat, stdcall
option casemap:none		
include C:\MASM\INCLUDE\WINDOWS.INC
include C:\MASM\INCLUDE\kernel32.inc
include C:\MASM\INCLUDE\user32.inc							
includelib C:\MASM\LIB\kernel32.lib
includelib C:\MASM\LIB\user32.lib
.data
	msg BYTE "Вывод в консоль", 0
	cWritten DWORD ?
	stdout DWORD ?
.code
	main:
		invoke   SetConsoleOutputCP,1251
		invoke   SetConsoleCP,1251
		invoke GetStdHandle, STD_OUTPUT_HANDLE
		mov stdout, eax
		invoke WriteConsoleA, stdout, ADDR msg,\
			sizeof msg, ADDR cWritten, 0
		invoke ExitProcess, 0
	end main
Вывод не верный.
Изображение не получается добавить.
Тимох вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кириллица Hemul Visual C++ 7 29.12.2010 19:38
Сокеты и кириллица tools Visual C++ 3 27.12.2010 14:39
Кириллица D.O.G БД в Delphi 4 18.10.2010 06:42
Кириллица и BDE mixer94 БД в Delphi 0 23.12.2009 12:59
кириллица в HLP andrey4623 Общие вопросы Delphi 2 12.06.2009 16:42