Форум: "Прочее";
Текущий архив: 2014.12.14;
Скачать: [xml.tar.bz2];
ВнизЗадачка для разминки мозга Найти похожие ветки
← →
Rouse_ © (2014-04-17 20:09) [80]Точнее "False = 0, True <> False".
Таким образом данный вариант решения полностью совпадает с изначальной постановкой, а именно - вернуть False в случае 90 и 77.
← →
Rouse_ © (2014-04-17 20:12) [81]ЗЗЫ: а побочная сверка с константой 1 (что кстати не верно, ибо TRUE не везде равно 1, и стало быть жертвуем переносимостью) есть уже навесной код за рамками функции и к самой функции не относится.
← →
тупой компилятор (2014-04-17 20:34) [82]Саш, ты не понял:
true xor true всегда должно давать false,
а что дает f076 xor true?
← →
Rouse_ © (2014-04-17 20:41) [83]
> тупой компилятор (17.04.14 20:34) [82]
Чтоб не было придирок можно вернуть изначальное условие, которое я тут не правильно поставил - функция должна возвращать ноль при входных параметрах 90 и 77 :)
← →
тупой компилятор (2014-04-17 20:45) [84]тогда не обманывай себя - пиши
function T(A, B: byte): byte;
← →
Rouse_ © (2014-04-17 20:47) [85]Дословно: "Написать алгоритм, сравнивающий строку из двух символов на равенство "MZ" или "ZM", используя не более одного if (т.е. else if использовать нельзя), имеется в виду, написать код на ассемблере, где JXX используется только при проверке и выводе результата. Алгоритм должен возвращать ноль, в случае если текущая строка не совпадает с одной из двух в условии".
Я это попытался причесать под условия Delphi, бо мало кто будет это на асме реализовавать, а задачка интересная.
← →
Rouse_ © (2014-04-17 20:48) [86]
> тупой компилятор (17.04.14 20:45) [84]
Согласен, так было бы проще, не подумал.
← →
тупой компилятор (2014-04-17 20:51) [87]это совсем другая задача, отличная от [1], и тогда все приведенные в данной ветке алгоритмы можно упростить
← →
тупой компилятор (2014-04-17 21:49) [88]например:
function TestMZ(w: word): integer;
asm
mov dh,al
mov dl,ah
imul dx
sub eax,59410
end;
← →
Rouse_ © (2014-04-17 22:21) [89]
> тупой компилятор (17.04.14 21:49) [88]
> например:
Плохой пример:program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
function TestMZ(w: word): integer;
asm
mov dh,al
mov dl,ah
imul dx
sub eax,59410
end;
var
I: Integer;
begin
for I := 0 to $FFFF do
if TestMZ(I) = 0 then
Writeln(IntToHex(I, 4));
Readln;
end.
← →
Rouse_ © (2014-04-17 22:25) [90]ЗЫ: ну т.е. пример не выводит даже то, что должен (ибо есть нюанс :)
Грубо от перестановки типа результата ничего в итоге не поменяется (впрочем можно и поэксперементировать, кому не лень).
← →
тупой компилятор (2014-04-17 22:50) [91]у меня нормально выводит без нюансов
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
begin
for i:=0 to $FFFF do
if TestMZ(i)=0 then
Memo1.Lines.Add(Format("%d %d",[i shr 8, i and 255]));
end;
← →
Rouse_ © (2014-04-17 23:37) [92]
> тупой компилятор (17.04.14 22:50) [91]
На ХЕ4 ничего не выводится.
← →
Rouse_ © (2014-04-17 23:48) [93]
> тупой компилятор (17.04.14 22:50) [91]
> у меня нормально выводит без нюансов
Зы, дам подсказку, в отличие от Boolean, где достаточно работы с регистром AL, здесь используется весь регистр EAX целиком, а ты в своем алгоритме работаешь только с AL/AH, а шапка может быть заполнена мусором, что в итоге приведет к ложному срабатыванию на проверке test eax, eax на выходе из твоей функции.
← →
Rouse_ © (2014-04-17 23:58) [94]Т.е. грубо все сводится к тем-же 5 строчкам ASM код с контролем старших разрядов EAX, т.к. EAX будет содержать результат от прошлых операций, на показанном выше коде, а именно значение $B9A54D5A на итерации 19802 в показанном выше примере (в виде консоли).
function TestMZ(w: word): integer;
asm
mov dh,al
mov dl,ah
imul dx
sub eax,59410
and eax, $FFFF << из-за отсутствия данной строки работать не будет
end;
← →
тупой компилятор (2014-04-17 23:59) [95]Интересное кино: у меня в D7 шапка после умножения равна нулю, даже если до умножения была ненулевая. Значит, тогда проблему решит and eax,65535
function TestMZ(w: word): integer;
asm
mov dh,al
mov dl,ah
imul dx
and eax,65535
xor eax,59410
end;
← →
Rouse_ © (2014-04-18 00:14) [96]
> тупой компилятор (17.04.14 23:59) [95]
Получим те-же 5 инструкций, а вот если результат изменить на Byte вместо Integer... ;)
← →
тупой компилятор (2014-04-18 00:18) [97]ну, могем и 4 получить
function TestMZ2(w: word): integer;
asm
mov dh,al
mov dl,ah
imul edx
sub eax,457762834
end;
← →
тупой компилятор (2014-04-18 00:20) [98]или опять шапка на XE4?
← →
тупой компилятор (2014-04-18 00:29) [99]так без шапки, но снова 5 команд
function TestMZ3(w: word): integer;
asm
mov dh,al
mov dl,ah
imul edx
and eax,65535
xor eax,59410
end;
← →
тупой компилятор (2014-04-18 00:42) [100]ларчик просто открывался
function TestMZ4(w: word): word;
asm
mov dh,al
mov dl,ah
imul dx
sub eax,59410
end;
← →
тупой компилятор (2014-04-18 02:10) [101]вот еще одно решение в 4 команды
function TestMZ5(a, b: byte): word;
asm
lea ecx, [eax+edx-167]
imul dl
xor ax, 6930
or al, cl
end;
но предыдущее лучше, т.к. там всего 1 параметр
← →
имя (2014-04-18 09:38) [102]Удалено модератором
← →
имя (2014-04-18 10:05) [103]Удалено модератором
← →
имя (2014-04-18 10:13) [104]Удалено модератором
← →
имя (2014-04-18 10:25) [105]Удалено модератором
← →
SergP © (2014-04-18 12:05) [106]
> SergP © (17.04.14 09:57) [44]
>
> > Важный нюанс, код функции не должен содержать логических
> переходов.
>
> А разве они не создаются при использовании сравнения =,
> <> ?
> Hidden (17.04.14 10:01) [45]
>
> Нет
Я об ассемблере имею ограниченное представление. Мои знания в нем ограничены знанием ассемблера 8080, Z80 + еще немножко. Поэтому возник вопрос:
a,b:byte;
c:boolean;
c:=a=b
Там имеются команды позволяющие в случае равенства получить $FF, а в случае неравенства $00 , чтобы обойтись без переходов?
← →
Ega23 © (2014-04-18 12:17) [107]
> в случае равенства получить $FF
Почему $FF? Не $00 вроде как
← →
SergP © (2014-04-18 12:20) [108]
> Ega23 © (18.04.14 12:17) [107]
>
>
> > в случае равенства получить $FF
>
>
> Почему $FF? Не $00 вроде как
ну суть в том, чтобы без переходов получить либо $00, либо $FF а не что-то другое...
← →
Ega23 © (2014-04-18 12:33) [109]Почему -1 то? True - не ноль, вроде как.
← →
SergP © (2014-04-18 12:48) [110]
> Ega23 © (18.04.14 12:33) [109]
>
> Почему -1 то? True - не ноль, вроде как.
Ну в принципе да, но что будет с этим true, если он не ноль, но и не -1 , если его придется использовать в дальнейших логических операциях, типа:
function1 or function2
true and true должно давать true
а если первый true равен допустим $10, а второй $01 то получим $00, т.е. false
← →
Ega23 © (2014-04-18 12:55) [111]
> Ну в принципе да, но что будет с этим true, если он не ноль,
> но и не -1 , если его придется использовать в дальнейших
> логических операциях, типа:
Ord(Boolean(Ordinal))
← →
Sapersky (2014-04-18 14:34) [112]
> Там имеются команды позволяющие в случае равенства получить
> $FF, а в случае неравенства $00 , чтобы обойтись без переходов?
Да:
http://faydoc.tripod.com/cpu/setz.htm
Но, как я уже писал, компилятор не всегда их применяет.
Также подобные команды есть в MMX/SSE/AVX, точнее, там команды сравнения выдают битовые маски, и на их основе делаются псевдо-ветвления.
Ещё начиная с P2 есть условный MOV (CMOV), но почему-то используют его редко.
← →
Rouse_ © (2014-04-19 12:26) [113]MBo вчера филосовски рассудил - задачки не сильно сложные и предложил модифицировать вторую из них.
Итак:
Есть массив чисел. Размер массива 2N+2. В этом массиве 2N дубликаты, а два значения уникально. Надо написать код, который найдет значение этого уникального числа за одну итерацию, т.е. за один проход. Пример ряда: "3, 1, 5, 6, 1, 3".
В этом ряду {3, 3}, {1,1} дубликаты, а 5б 6 — уникальные.
Ломаю голову уже второй час - пока простого варианта решения не наблюдаю :)
← →
Inovet © (2014-04-19 12:34) [114]> [113] Rouse_ © (19.04.14 12:26)
> который найдет значение этого уникального числа за одну итерацию
Значение этих двух уникальных чисел.
← →
Inovet © (2014-04-19 12:34) [115]> [114] Inovet © (19.04.14 12:34)
> Значение
Эти два уникальных числа.
← →
Rouse_ © (2014-04-19 12:38) [116]
> Inovet © (19.04.14 12:34) [114]
Ну да, не доконца подправил текст, ща еще раз:
Итак:Есть массив чисел. Размер массива 2N+2. В этом массиве 2N дубликаты, а два значения уникальны. Надо написать код, который найдет значение этих двух уникальных чисел за одну итерацию, т.е. за один проход.
Пример ряда: "3, 1, 5, 6, 1, 3".
В этом ряду {3, 3}, {1,1} дубликаты, а 5 и 6 — уникальные.
← →
Sha © (2014-04-19 15:29) [117]> Rouse_ © (19.04.14 12:38) [116]
> MBo вчера филосовски рассудил - задачки не сильно сложные и предложил модифицировать вторую из них.
Похоже, ты решил облечить решение )
То, что задача находится в этой ветке уже является подсказкой решающим )
> Есть массив чисел.
Хотелось бы уточнить тип и область возможных значений.
← →
Rouse_ © (2014-04-19 16:09) [118]
> Sha © (19.04.14 15:29) [117]
> Похоже, ты решил облечить решение )
> То, что задача находится в этой ветке уже является подсказкой
> решающим )
Мне это не помогло, сказывается похоже вчерашняя встреча :))
> Хотелось бы уточнить тип и область возможных значений.
Допустим, это будет массив Byte.
← →
Inovet © (2014-04-19 16:51) [119]> [118] Rouse_ © (19.04.14 16:09)
> массив Byte
Чёт там тогда делать?
← →
Inovet © (2014-04-19 17:02) [120]> [119] Inovet © (19.04.14 16:51)
В смысле, второй массив можно заводить или есть решение без него?
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Прочее";
Текущий архив: 2014.12.14;
Скачать: [xml.tar.bz2];
Память: 0.68 MB
Время: 0.032 c