Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

Суботняя головоломка от Розыча   Найти похожие ветки 

 
Игорь Шевченко ©   (2015-08-24 21:08) [40]


> можно ли использовать старшие слова регистров EAX, EBX,
> ECX, EDX в качестве операндов?


нет


 
Sha ©   (2015-08-24 22:48) [41]

> SergP ©   (24.08.15 19:06) [28]

Честно скажу, функция меня обескуражила, т.к. я в той области уже потоптался.
Проверил все еще раз, ошибок не нашел, зато нашел это:


function Check_IsMZorZM_Sha(A, B: AnsiChar): boolean;
asm
 add al, 56
 sbb dl, 0
 and al, dl
 setz al
 end;


 
Sha ©   (2015-08-24 22:54) [42]

> Sha ©   (24.08.15 22:48) [41]

Также годятся константы: 88, 183, 185, 215, 217.


 
Sha ©   (2015-08-24 22:58) [43]

> Sha ©   (24.08.15 22:48) [41]

Сорри sbb там не нужно, хоть и не мешает:

function Check_IsMZorZM_Sha(A, B: AnsiChar): boolean;
asm
 add al, 56
 and al, dl
 setz al
 end;


 
Sha ©   (2015-08-24 23:15) [44]

Еще раз сорри.
Оказалось, что не то тестировал.
Просьба [41, 42, 43] считать бредом.


 
Sha ©   (2015-08-24 23:50) [45]

> SergP ©   (24.08.15 19:06) [28]
> Правда кол-во инструкций на 1 больше чем [24]

На самом деле меньше, если учитывать передачу параметров.
В exe-файле эти символы стоят рядом.
И вызывать удобнее и быстрее такую функцию:

function Check_IsMZorZM_SergP2(MZ: word): boolean;
asm
 sub ax,$53d4
 sbb dx,dx
 xor ax,dx
 cmp ax,$679
 setz al
end;


 
SergP ©   (2015-08-25 00:16) [46]


> На самом деле меньше, если учитывать передачу параметров.
>
> В exe-файле эти символы стоят рядом.
> И вызывать удобнее и быстрее такую функцию:


да, это я видел, но просто следовал условию [0]:


> function Check_IsMZorZM(A, B: AnsiChar): Boolean;
> begin
> //код писать здесь...
> end;


ибо если менять описание функции, то тогда и в коде

> DayGaykin ©   (22.08.15 17:06) [24]
>
> function Check_IsMZorZM2(A, B: AnsiChar): boolean;
> asm
>  add al, $65
>  add dl, $65
>  mul dl
>  xor ax, $84CE
>  setz al
> end;
>

тоже похоже что возможно первые 2 инструкции можно поменять на одну. (хотя не проверял, не скажется ли возможный перенос из младшего байта в случае с add ax, $6565)


 
SergP ©   (2015-08-25 00:36) [47]


> тоже похоже что возможно первые 2 инструкции можно поменять
> на одну. (хотя не проверял, не скажется ли возможный перенос
> из младшего байта в случае с add ax, $6565)


в крайнем случае вместо этой инструкции можно поставить ror ax,1 (правда константа там другая будет $19ae) - то точно будет работать, проверял еще перед тем как пришла мысль варианта без умножения.


 
Sha ©   (2015-08-25 00:37) [48]

> SergP ©   (25.08.15 00:16) [46]

Точно. Проверил, не скажется.


 
Mystic ©   (2015-08-26 10:33) [49]


int magic[256];

void init()
{
 magic["M"] = 2;
 magic["Z"] = 3;
}

int isMZ(int ch1, int ch2)
{
   return !(magic[ch1] * magic[ch2] - 6);
}


Вместо умножения можно использовать xor, наверное... Тогда magic["M"] = 1; magic["Z"] = 2; вычитать надо троечку.

Метод легко расширить на произвольное количество букв и повторений. Например, если надо детектить MMZ, MZM, ZMM, то получим

int isMZ(int ch1, int ch2, int ch3)
{
   return !(magic[ch1] * magic[ch2] * magic[ch3] - 12);
}


 
manaka ©   (2015-08-26 14:35) [50]

Не знаю как написать точно, но идея такая:
можно составить переменную С=А+В, в результате должна вернуться "истина", если С="MZ" или С="ZM"
Result=(вхождение Z в С)*(вхождение M в C)
Если память не изменяет, то "истина" вернется только при умножении двух "истин"


 
Masterucs ©   (2015-08-26 14:52) [51]


> можно составить переменную С=А+В

ты решила только заглавное сообщение прочитать? )


 
SergP ©   (2015-08-26 22:03) [52]


> SergP ©   (24.08.15 19:06) [28]
>
> Попробовал обойтись без умножения... Правда кол-во инструкций
> на 1 больше чем [24]
>
> function Check_IsMZorZM_SergP(A, B: AnsiChar): boolean;
> asm
> mov ah,dl
> sub ax,$53d4
> sbb dx,dx
> xor ax,dx
> cmp ax,$679
> setz al
> end;


На одну инструкцию улучшил результат, теперь получилось сравняться по количеству инструкций с

> DayGaykin ©   (22.08.15 17:06) [24]

но по прежнему не используя умножение (mul, imul):

function Check_IsMZorZM_SergP(A, B: AnsiChar): boolean;
asm
 mov ah,dl
 lea ecx,eax*8
 ror ax,cl
 xor ax, $4d5a
 setz al
end;


 
Sha ©   (2015-08-27 00:20) [53]

>SergP ©   (26.08.15 22:03) [52]

круть


 
Inovet ©   (2015-08-27 01:27) [54]

Чёт я забыл - в системе команд x86 нет обмена старшего и млажшего слов 16 бит в 32 бит регистрах? Если нет, значит не надо оно, с учётом того, что есть много всякой другой вспомогательной фигни.


 
SergP ©   (2015-08-27 09:30) [55]


> Чёт я забыл - в системе команд x86 нет обмена старшего и
> млажшего слов 16 бит в 32 бит регистрах?


Нормального обмена нет, но вроде как есть команда, которая меняет порядок байтов в 32 битном регистре на противоположный.
типа допустим было $01020304 , а стало $04030201


 
Sha ©   (2015-08-27 09:45) [56]

> Inovet ©   (27.08.15 01:27) [54]

rol, ror


 
Inovet ©   (2015-08-27 09:57) [57]

> [56] Sha ©   (27.08.15 09:45)
> rol, ror

Ну вообще-то да, зачем ещё что-то.


 
DayGaykin ©   (2015-08-27 09:58) [58]


> SergP ©   (26.08.15 22:03) [52]

Очень клево!
Спасибо, теперь я буду знать про инструкцию LEA)


 
Игорь Шевченко ©   (2015-08-27 10:23) [59]


> зачем ещё что-то.


Чтобы быстро менять порядок байт little endian - big endian


 
Inovet ©   (2015-08-27 13:25) [60]

> [59] Игорь Шевченко ©   (27.08.15 10:23)

Это ты имел ввиду из поста на один выше мной отцитированного?
> [55] SergP ©   (27.08.15 09:30)


 
SergP ©   (2015-08-27 18:26) [61]


> DayGaykin ©   (27.08.15 09:58) [58]
>
>
> > SergP ©   (26.08.15 22:03) [52]
>
> Очень клево!
> Спасибо, теперь я буду знать про инструкцию LEA)


Я сам про нее только вчера узнал )))


 
Rouse_ ©   (2015-08-28 19:13) [62]


> SergP ©   (27.08.15 18:26) [61]
> Я сам про нее только вчера узнал )))

Самый эффективный однотактовый метод умножения:
на два: lea eax, [eax + eax]
на три: lea eax, [eax * 2 + eax]
на четыре: lea eax, [eax * 4]
на пять: lea eax, [eax * 4 + eax]
на восемь: lea eax, [eax * 8]
на девять: lea eax, [eax * 8 + eax]

хотя 2, 4 и 8 обычно заменяют на shl


 
SergP ©   (2015-08-28 19:52) [63]


> Самый эффективный однотактовый метод умножения:


угу. И причем ее достоинства на этом далеко не заканчиваются.


 
Rouse_ ©   (2015-08-28 20:05) [64]


> SergP ©   (28.08.15 19:52) [63]
>
> > Самый эффективный однотактовый метод умножения:
>
>
> угу. И причем ее достоинства на этом далеко не заканчиваются.
>

Угу, работа с массивами - просто шикарна, к примеру :)


 
Sha ©   (2015-08-28 20:29) [65]

> Rouse_ ©   (28.08.15 19:13) [62]

на 2 лучше все-таки add eax, eax


 
DayGaykin ©   (2015-08-28 20:34) [66]

Для чего именно создавался множитель в этой инструкции?


 
Rouse_ ©   (2015-08-28 20:36) [67]


> Sha ©   (28.08.15 20:29) [65]
> > Rouse_ ©   (28.08.15 19:13) [62]
>
> на 2 лучше все-таки add eax, eax

Не согласен и мы спорили :)
Все зависит от того какая инструкция пойдет дальше :)


 
Rouse_ ©   (2015-08-28 20:37) [68]


> DayGaykin ©   (28.08.15 20:34) [66]
> Для чего именно создавался множитель в этой инструкции?

С ней нет множителя


 
Sha ©   (2015-08-28 20:50) [69]

> Rouse_ ©   (28.08.15 20:36) [67]

последнее время у меня такое ощущение, что уже не зависит )


 
Rouse_ ©   (2015-08-28 20:54) [70]


> Sha ©   (28.08.15 20:50) [69]
> > Rouse_ ©   (28.08.15 20:36) [67]
>
> последнее время у меня такое ощущение, что уже не зависит
> )

Да я там сам умылся, ес чесно :)


 
Sha ©   (2015-08-28 20:58) [71]

> Rouse_ ©   (28.08.15 20:54) [70]

*а вот еще был случай* у меня в одном из тестов or была быстрее add


 
SergP ©   (2015-08-29 09:07) [72]


> DayGaykin ©   (28.08.15 20:34) [66]
>
> Для чего именно создавался множитель в этой инструкции?


то не множитель, то сдвиг.

а для чего... наверное потому что эта команда называется "вычисление эффективного адреса" и для ее работы используется не АЛУ а блок адресации, и возможно поэтому ИМХО команда LEA реализовывает не новые возможности, а просто делает доступными программисту те возможности, которым уже и так обладает блок адресации. А урезать их смысла нет.


 
SergP ©   (2015-08-29 09:08) [73]

Кстати, почему нет новых задачек\головоломок ?


 
Rouse_ ©   (2015-09-04 19:50) [74]


> SergP ©   (29.08.15 09:08) [73]
> Кстати, почему нет новых задачек\головоломок ?

Накинул следующую: http://delphimaster.net/view/15-1441385083/
Дам подсказку - учитывай ошибки округления в FPU



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.01 c
15-1441200729
DayGaykin
2015-09-02 16:32
2016.07.24
Определить металл


15-1446154204
Юрий
2015-10-30 00:30
2016.07.24
С днем рождения ! 30 октября 2015 пятница


15-1447406179
ksergey
2015-11-13 12:16
2016.07.24
бесплатная панель от FirstVDS сегодня


2-1415683622
Петраррка
2014-11-11 08:27
2016.07.24
Исходник


15-1446991183
K-1000
2015-11-08 16:59
2016.07.24
Какую версию Delphi вы используете и почему?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский