Форум: "Прочее";
Текущий архив: 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.64 MB
Время: 0.011 c