Страница 3 из 8

Оптимизация

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

З.Ы. Откуда у меня могла взяться привычка проверять раскладку клавишей c символом "C"???

Оптимизация

Добавлено: 13 янв 2008, 02:15
master
Советую расмотреть сами диапозоны значений на входе и на выходе

Оптимизация

Добавлено: 13 янв 2008, 02:37
a_l_e_x86
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

Оптимизация

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

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

Оптимизация

Добавлено: 13 янв 2008, 12:22
master
Я бы наверно написал так:

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

Оптимизация

Добавлено: 13 янв 2008, 13:12
master
Ho на сколько я понимаю, в рельном применении ни каким образом в al не будет значения более 0fh
mov ah,[si]
shr ax,4
shr al,4

Оптимизация

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

Оптимизация

Добавлено: 13 янв 2008, 15:11
AV_77
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.

Оптимизация

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

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

Оптимизация

Добавлено: 13 янв 2008, 16:08
a_l_e_x86
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 правильный, если б я не ошибся в написании правила, у него тоже получился бы праивльный ответ