Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.12.14;
Скачать: CL | DM;

Вниз

Задачка для разминки мозга   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.7 MB
Время: 0.018 c
6-1270567992
Zoom
2010-04-06 19:33
2014.12.14
Indy 9 IdTCPServer, как узнать IP адрес клиента ?


15-1400163635
RDen
2014-05-15 18:20
2014.12.14
firefox при запуске открывает http://trafmarket.ru/install


6-1274251810
Dmitriy
2010-05-19 10:50
2014.12.14
контроль (учет) трафика WinInet


15-1399904738
Астахов Сергей
2014-05-12 18:25
2014.12.14
Экспорт данных в OpenOffice


15-1399824452
Антоха
2014-05-11 20:07
2014.12.14
Прога для онлайн-магазина