Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конвертация из hex в char 
:(
    Опции темы
volatile
Дата 13.1.2012, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(500mhz @  12.1.2012,  15:16 Найти цитируемый пост)
на асме эта конверсия в пару строчек получится
написать?
Если реально в пару строчек, то да, напишите.  smile
Да, не. Шучу.

Цитата(borisbn @  12.1.2012,  11:16 Найти цитируемый пост)
 сам не проверял, а поверил volatile в этой теме

да не проверял я ничего, прямо так уж систематически. я просто хотел сказать, что этому придают слишком большую значимость,
то есть мифическая угроза, отвлекает от рельных проблем.
И этот топик, еще одно тому подтверждение.
В коде bsa, нет и намёка на неправильное использование стринга, однако, запуганные этой мифической угрозой программеры, пытаются найти черную кошку в черной комнате, которой там нет. smile 

Еще одна такая проблема big-endian/little-endian. Один знакомый программер очень озабочен был этой проблемой вычитанной у страуструпа, или еще у кого-то из патриархов. Причем писал он исключительно под венду. Я ему говорю, что венда не работает на биг-ендиен, и типа расслабсья.. Но он ни в какую не верил.  smile.
Можно конечно сказать, что это хорошо, и что его код, при необходимости легче будет перенести на биг-едниен, если такая задача возникнет. Но такая задача никогда не возникнет, просто потому-что есть еще 100000001 причина, по которой код не будет работать нигде кроме венды. Так зачем тогда тратить столько сил именно на на этот ендиен, как будто нет других проблем...
эх, ладно, щас опять скажут что я подрываю устои платформанезависимого програмирования....


Это сообщение отредактировал(а) volatile - 13.1.2012, 01:42
PM MAIL   Вверх
500mhz
Дата 13.1.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Код

        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa                  


в AL заносим наш char - 0,1,2,3,4,5,6.7.8.9 - A,B,C,D,F (регистр значения не имеет, коректируем там по ходу)
на выходе в AL бинарное значение 

то есть в примере заносим в AL код буковки D (ascii) = 0x44 или 0x64 в зависимости от регистра
на выходе в AL получаем бинарное значение = 0xD


--------------------

PM MAIL ICQ   Вверх
bsa
Дата 13.1.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



500mhz, интересно, а во что тогда компилятор превратит:
Код
extern int getchar(void);
extern void putchar(char c);
int main()
{
   char c = getchar();
   c -= (c > '9') ? 'A' - 10 : '0';
   putchar(c);
}

gcc (gcc -O1 -c -S prog.c -o prog.S) меня удивил:
Код
        call    _getchar
    movsbl    %al,%edx
    cmpb    $57, %al
    jle    L2
    movb    %dl, %al
    subb    $55, %al
    jmp    L3
L2:
    movb    %dl, %al
    subb    $48, %al
L3:
    movsbl    %al,%eax
    movl    %eax, (%esp)
    call    _putchar
    leave
    ret

PM   Вверх
500mhz
Дата 13.1.2012, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



видимо компилятор не знает о битовых операциях и BCD арифметике )))


--------------------

PM MAIL ICQ   Вверх
bsa
Дата 13.1.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(500mhz @  13.1.2012,  21:48 Найти цитируемый пост)
видимо компилятор не знает о битовых операциях и BCD арифметике ))) 

кстати, а ты уверен в корректности использования "ASCII Adjust After Addition" после операции вычитания?
PM   Вверх
500mhz
Дата 13.1.2012, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



а что не правильно работает разве?


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 14.1.2012, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(bsa @  13.1.2012,  21:37 Найти цитируемый пост)
ты уверен в корректности использования "ASCII Adjust After Addition" после операции вычитания? 

еще более интересен вопрос о корректности ААА, без операции вычитания. 
Там по другому разветвлению, вообще ни одна комманда не влияет на флаг AF
сдедовательно результат будет зависеть от кода который расположен выше, и который здесь не приведен.

от фазы луны, другими словами.
 smile

Добавлено через 9 минут и 44 секунды
Цитата(500mhz @  13.1.2012,  12:58 Найти цитируемый пост)
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa                 


500mhz, Вот перед этим вашим кодом добавьте што-нибудь влияющее на флаг AF,
например:
        mov al, 7
        add al, 9
 и сможете сами ответить на сакроментальный вопрос 
Цитата(500mhz @  13.1.2012,  21:48 Найти цитируемый пост)
а что не правильно работает разве? 



PM MAIL   Вверх
500mhz
Дата 14.1.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



volatile

код как бэ намекает что в начале должно быть xor eax,eax для соблюдений правил "техники безопасности"

Код

        xor eax,eax
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa         


Добавлено через 4 минуты и 12 секунд
по поводу "корректности" команд, есть неописуемый случай (уже классика)

Код

cmp eax, ebx
sbb ecx, ecx


тоже не корректное использование cmp ?


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 14.1.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(500mhz @  14.1.2012,  10:29 Найти цитируемый пост)
cmp eax, ebx
sbb ecx, ecx
тоже не корректное использование cmp ? 
Не вижу никакой связи с предыдущим кодом, и разбирать его это уже полный оффтоп.
Вернемся к нашим баранам.

Для сравнения, код 
Цитата(bsa @  13.1.2012,  14:12 Найти цитируемый пост)
  c -= (c > '9') ? 'A' - 10 : '0';

откомпилированный студией:
Код

cmp     al, 39h
setle   cl
dec     cl
and     cl, 7
add     cl, 30h
sub     al, cl

по-ходу студия еще и без условных переходов сделала. (условнй переход == лишний тормоз)

Это примерно,  тот-же участок, что и ваш:
Цитата(500mhz @  14.1.2012,  10:29 Найти цитируемый пост)
        xor eax,eax
        mov al,"D"
        btc eax,5 - коректируем регистр букавок
        bt eax,6
        jnc .next
        sub eax,0xd
.next:
        aaa         

Цитата(500mhz @  12.1.2012,  15:16 Найти цитируемый пост)
эх а на асме эта конверсия в пару строчек получится

э... не вижу, прямо так уж ошеломляющих преимуществ асма, даже на таком простом коде. 
а уж вероятность ошибиться, как мы и убедились, в разы больше.
smile



PM MAIL   Вверх
500mhz
Дата 14.1.2012, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

а уж вероятность ошибиться, как мы и убедились, в разы больше.

интересно где это я ошибся? 

пс
разве топик называеться АSM VS C ?


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 15.1.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(500mhz @  14.1.2012,  23:51 Найти цитируемый пост)
интересно где это я ошибся? 

почитайте выше, ваш первый код содержал ошибку.
вы ее исправили, (добавив xor).
это кстати вовсе не очевидная ошибка, и при отладке и тестировании она наверняка не всплывет.
а всплывет где-то потом, у юзера, и то по редким стечениям обстоятельств.
(такой тип ошибок, я считаю самыми мерзкими.)

Цитата(500mhz @  14.1.2012,  23:51 Найти цитируемый пост)
разве топик называеться АSM VS C ? 

так вы же сами предложили.  smile 
PM MAIL   Вверх
bsa
Дата 15.1.2012, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



круто студия оптимизировала (не знал про операцию set*). В итоге код получился:
Код
char convert(char al)
{
   char cl = (al <= '9');
   --cl;  //cl = 0x00 или 0xff
   cl &= 0x07; //cl = 0x00 или 7
   cl = cl + '0'; //cl = '0' + 7 или '0' + 0
   al -= '0';
   return al;
}


Это сообщение отредактировал(а) bsa - 15.1.2012, 17:51
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.