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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2014, 18:11   #1
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию asm вставка, прошу помощи (1 байт воспринимается как много, кириллический символ)

Вопрос необычный.
На старом (BCB 6 Professional) ассемблерные вставки работали прекрасно
Перешли на XE - и начался кошмар портирования.

asm MOV AL, 'Z' //воспринимает нормально
asm MOV AL, 'Ю' //воспринимает как юникод (больше одного байта)

Смысл в следующем - при компиляции подлый IDE расценивает кириллицу как юникод и шлет ассемблеру 2(4) байта вместо одного. Как сказать "хочу работать с однобайтовыми символами"?

Ошибку на кволити централ я ежегодно выкладываю - но воз и ныне там.
Саппорт тоже больше полугода говорит, что "в работе".

ПРОСЬБА - не предлагать вводить числа вместо букв - очень большой объем исходников.
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 12:39   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

В любом случае предстоит правка исходников, так что вариант "числа вместо букв" имеет место быть. Можно наваять программулину, которая бы выискивала в коде вставки на асме и меняла бы 'Ю' на 222 // 'Ю' или (char)'Ю'. Ну или или поиском-заменой, но по-очереди...
FataLL вне форума Ответить с цитированием
Старый 22.01.2014, 12:48   #3
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Ясно, значит опций для tasm'a нет? Или Вы их не знаете?
Для си ведь опция "_TCHAR maps to" - подходит.
Мне кажется, что решение есть. Только сокрыто от непросвещенных
Кстати, если Вы напишете в ассемблерной вставке char('Ю') или (char)'Ю' - ассемблер вам не простит и выдаст ошибку.
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 14:59   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Ну, с (char) я прогнал, признаюсь. Но надо помнить, что асмовские вставки обрабатывает компилятор С, а не tasm [поэтому и никакие опции tasm не помогут]. Следовательно, синтаксис используется именно С. Например, синтаксис асма
Код:
MOV AL, $0F
во вставке не проканает, будет ошибка. Надо
Код:
asm MOV AL, 0x0F
FataLL вне форума Ответить с цитированием
Старый 22.01.2014, 15:20   #5
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от FataLL Посмотреть сообщение
... асмовские вставки обрабатывает компилятор С, а не tasm
Да-а-а?

Код:
BYTE a = 'Ю';
при "_TCHAR maps to" - засунет в a именно 'Ю';
Иначе - белиберду.

Именно поэтому - в опциях проекта есть вкладка со свойствами tasm'a
А вот как ему сказать аналогичное (_TCHAR maps to char)?

Я ведь пример привел - упрощенный.
В реальных условиях - в десятках мегабайт исходников (речь ТОЛЬКО про ассемблерные вставки в проекте, размер которого в исходниках превышает 5 гиг) - автоматика невозможна, в принципе. А ручной труд приводит к неизбежным ошибкам.
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 15:21   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А если a будет CHAR то засунет что?
А кстати, в MOV инструкции указан регистр AL - как вообще в него можно засунуть 2/4 байта?

Последний раз редактировалось waleri; 22.01.2014 в 15:24.
waleri вне форума Ответить с цитированием
Старый 22.01.2014, 15:26   #7
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

А Вы в курсе, что такое "неяное приведение типов"?
Учитывая, что BYTE - это typedef от unsigned char?
если char a написать - будет то же самое, только рассматриваемый байт станет знаковым.
sizeof(BYTE) и sizeof(char) - это (в нашем случае) единица!
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 15:35   #8
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

stslam
Ты вообще просто умничаешь или проблему решаешь? Хотя бы проверяешь или просто теоретизируешь? Попробуй
Код:
asm MOV AL, BYTE('Ю')
FataLL вне форума Ответить с цитированием
Старый 22.01.2014, 16:20   #9
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Нет, я не умничаю. Я просто не понимаю, как можно абстрактно кидать непроверенные идеи - поэтому вынужден указывать на некоторые огрехи в понимании того, кто пишет. Да, мне хотелось бы решить проблему. Скажу больше - я уверен, что существует какой-то допключ для tasma в опциях проекта (или что-то иное), но про это я нигде не нашел. А в кволити централ - молчат (ежегодно вопрос репорчу - почти что с каждой новой версией )

По поводу вышесказанного (BYTE('Ю')).
За такой трюк - спасибо, конечно...
Но я его знал (это первое, что я попробовал сделать) - ошибку выдавать перестанет, но в AL занесется другой байт от юникодовского символа (в моем случае с 'Ю' - там окажется 0xAE вместо 0xDE) т.к. сработает парсер tasm'a.

А в рядом стоящую конструкцию
Код:
char a = 'Ю';
- попадет 0xDE - так как тут сработает сишный препроцессор и компилер (_TCHAR maps to char)
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 16:33   #10
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

stslam
Насчёт "огрехов", "указать" и прочей важняцкой иронии. Удали куда-нибудь tasm и скомпилируй проект со вставками. Компилируется?
FataLL вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи Пупсончик PHP 11 12.01.2014 10:42
Прошу помощи, сам никак не могу понять как делать (строки на Си) Роман64 Помощь студентам 0 14.12.2013 17:28
Символ и Байт tonatas Общие вопросы Delphi 4 15.09.2010 00:54
[Делфи] Как сделать чтобы символ много раз повторялся (без массивов) zotox Помощь студентам 4 01.05.2009 22:10
С паскалем как и у многих проблемы,прошу помощи. Две задачи: интегральная и графическая. Loyal Помощь студентам 3 27.09.2007 09:46