Оптимизация

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 13 янв 2008, 02:03

Ну если al не больше F, то соответсвенно 2 тут варианта:
1) al<A и тогда значение al уменьшится на 6F2) al>=A, тогда значение al уменьшится на C9

З.Ы. Откуда у меня могла взяться привычка проверять раскладку клавишей c символом "C"???
Последний раз редактировалось qwertylol 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 02:15

Советую расмотреть сами диапозоны значений на входе и на выходе
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 13 янв 2008, 02:37

qwertylol писал(а):Source of the post
Ну если al не больше F, то соответсвенно 2 тут варианта:
1) al<A и тогда значение al уменьшится на 6F2) al>=A, тогда значение al уменьшится на C9

Нека :no:
как sbb так и das производят вычитание.
Для подсказки приведу аглоритм их работы
sbb вычитает из источника приемник и флаг CF, и результат заносит в источник
das
1. если младшая тетрада al больше 9 или флаг вспомогательного переноса установлен вычитаем из al 6
2. Если после этого флаг переноса установлен, или младшая тетрада больше 9, вычитаем еще 60h
Последний раз редактировалось a_l_e_x86 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 13 янв 2008, 03:32

как sbb так и das производят вычитание.
Для подсказки приведу аглоритм их работы
sbb вычитает из источника приемник и флаг CF, и результат заносит в источник
das
1. если младшая тетрада al больше 9 или флаг вспомогательного переноса установлен вычитаем из al 6
2. Если после этого флаг переноса установлен, или младшая тетрада больше 9, вычитаем еще 60h

Ну a что у меня не так? Если al=A(sbb установит флаг CF), то вычитаем 69h и ещё 60h итого C9.
Я и под отладчиком проверял, всё сходилось.
Последний раз редактировалось qwertylol 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 12:22

Я бы наверно написал так:

cmp al,10
jb m
add al,7
m:
add al,30h
;
; в довесок
;
cmp al,46h
jbe m2
;a тут чтобы враг не догадался
m3:
xor al,al
or al,3fh
m2:
cmp al,30h
jb m3
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 13:12

Ho на сколько я понимаю, в рельном применении ни каким образом в al не будет значения более 0fh
mov ah,[si]
shr ax,4
shr al,4
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 13:47

Использовать асм в программировании под вынь, имеет мало смысла, не считая оптимизации отдельных функций требующих максемального быстродействия.
Ho даже в стандартных конструкциях вынь программы найдутся места где можно повеселиться
B почти любой программе есть обработчик сообщений, можно написать множество cmp и jxx, но как можно оптимизировать данный участок?
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

AV_77
Сообщений: 3530
Зарегистрирован: 23 фев 2007, 21:00

Оптимизация

Сообщение AV_77 » 13 янв 2008, 15:11

a_l_e_x86 писал(а):Source of the post
Продолжим тему
Что делает такой код?

Код: Выбрать все

cmp al,10
sbb al,69h
das



Это довольно известный прием перевода шестнадцатиричной цифры в символ, т.e. 00h -> 30h, 01h -> 31h, ..., 09h -> 39h, 0Ah -> 41h, ..., 0Fh -> 46h.
Последний раз редактировалось AV_77 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 13 янв 2008, 15:44

AV_77 писал(а):Source of the post
Это довольно известный прием перевода шестнадцатиричной цифры в символ, т.e. 00h -> 30h, 01h -> 31h, ..., 09h -> 39h, 0Ah -> 41h, ..., 0Fh -> 46h.

Известный наверно... у меня плохая привычка пытаться саму доходить до решений, поэтому из чувства сохранения собственого велосипеда стараюсь реже посматривать в известные решения
Последний раз редактировалось master 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test

a_l_e_x86
Сообщений: 985
Зарегистрирован: 02 мар 2007, 21:00

Оптимизация

Сообщение a_l_e_x86 » 13 янв 2008, 16:08

qwertylol писал(а):Source of the post

Ну a что у меня не так? Если al=A(sbb установит флаг CF), то вычитаем 69h и ещё 60h итого C9.
Я и под отладчиком проверял, всё сходилось.

Извиняюсь немного не правильно привел правила, должно быть так:
das
1. если младшая тетрада al больше 9 или флаг вспомогательного переноса установлен вычитаем из al 6
2. Если после этого флаг переноса установлен, или старшая тетрада больше 9, вычитаем еще 60h


AV_77 совершенно верно :yes:
A вообще ход решения inspektor правильный, если б я не ошибся в написании правила, у него тоже получился бы праивльный ответ
Последний раз редактировалось a_l_e_x86 30 ноя 2019, 13:41, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 30 гостей