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

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

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

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

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

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

Уважаемый. Речь идет о встроенном турбо ассемблере, который "удалить" не получится.
"Голая" система со свежеустановленным ЛЮБЫМ вариантом билдера (после BCB6).
Если вдаваться в подробности - работает препроцессор, заменяющий макросы и прочие #define, затем компилер, который в зависимости от наличия asm (блоком или построчно) - передает голую неискаженную строку во встроенный тасм. А уж он (тасм) - получая юникод - возвращает статус ошибки с номером (Operand size mismatch)

Последний раз редактировалось stslam; 22.01.2014 в 16:47.
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 16:48   #12
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Ну хоть здесь есть ясность. Уважаемый. Теперь проясним дальше. Как по-твоему происходит компиляция? С-компилятор переводит программу в асм, а потом скармливает её встроенному tasm? А когда встречает вставки, то скармливает их вообще не трогая?
FataLL вне форума Ответить с цитированием
Старый 22.01.2014, 16:50   #13
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Как работает "глубже" - не вникал.
Цепочка такова:
Препроцессор - базовый компилер - ветвление на bcc dcc tasm и линкер ресурсов (чистых непарсеных строк) - обработка возвратов
stslam вне форума Ответить с цитированием
Старый 22.01.2014, 17:23   #14
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Так вот. Я утверждаю, что если работает компилятор С, то в tasm он ничего не передаёт. Он самостоятельно справляется со всеми вставками, без помощи tasm. А последний работает только в том случае, если в проекте присутствуют файлы "чистого" асма. Отсюда вывод, что опциями tasm ты проблему не решишь, ибо он, как компилятор ассемблера, вообще не используется. И можешь сколько угодно усмехаться.

А теперь по теме. Что будет, если использовать псевдопеременные? Т.е., заменить вставки на
Код:
_AL = (char)'Ю';
FataLL вне форума Ответить с цитированием
Старый 22.01.2014, 17:37   #15
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Еще раз. Как только будет 'Ю' в теле asm вставки - так сразу больше байта. И тут как повезет - занесется или "не тот" байт, или выдаст ошибку operand size mismatch

К слову - я не говорил, что на чистый tasm32.exe передача идет.
Идет на tasm участок кода в исполняемом парсера(в любом бинарном отладчике походи, там модулей дофигища - еще чуть и я за написание кряка готов сесть)
Опции tasma работают и для сишного парсера, выборочно (уровень warning если поменять - видно). Но вцелом ты прав - нет там такой опции.

Можно еще mak файл собрать - чтобы сначала asm генерило, а затем tasm - ило... Пока не проверял - что выдает, отложу "на потом".

Можно выкрутиться массивом символов, числом, макроподстановкой....
Можно по-всякому. Но придется код переделывать сильно. А хотелось бы какую-нибудь спецпрагму или опцию найти.

Убегаю. До завтра.
stslam вне форума Ответить с цитированием
Старый 23.01.2014, 10:05   #16
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Так ничего и не сказал про псевдопеременные. Вообще, странно всё это немного. Может, я что-то не допонимаю? У меня нет, к сожалению, XE, но "шестёрка" генерит абсолютно идентичный код на все варианты.
Код:
asm MOV AL, BYTE(0xAEDE)
asm MOV AL, BYTE('Ю')
_AL = (char)'Ю';

// всё это будет MOV AL, 0xDE
Даже если я пытаюсь запихать целое, генерится пересылка именно младшего байта. В сторону прагм, я думаю, смотреть нет смысла. Надо искать какой-то модификатор для асмовской команды, либо использовать псевдопеременные.
Изображения
Тип файла: png AL.png (41.2 Кб, 53 просмотров)
FataLL вне форума Ответить с цитированием
Старый 23.01.2014, 10:11   #17
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Кстати,
Код:
wchar_t с = 'Ю';

asm MOV AL, BYTE(c) // корректно отсылает 0xDE
_AL = (char) c; // тоже 0xDE
И я убей не пойму, почему у тебя отсылается старший байт...
FataLL вне форума Ответить с цитированием
Старый 23.01.2014, 11:06   #18
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

FataLL
Оппаньки!
Похоже у Вас где-то "сидит" правильная настройка (в опциях проекта) которой я по-скудоумию или невнимательности - не вижу (или настройки по-умолчанию у Вас другие).

Можно кинуть мне Ваш проект для изучения? /*стучусь в аську*/

UPD. Кстати, про _AL я сразу не понял (приношу свои извинения за тупизну), - так работает - но разрывать _asm { ... } код неохота - там пролог/эпилог генерироваться начинает, ну и с AL - это был пример, конструкций поболее будет, не везде выкрутиться можно.
Изображения
Тип файла: jpg 1.jpg (104.5 Кб, 72 просмотров)

Последний раз редактировалось stslam; 23.01.2014 в 13:02.
stslam вне форума Ответить с цитированием
Старый 23.01.2014, 20:54   #19
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Кодировка UTF8? BYTE('Ю') правильно берёт младший байт 0xAE [UTF8 код для буквы 'Ю' - 0xD0AE]. Может, достаточно перевести редактор в win1251?
FataLL вне форума Ответить с цитированием
Старый 24.01.2014, 11:55   #20
stslam
Пользователь
 
Регистрация: 21.01.2014
Сообщений: 12
По умолчанию

Так я сразу об этом и говорил.

Я бы с удовольствием перевел его в 1251.
Но как...

И опять-таки - только в asm - юникод попадает. В сишные конструкции - в зависимости от настройки _TCHAR maps to (если w_char - будет юникод, иначе - char)

Обратите внимание - char c = 'Ю' заносит правильно... (если memcpy или lstrcpy в массив - тоже 1 правильный байт занесет)...
stslam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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