Ладно, погнали! 1 лайк = 1 факт о программировании на ассемблере

favorite 44
message 37

1) Несмотря на все законы математики, в х86 остаток от деления всегда имеет знак делимого, т.е. бывает и отрицательным.

2) Никогда не пытайтесь взять модуль целого числа методом M: neg X js M Никогда!

3) Большинство компиляторов не понимают FP-констант, и запись mov eax, 1.5 приводит либо к ошибке, либо в eax запишется целочисленная 1.

4) Самое сложное, что можно сделать в SSE одной командой - взять квадратный корень. С синусами и логарифмами ебитесь сами как хотите.

5) Библиотеки под SSE существуют только для Double. Сделать тот же синус для Single - как изобрести велосипед с квадратными колёсами.

6) 64-битная архитектура такая 64-битная, что в ней нет даже 64-битных констант

7) Префикс REP - постдекрементный и может не выполниться ни разу. Об этом часто забывают и мутят огромные циклы.

8) Если бы все программы писали на ассемблере, то процессоры мощнее 80486 до сих пор были бы особо не нужны.

9) В стандартном формате битмапа размер строки всегда кратен 4, даже если в реале нет. Специально для быстрой обработки LODSD/STOSD/MOVSD.

10) Как ни странно, есть ещё люди, уверенные в физическом существовании команды SAL.

11) В SSE зачем-то многие инструкции дублируются (MOVAPS/MOVDQA), да ещё и с разными опкодами. Какие из них быстрее и в чем разница - хз.

12) Идиоты из Intel не смогли сделать деление вида r32 = r32/r32 (без переполнений). Это бесит бесконечно и каждый раз при делении.

13) Абсолютно любую программу с любой "защитой" можно вскрыть заменой одной команды условного перехода на безусловный. Проблема - его найти.

14) В SEE нет целочисленного деления. Вообще. А потому что идитенахуйвотпочему. Не надо вам холопам ничего делить.

15) Прикольно делить на 2, 4, ... командой SAR. Например, -1/2=-1. Можно сутками потом дебажить косяк.

16) Большинство SSE-команд требуют 16-байтного выравнивания, но большинство компиляторов умеют выравнивать максимум на 8. Всё для людей!

17) Соглашение о вызове x64 писал крокодиловый наркоман - только он мог сразу же запороть самый частоиспользуемый регистр RCX.

18) При выходе за границы стека изменением ESP/RSP ошибки не возникает. Так навыделяешь буферов и полдня потом ебёшься где стек кончился?

19) Команда FXTRACT, которая по идее должна тупо разрезать число по битам, внезапно выдаст исключение деление на ноль, если операнд нулевой.

20) На ассемблере можно нарисовать график какой-нибудь функции во весь экран за 10к тактов. Через WinAPI - минимум за 10 млн.

21) Бутсектор для флешки можно написать только на ассемблере.

22) Любой дизассемблер легко наебать, примешав к коду невалидный "мусор" (на самом деле тоже код) и сделав джамп куда-нить внутрь него.

23) Топовые гуру обфускации делают джампы прямо промеж байт опкодов ВАЛИДНОГО кода. Но такая услуга обойдётся дороже разработки самой проги.

24) Зная ассемблер, можно изучить любой ЯП за сутки. Зная только какой-нить сраный Ruby или Питон, ассемблер не получится выучить никогда.

25) Умножить на 2, 3, 4, 5, 8 и 9 можно одной командой LEA без загрузки каких-либо констант и доп.регистров (ну а вдруг вы не знали).

26) Компиляторы Си для микроконтроллеров генерируют настолько убогий код, что после переделки на асме можно поставить МК в 10 раз дешевле.

27) Любую функцию с хорошей (0,00001%) точностью можно аппроксимировать полиномом в интервале [1..2] для очень быстрого расчёта на SSE.

28) В режиме x64 даже такие "монолитные" в x32 регистры, как ESI, EBP и т.п. делятся на слова и байты. Мало ли, может тоже кто не знал))

29) Главное отличие тру асм-программиста от ламера - сканирование массивов в циклах задом наперёд, используя ECX для индексации.

30) Тру асм-программист всегда дёргает ногами AVR через запись 1 в PIN, а не пытаясь выяснить и изменить текущее состояние порта.

31) Количество ошибок в даташитах Atmel таково, что не удивлюсь, если несколько разработчиков из-за них повесились.

32) При массовом сравнении (aka switch) вида cmp je cmp je варианты следует располагать в порядке уменьшения вероятности их выпадения

33) В 8051 под векторы прерываний выделено аж 8 байт, и простые обработчики можно писать прям в них. Например, инкремент 16-битного числа:

34) Самая распространённая и обидная ошибка при программировании AVR - забыть проинициализировать стек.

35) Для безусловного перехода можно сделать jmp [ebx], а для условного - хуй! Приходится изъёбываться: jnz M jmp [ebx] M: ...

И самое-то главное забыл - когда вы пополняете какой-нить баланс ровно на 500 рублей, они вполне могут оказаться 499,9999999999 рублями.

>