Низкоуровневый кодинг Крис Касперски ака мыщъх Хакер, номер #076, стр. 076-116-4 CALL LoadLibrary ;// вызов функции MOV h, EAX ;// EAX содержит возращенное значение Ассемблерные вставки Как же сложно программировать на чистом ассемблере! Минимально работающая программа содержит чертовую уйму разнообразных конструкций, непонятным образом взаимодействующих друг с другом и открывающих огонь без предупреждения. Одним махом мы отрезаем себя от привычного окружения. Сложить два числа на ассемблере не проблема, но вот вывести их результат на экран… Ассемблерные вставки - другое дело. В то время как классические руководства по асму, буквально с первых же строк бросают читателя в пучину системного программирования, устрашая его сложностью архитектуры процессора и операционной системы, ассемблерные вставки оставляют читателя в привычном ему окружении языка Си (и/или Паскаля) и постепенно, безо всяких резких скачков, знакомят с внутренним миром процессора. Они позволяют начать изучение ассемблера непосредственно с 32-разрядного защищенного режима процессора. Дело в том, что в чистом виде защищенный режим настолько сложен, что не может быть усвоен даже гением, а потому практически все руководства начинают изложение ассемблера с описания морально устаревшего 16-разрядного реального режима. Это не только оказывается бесполезным балластом, но и замечательным средством запутывания ученика (помнишь, "забудьте все, чему вас учили раньше…"). По своему личному опыту и опыту моих друзей могу сказать, что такая методика обучения превосходят все остальные как минимум по двум категориям: а) Скорость – буквально через три-четыре дня интенсивных занятий человек, ранее никогда не знавший ассемблера, начинает сносно на нем программировать. б) Легкость освоения – изучение ассемблера происходит практически безо всякого напряжения и усилий. Ученика не заваливают ворохом неподъемной и непроходимой информации: каждый последующий шаг интуитивно понятен и с дороги познания заботливо убраны все потенциальные препятствия. Ну, так чего же мы ждем? Пора программировать. Для объявления ассемблерных вставок в Microsoft Visual C++ служит ключевое слово __asm, а простейшая ассемблерная программа выглядит так: Вставка, складывающая два числа main() { int a = 1; // объявляем переменную a и кладем туда значение 1 int b = 2; // объявляем переменную b и кладем туда значение 2 int c; // объявляем переменную c, но не инициализируем ее __asm{ // начало ассемблерной вставки mov eax, a ;// загружаем значение переменной a в регистр EAX mov ebx, b ;// загружаем значение переменной b в регистр EBX add eax, ebx;// складываем EAX с EBX, записывая результат в EAX mov c, eax ;// загружаем значение EAX в переменную c } // конец ассемблерной вставки // выводим содержимое c на экран // с помощью привычной для нас функции printf printf("a + b = %x + %x = %x\n", a, b, c); } О планах на будущее В следующих статьях этой рубрики мы докажем, что ассемблер это не заумная теоретическая муть, а самый настоящий хардкор. Самомодифицирующийся код, технологии полиморфизма, противодействие отладчикам и дизассемблерам, экплоиты и shell-коды, генетически модифицированные черви, шпионаж за системными событиями, перехват паролей. Это и многое другое станет твоим. |