даны числа a,b принадлежат к знаковым INT32 bit. число a должно вернуть число принадлежащее {a,b} которое по модулю больше. Обращаю внимание - не абсолютное значение, а реальное. Примеры: 1. a = -12 , b = -1 a <- (-12) 2. a = -7, b = 8 a <- (8) 3. a = 0, b = -16 a <- (-16) 4. a = 16, b = -16 a <- (16) или a <- (-16) (любой из вариантов) Безбранчевый код. Оптимизация по размеру или количеству базовых инструкций.
eax = a ebx = b 9 инструкций 17 байт (использует ecx,edx): Код (Text): mov edx,eax add edx,ebx cmc sbb edx,edx sub eax,ebx sbb ecx,ecx xor edx,ecx and eax,edx add eax,ebx 8 инструкций 16 байт (то же + инвертирует ebx): Код (Text): neg ebx cmp ebx,eax sbb edx,edx add eax,ebx sbb ecx,ecx xor edx,ecx and eax,edx sub eax,ebx
Замечательные задачки, в упор не понимаю как решаются. Сдаеться мне что специалисты по решению задач типа из "Истории Одного Байта", будут цениться на вес золота в отдаленном будущем (если конечно золото не обесцениться).
alpet А ты автора решений попроси вежливо, он объяснит, он очень добрый, но стеснительный - думает, что и так все всё понимают, зачем лишние комментарии писать?
alpet Ага, конечно, это когда сегодня гигабайты стоят копейки, в отдаленном будущем каждый байт будет на счету ))
The Svin Нет. Я знаю что в моем телефоне ОЗУ столько же сколько в первой SonyPlayStation. Подобные тенденции наблюдаются во всех девайсах.
Ну вобщем мы поняли друг друга. Тут видишь ли различные реалии нас окружают. Я типичный низкоуровневик. Человек которого приглашают когда работа не стандартная. Нужно сделать по интерфейсу и кодам досель неведомое, либо нужно сделать по ресурсам в два раза дешевле, чтобы полмиллиона дивайсов стали всего то на полтинник дешевле. Что с'экономить 25 миллионов промеж делом
Слушай, и у меня нет :\ Я думал я один такой ) ЗЫ. Что то мы топик засорили Чёрное Зеркало наверное вздрагивает каждый раз видя что появился новый пост - думает кто-то его код побил. А это мы просто лясы точим )
_DEN_ З\П у меня очень скромная даже по Российским меркам. Но работа интересная. Правда, сложноватая.
Антивирус в биос зашить, сэкономить одну болванку в дистрибутиве популярной игрухи, ..., червячка неприметного сделать, эксплоит в стек утрамбовать, ... Всё это и по сей день актуально. За это деньги платят. А во встроенных девайсах (embedded т.е.) вообще море примеров можно найти. В одном популярном микроконтроллере ровно 1Кб памяти, которая разделяется кодом, данными, стеком/хипом, векторами прерываний... Если проге этого килобайта не хватает, можно подключить флеш, который стоит в 2 раза больше, чем сам микроконтроллер. В промышленных масштабах это означает бешенные деньги. 2 _DEN_: У меня нет мобильника потому что он мне не нужен просто. 2 The Svin: Точно. Может Айс придёт почистит эту грязь. Сорри за флуд.
Так как описать словами это очень тяжело, то я поясню только второй вариант. Если взять три беззнаковых числа A,B и C, то чтобы проверить, попадает ли B в интервал [A,C) или (A,C] нужно произвести два сравнения B<A и B<C. Если выполняется только одно из этих условий, то B попадает в интервал [А,С) при A<C, или в интервал [C,A) при С<A. Проверку условия |B|<|A| можно заменить проверкой того, что B или -B попадают в интервал (-A,A) если A>0, или в интервал (A,-A) если A<0. Если же рассматривать числа B,A и -А как беззнаковые, то нужно проверить что B не попадает в интервал (A,-A) или в интервал (-A,A). В данном коде по результатам двух стравнений формируются маски в регистрах ECX и EDX. После чего над ними выполняется операция XOR. Ну а в последней операции получается B если B попадает в интервал [min(A,-A),max(A,-A)), то есть больше по модулю, или A в противном случае. Хоть левая граница и входит в интервал, но в условиях задачи при равенству модулей можно вернуть любое число. Код (Text): neg ebx ;-b cmp ebx,eax ;(-b)-a sbb edx,edx ;(-b)<a add eax,ebx ;(-b)-(-a) sbb ecx,ecx ;(-b)<(-a) xor edx,ecx ; and eax,edx ;(-b)-(-a) или 0 sub eax,ebx ;(-b)-(-a)-(-b) или -(-b)