Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1399824452
Антоха
2014-05-11 20:07
2014.12.14
Прога для онлайн-магазина


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


3-1301462832
vlgrig1961
2011-03-30 09:27
2014.12.14
HELP!!!Странная сортировка при GROUP BY


3-1301760583
worldmen
2011-04-02 20:09
2014.12.14
Запрос списка уволенных


15-1400013003
Юрий
2014-05-14 00:30
2014.12.14
С днем рождения ! 14 мая 2014 среда





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский