Ассемблерные вставки как тестовый стенд
Как же сложно программировать на чистом ассемблере! Минимально работающая программа содержит чертовую уйму разнообразных конструкций, сложным образом взаимодействующих друг с другом и открывающих огонь без предупреждения. Одним махом мы отрезаем себя от привычного окружения. Сложить два числа на ассемблере не проблема, но вот вывести их результат на экран…
Ассемблерные вставки— другой дело. В то время как классические руководства по ассемблеру (Зубков, Юров), буквально с первых же строк буквально бросают читателя в пучину системного программирования, устрашая его ужасающей сложностью архитектуры процессора и операционной системы, ассемблерные вставки оставляет читателя в привычном ему окружении языков Си (и/или Паскаль) и постепенно, безо всяких резких скачков, знакомит его с внутренним миром процессора. Они же позволяют начать изучение непосредственно ассемблера с 32-разрядного защищенного режима процессора: дело в том, что в чистом виде защищенный режим настолько сложен, что не может быть усвоен даже гением, и потому практически все руководства начинают изложение с описание морально устаревшего 16-разрядного реального режима, что не только оказывается бесполезным балластом, но и замечательным средством запутывания ученика (помните, "забудьте все, чему вас учили раньше…"); По своему личному опыту и опыту моих друзей могу сказать, что такая методика обучения превосходят все остальные как минимум по двум категориям: а) скорость – буквально через три-четыре дня интенсивных занятий человек, ранее никогда не знавший ассемблера, начинает сносно на нем программировать; б) легкость освоения – изучение ассемблера происходит практически безо всякого напряжения и усилий, ни в какой момент обучения ученика не заваливают ворохом неподъемной и непроходимой информации: каждый последующий шаг интуитивно понятен и с дороги познания заботливо убраны все потенциальные препятствия.
Ну так чего же мы ждем? Для объявления ассемблерных вставок в Microsoft Visual C++ служит ключевое слово __asm, а простейшая ассемблерная программа выглядит так:
main()
{
int a = 1; // объявляем переменную a
и кладем туда значение 1
int b = 2; // объявляем переменную a
и кладем туда значение 1
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);
}
Листинг 4 ассемблерная вставка складывающая два числа