Дневники чайника. Чтива 0, виток0

Знакомство с MASM32 и Win32-программированием

Мне приходит довольно много писем с просьбами рассказать о MASM'е больше. И я решил слегка переделать эту главу.

Кроме того, я уже написал справочные статьи для тех, кто не застал времена MS-DOS. Если интересно, загляните в следующий виток

Как получаются программы?

До сих пор мы писали все примеры в Hiew'e, но этот способ крайне извращенный. Я использовал его только для того, чтобы вы увидели настоящий Асм. Вначале очень трудно отличить высокоуровневые наслоения от самого языка Ассемблер, и некоторое время я сам путал команды процессора и директивы.

Но теперь, когда вы видели язык во всей его наготе, можно слегка приодеть его.

Нормальные программы пишут в обычном текстовом виде, а не как мы раньше (каждую строку сразу транслировали в машинную команду). Такой текстовый вид называется исходным, а файлы - исходниками, или сырцами (от английского source).

Текст исходника можно писать где угодно, хоть в Ворде (при установленном фильтре простого текста). На вкус, на цвет... Я пишу в RadAsm'e. Это целая среда для разработки приложений, очень удобно. Однако на первых порах рекомендую писать просто в редакторе Far'а, можно подключить к нему специальный плагин Colorer. Этот плаг подсвечивает синтаксис многих языков программирования. Но всё это не обязательно. Тут каждый сам себе берлогу выстилает.

Когда исходный текст набран и сохранён, его можно компилировать.

За процесс получения готовой программы отвечает компилятор, и состоит этот процесс из двух основных этапов.

  1. Исходный текст преобразуется в промежуточный файл. Это делает транслятор (в случае с MASM'ом он называется ml.exe).
  2. Затем создаётся готовый исполняемый модуль в определённом формате. То есть программа. Это делает линковщик (в случае с MASM'ом он называется link.exe).

Значит, для того чтобы делать программы, нужно иметь текстовый редактор и компилятор, который состоит из двух основных частей - транслятор и линковщик.

Всё остальное не обязательно, однако реальные программы Win32 используют внешние функции, стандартные константы и переменные, ресурсы и много другое. Всё это требует дополнительных файлов, которые мы и видим в...

MASM32 SDK

Это очень распространённый пакет, собранный Стивеном Хатчисоном (Hutch).

Важно понять, что MASM32 вовсе не компилятор, а сборник для программирования под Win32, в который входит 32-битный компилятор MASM.

Сегодня (С наступающим, 2012-м, годом!) я использую пакет MASM32 версии 10.

Описывать всё, что входит в пакет MASM32 SDK, - не вижу смысла. Лучше сосредоточиться на самом компиляторе.

Матрос, мы сегодня выходим из гравитационного пояса Солнечной системы. Перед гиперскачком нужно проверить и настроить всё оборудование.

Из чего состоит компилятор MASM?

Основных файлов всего два:

ml.exe - транслятор. Он преобразует исходный текст в obj-файл (объектного формата COFF или OMF),

link.exe - линковщик. Создаёт готовый исполняемый exe или dll модуль (в формате для DOS, Windows...).

Эти файлы включены в основной состав MS Visual Studio (и в .NET).

При желании можно скачать в открытом доступе самые новые версии вместе с Visual Studio Express (или в обновлениях) на сайте MS.

Правда, я не вижу в этом особого смысла (в следующем витке описана причина).

Установка и настройка MASM32

Ну, для начала хорошо бы его иметь. Можно скачать с wasm.ru или с сайта автора.

1. Перед установкой отключите чрезмерно бдительные антивирусы (Каспер в первую очередь).

2. Устанавливать пакет советую на тот диск, где будут ваши исходники.

Теперь полезно прописать в системе путь к файлам компилятора.

В Win7 это можно сделать так:

В меню "пуск" правый клик на "Компьютер" > Свойства > Дополнительные параметры системы > закладка "Дополнительно" > Переменные среды.

Здесь в списке системных переменных нужно изменить значение переменной "PATH". Дописать в конце строки:

;D:\MASM32\bin

(не пропустите точку с запятой и вместо "D" укажите букву диска на котором установлен MASM32).

Поскольку редактор исходных файлов Quick Editor я не использую (уж больно он убогий), на этом можно считать подготовку MASM32 к работе завершенной.

Было бы неплохо знать, как вообще проходит процесс написания программы. Здесь я могу рассуждать только теоретически, так как сам не написал еще ни одной серьёзной программы. :))) Однако кое-что об этом знаю и с радостью поделюсь своими представлениями.

Реальный процесс разработки программы

Знающие люди говорят, что это творческий процесс. Из чего можно сделать вывод, что дело это крайне личное.

Но общие правила здесь тоже имеются.

  1. Постановка задачи
  2. Создание алгоритма (в той или иной степени)
  3. Кодирование на конкретном языке
  4. Попытка компиляции. Если счетчик ошибок не ноль, прыг на шаг 3 или даже 2
  5. Удивление, что оно хоть как-то заработало
  6. Если счетчик найденных ошибок не ноль, то прыг на шаг 1
  7. Я пока так оставлю, а потом ещё доделаю
  8. Если обстоятельства (обычно лень) не позволяют продолжить - проект умирает. Или на шаг 1

Примерно так я делал небольшую программку для личного пользования.

Научить вас ставить задачи я даже пытаться не буду, сам не умею.

Создавать алгоритмы вас научит Кнут, это его стихия, а я могу только восхищаться.

Дональд Эрвин Кнут - Великий Автор, его трёхтомник можно взять на сайте int3.net (после регистрации). Мне кажется, человек, который не читал Кнута, программистом себя называть не имеет права (сам я, кстати, тоже не читал :).

А если серьёзно, то абсолютное большинство существующих учебников и литературы о программировании не может выжить и семи лет, потому что такие книги ориентированы на изучение возможностей того или иного языка (как мои статьи). Кнут же на протяжении полувека(!) учит создавать реальные программы, а не оболочки для простого ввода/вывода. Думаю, вы поняли, что его книгу хорошо бы купить. Цена, правда, хорошая, но трёхтомник того стоит.

Итак, вернёмся к бренной жизни.

Кодирование на конкретном языке - вот о чем мы тут толкуем. Правда не надо забывать, что программа ещё должна работать под конкретной системой.

Win32

Многие считают, что мир форточек устроен по законам Майкрософт, но это лишь очень поверхностный взгляд. Как бы ни старались специалисты этой конторы, они тоже вынуждены подчиняться правилам Intel. Так что главное отличие DOS-среды от Windows - это то, что последняя опирается на защищённый режим процессора (Protected Mode - PM).

Кардинальное отличие PM от Real Mode - новый (довольно хитрый) механизм работы с памятью, и он сильно изменил жизнь программистов.

Win32 использует страничную адресацию памяти, которая является надстройкой над сегментной адресацией защищённого режима.

Несмотря на то, что работа с памятью в PM устроена сложно и запутанно, внешне всё выглядит элементарно. По крайней мере в Windows адресацию сделали довольно удобной.

В данном случае советую всем начать именно с внешнего осмотра. Ну если, конечно, вы самые смелые, самые умные и уже готовы разбирать всё по винтикам изнутри, тогда берите учебник по i80386 процессору и читайте про селекторы, таблицы дискрипторов, разбирайтесь, как в PM при страничной адресации формируется физический адрес из линейного. Лучше, конечно, начать с рассылки Broken Sword'a.

Но что-то мне подсказывает, что вам пока рано браться даже за популярное изложение особенностей PM :).

Сам я уже год как пытаюсь подступиться к этой теме, просветление уже где-то рядом. :)

Внешний осмотр Win32.

Что же мы имеем после загрузки форточек:

Исполняемые файлы PE-формата делятся на секции. Должна быть минимум одна секция (секция кода), но файл может иметь и другие секции для разных целей (данные, ресурсы, служебные секции и т.д.).

А ещё нужно знать, что в защищённом режиме существуют 4 уровня привилегий. Нулевой самый сильный, 3-й самый слабый. Эти уровни называют кольцами (ring0,1,2,3).

Win32 использует только ring0 для ядра и драйверов и ring3 для прикладных программ.

Таких поверхностных данных вполне достаточно, чтобы мы могли дальше разумно изучать программирование на Ассемблере, и приступить к программированию WinAPI.

По крайней мере сам я о защищённом режиме и о том, как его используют форточки знаю немногим больше :(.

Так что будем учиться вместе.

Первый пример Windows-программы

Давайте рассмотрим, как может выглядеть маленькая программа для Win32, написанная под MASM.

prax05.asm:

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive
;#########################################################################
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
;#########################################################################
    .data
	MsgBoxCaption db "It's the first your program for Win32",0
	MsgBoxText    db "Assembler language for Windows is a fable!",0
;#########################################################################
    .code

start:
	invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
	invoke ExitProcess, NULL
end start

Языка Ассемблер здесь нет! Этот текст будет преобразован в запускаемый файл формата PE (Portable Executable - портируемый exe-формат). То есть стандартную программу для форточек.

Попробуйте набрать в файл "prax05.asm" все эти строки, большая часть которых, кстати сказать, - директивы MASM'a.

...Хотя это как раз можно и не набирать, ещё успеете натыкаться :), возьмите мой файл.

Компилировать программу новичку проще всего так (читатели меня всё-таки убедили =):

1. Открыть редактор исходных файлов "Quick Editor" (икона "MASM32 Editor" на рабочем столе).

2. Открыть или набрать в нём пример.

3. После всех изменений обязательно нужно сохранить пример и обязательно на тот диск где установлен MASM32.

4. Для самой компиляции нужно выполнить пункт меню Project > Build All.

5. Должно появиться консольное окошко с отчётом компилятора (если консоли нет, значит, по какой-то причине компиляции не было).

Всё.

Запустить пример можно из того же Quick Editor'a кнопкой "Run File" или пунктом меню Project > Run Program.

Если вы планируете работать с компилятором на разных дисках, то самый грубый, но быстрый и универсальный, способ решить проблему компиляции – тупо скопировать папку MASM32 в корень всех дисков, где будет проходить компиляция программ.

Хочу предостеречь юные умы от выражений типа "иконка открывает MASM".

В корне неправильные слова влекут неправильные выводы и действия.

Ещё раз обращаю ваше внимание: MASM – это компилятор, он состоит из двух частей (ml.exe и link.exe). Обе части не имеют другого способа общения с пользователем кроме как через командную строку. А иконка на рабочем столе открывает программу-посредник под названием "Quick Editor", которая для компиляции всего лишь запускает файл build.bat.

И тут мы переходим к следующему уровню пользования компилятором.

Другой способ компиляции программ - использовать файл build.bat без посредника (описание в следующем витке).

В командной строке ОСи (В Far'e внизу или в "Пуск > Все программы > Стандартные > Командная строка") набираем следующее:

build prax05

! Разумеется, текущей папкой должна быть папка с исходником.

! Имя файла в командной строке пишите без расширения.

! Расширение у файла должно быть asm.

! файл должен быть на диске с пакетом MASM32 в корне.

После нажатия Enter вызовется бат-файл. Его задача превратить текстовый файл (исходник) в готовую программу (бинарник). Для этого он выполняет ml.exe с параметрами

"/c /coff prax05.asm"

Если в исходнике нет явных ошибок, появится файл prax05.obj. И далее выполнится link.exe, который и создаст готовую Win-программу.

На выходе мы имеем два файла. Один - объектный, он нам не пригодится, это для нас промежуточный файл. Второй - exe, сами знаете, что с ним делать.

Ошибки будут - это я гарантирую. Опечатки обычно быстро находятся, так как компилятор сообщает тип ошибки и строку, которая её вызывает.

Однако это далеко не всегда означает, что ошибка именно в этой строке. Тут нужно головой думать. Подозреваю, что она у вас работает хорошо, раз мы с вами добрались до Windows. Но если у вас недостаточно знаний пользователя и из-за этого не собирается даже пример prax05.asm, - не расстраивайтесь. Прочитайте главу следующего витка. Должно помочь и уж, по крайней мере, поднимет ваш "уровень юзера". Да, да, у вас всё получится...

Поздравляю, матрос! Мы в гиперпространстве.

Полноценная программа для Windows. Её уже не исследуешь в CodeView. Для отладки форточных программ мы запаслись OllyDbg.

Хорошо бы настроить и его (цвета, шрифты, размер и пути в ini-файле). Это у вас займёт некоторое время, ко всему надо привыкнуть. Я всё-таки надеюсь, вас не испугает такая небольшая программка весом в 2Mb, ведь вы наверняка настраивали и более навороченные приложения. Кроме того, недавно хорошие ребята, потрудившись наславу, сделали русский help, который можно взять тут.

Спасибо: deNULL, HyPeR, name, Wenden.

И ещё есть вводная статья Bit-hack'a http://cracklab.ru/art/ollydbg.php, за что ему тоже огромное спасибо.

Exe-файл формата PE содержит кучу всякой ерунды, которая, впрочем, необходима для запуска Win32-программы. Сложного там ничего нет, позже вы скорее всего познакомитесь с устройством PE-формата, а сейчас нужно понять лишь одно. На начало исполняемого кода программы в памяти указывает Entry Point (EP - точки входа). В разных программах она может указывать на разные адреса. Но в простых примерах, собранных build.bat'ом, адрес первой команды будет 401000h. Значение EntryPoint в таком случае будет = 1000h, плюс Image base 400000h = 401000h.

Про PE-формат мы, наверное, ещё поговорим, и даже очень плотно, ну а сейчас...

Откройте prax05.exe в OllyDbg. Для этого достаточно загрузить Olly и открыть программу как обычный документ в форточках. После работы Win-загрузчика Олли покажет вам первую инструкцию в окне кода (ориентируясь именно на EP). Исследовать этот пример вам пока не надо, через регистры здесь слишком трудно разобраться.

Внешний вид отладчика OllyDbg (png 11,737b).

Нужно заметить, несмотря на то, что Ollydbg выглядит как обычная программа, это всё-таки отладчик и у него есть свои ограничения. Рекомендую, например, закрывать его каждый раз, как вам понадобится загрузить новую программу.

Мы узнаем, как работает этот пример, но прежде остановимся на исходнике.

Весь код из исходника, кроме двух строк, будет во всех программах Win32 под MASM'ом, поэтому вы должны знать, что он означает. Но не воспринимайте это слишком серьёзно. Там будет много длинно-умных слов. За такими словами очень часто прячется дребедень.

Хочу, чтобы вы поняли одну простую вещь. Совсем скоро вы будете знать команды Асма, и если вы поймёте основы программирования, а затем познаете интерес математики :), то каждый из вас сможет написать собственный компилятор для программ Ассемблера, возможно, не хуже MASM'a или FASM'a. Вы сможете сами придумывать всякие директивы, псевдокоманды, макросы, плагины и новые удобные фишки. Но команды процессора - совсем другое дело. Кроме того, что они в процессоре и изменить их нельзя (уточнение), большинство из команд имеет под собой математическое основание, заложенное в структуру цифровых технологий. Поэтому приоритет нужно отдавать в пользу команд процессора. А директивы MASM'a и все страшные слова за ними воспринимайте поверхностно. Я бы вообще не объяснял их (как Калашников в первых уроках), если б не знал, как сильно отвлекает внимание новичка непонятная строка в исходнике.

Теперь можно приступать к разбору этих самых директив.

Писать каждый раз такой код заново не надо. Это каркас программы для форточек. Мало того, к этому каркасу будут добавляться такие же постоянно повторяющиеся вещи. Создали один раз файл-заготовку - и далее можно вписывать туда только полезный код.


;#########################################################################

Я уже не раз говорил, что после точки с запятой идёт комментарий. Значит, MASM такую информацию не воспринимает. Можно писать всё что хочется.


      .386

Это директива, указывающая компилятору, что в программе будут использоваться команды процессора i80x386.

В exe эта информация записывается в самом начале после заголовка PE. Если интересно, найдите в exe-файле буквы PE. Потом идут два нулевых байта, так как заголовок PE - это dword (4 байта). В следующем слове (двух байтах) как раз и будет информация о командах процессора, которые используются программой. Всё, от 386-го до сегодняшних 32-битных Intel-совместимых процессоров, обозначается кодом 014Сh. Для нас такая информация бесполезна, а вот директива ".386" обязывает нас не использовать новые команды, иначе программа не соберётся, пока мы не исправим эту директиву на ".486" или ".586" :).


      .model flat, stdcall

Директива ".model" задаёт модель памяти flat для нашей программы. Модель flat лучше переводить: сплошная модель, а не плоская, как многие пишут.

Stdcall - это "уговор" о том, кто будет чистить параметры (функция, которую вызвали, или сам вызывающий). Мы всегда будем использовать вариант "функция чистит свои параметры". Он и называется stdcall. Однако такое объяснение далеко не полное, и я вернусь к параметру stdcall при объяснении вызова функций. К этому моменту вы уже будете знать, что такое стек.

От директивы .model явным образом зависит скомпилированный код в объектном файле и также зависит формат получившегося исполняемого файла.


      option casemap :none  ; case sensitive

Это просто. Всё уже объяснено в комментарии. В этой строке включается чувствительность к ПРОПИСНЫМ или строчным символам. То есть "МЕТКА" и "метка", "Имя" и "имя" будут уже не одно и то же!

На exe это никак не отражается.


;#########################################################################
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib

Include - директива для подключения файлов (их расширение не обязательно должно быть inc). В подключаемых файлах может быть всё то же самое, что и в основном файле. То есть исходный код программы, данные, макросы (тоже код), комментарии и т.д. Причём вы можете вставлять инклуды, например, в середине кода, а продолжать программу уже в том файле.

В этих трёх inc-файлах в текстовом виде содержатся описания констант, структур и прототипов функций Windows. Далее я всё объясню, и вы поймёте, что это очень просто - как словарь или каталог товаров.

Вы можете перенести нужные описания в наш файл, и подключать inc'и не придётся, только это неудобно.

Includelib - директива для подключения файлов импорта. Я сам только что в первый раз задумался: а что в lib-файлах? Думаю, что вам сегодня объяснять это не нужно. Просто там информация о системных библиотеках, на основе которой будет сформирован вызов API-функций в нашей программе.

В exe-файл в данном случае из inc'ов не попадёт ни строчки кода, но компилятору они нужны для преобразования двух полезных строк (invoke) в машинный код. А из lib-файлов будут взяты две строки кода и данные, которые в exe запишутся в директорию импорта (всё тот же PE-формат).


;#########################################################################
    .data

Вот это очень интересная строка. Тоже директива.

Чтобы разделить код и разного рода данные, в exe-файлах существуют секции.

У каждой секции свои атрибуты и они тоже напрямую связаны с защищённым режимом. Это позволяет стабилизировать работу программ и упорядочить процесс написания. Считается, что машинный код менять не нужно, значит, для него подойдёт атрибут read only (только чтение). А данные (как теперь считается) выполнять не нужно, значит, можно в секции данных выключить атрибут исполняемого кода. Слава Богу, что всё это только теоретически (пока). Любая секция может содержать и код, и данные, и соответствующие атрибуты. Так что сейчас можно воспринимать секции только как полезную для программистов вещь.

Итак, секция данных объявляется директивой ".data", и это выставляет в ней нужные для данных атрибуты.

Так же, как мы вписывали строки текста в конце файла (после кода программы), эта секция по умолчанию будет размещаться в exe-файле после кода.


	MsgBoxCaption db "It's the first your program for Win32",0
	MsgBoxText    db "Assembler language for Windows is a fable!",0

Здесь от MASM'a только db. Перед ним идут названия переменных. После db идёт содержание переменной, то есть текстовые или цифровые данные. Если данные текстовые, то они помещаются в кавычках или апострофах. А если данные просто байты, то так и пишут через запятую.

Добавьте в этой секции вот такую строку:

LaLa    db  00,0FFh, 11d, 0ABh, 01010101b

Теперь соберите файл ещё раз (старые obj и exe будут стёрты build.bat'om).

Несмотря на то, что переменная LaLa в коде не использовалась, в готовой программе будут эти байты:

00 FF 0B AB 55

Найдите их, загрузив пример в отладчик OllyDbg.

Я уже говорил, что обычно мы будем заканчивать строку текста нулевым байтом. Теперь вы видите, как это пишется в синтаксисе MASM'а.

Str1 db "строка",0

или так:

Str2 db 'строка',00h

В файле будет одно и то же: байты символов и 00.

А Str1, Str2 - это имена переменных, они могут быть любые, лишь бы не нарушали правил, описанных в help-файлах MASM'a.

Осталось объяснить, что такое db - одна из ряда однотипных директив инициализации данных и их резервирования. Длинные слова, мало что значат.

DB - сокращение от Data in Bytes (данные в байтах). Есть ещё DW (Data in Words), и DD (Data in Dwords), и ещё несколько аналогичных, побольше. Суть только в том, что запятая в DB разделяет байт, а в DD запятая разделяет 4 байта. Пример.

В исходнике так:

Str1     dd    0, 1, 0FFFFFFFFh

В файле будет:

00 00 00 00   01 00 00 00   FF FF FF FF

В исходнике так:

Str1     db    0, 1, 0FFh

В файле будет:

00 01 FF

А строка

Str1     db   0,1,0FFFFFFFFh

вызовет ошибку при сборке файла - размер в последней запятой не тот.

Вот и все основные премудрости представления целочисленных данных без знака (то есть положительных целых чисел) в MASM'e. Хотя нет, забыл сказать, что можно ещё объявлять резерв. Данные, которые на момент старта программы ещё не появились. Для чего это делается?

Допустим, в программе много промежуточных данных. Вписывая их в секцию неинициализированных данных (.data?), мы экономим в размере файла. Пока программа не стартовала, никаких данных в этой секции нет, а вот во время загрузки OS выделяет память сразу под все данные.

На первых порах можно спокойно писать все данные в секцию .data. Файл от этого больше не станет, а наоборот, будет только меньше. В PE-формате есть много всяких тонкостей, одна из них - это выравнивание секций. В большинстве программ в конце каждой секции есть нули, посмотрите в Hiew'e, и вы увидите, сколько места пропадает. Если я ничего не путаю, то секция должна быть кратна 512 байтам (200h). Значит, если у вас нет данных на эту сумму, то лучше не заводить новую секцию ".data?" а писать всё в ".data".

Здесь закончилась секция данных...


   .code

...и началась секция кода.

Это единственная секция, без которой программу не собрать. Но я ещё раз повторяю: ".code" вовсе не означает, что данных сюда класть нельзя. Правда, если данные изменяются и они в секции кода - это вызовет проблему (не те атрибуты секции). Хотя руками можно всё :).


start:

Вот мы и добрались до нашей первой метки. Метки в exe-файл не идут. Первая метка начинает код программы. Можно написать хоть "tuki_puki:", лишь бы в конце кода было "end tuki_puki". Что и сообщит MASM'у, где кончилась программа, а самое главное - где она началась.

Далее мы всё время будем использовать метки. Они начинают строки, к которым нам нужно прыгать. При сборке программы компилятор подставляет адреса команд в памяти вместо обращений к меткам. Это гораздо удобнее, чем писать:

JMP  00

Такая команда будет ошибочна, так как, я уже сказал, EP будет указывать на разные адреса в разных программах. Пока что адрес в памяти для первой инструкции будет 401000, а если код программы усложнится, то адрес может стать другим. Если вы запишете:

JMP  start

то больше об адресах беспокоиться не надо. В exe окажется правильная маш.команда, а на Асме она будет выглядеть "JMP 00401000" или куда укажет метка.


	invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
	invoke ExitProcess, NULL

В этих двух строчках и скрывается сама программа.

Первая строка вызывает API-функцию MessageBox и передаёт ей необходимые параметры.

Вторая строка выполняет действие, похожее на int 20 в DOS. Это завершающий код с параметром NULL.

На самом деле в коде будет не NULL, а нулевой байт (00h). Это значит, что и здесь можно писать:

	invoke MessageBox, 0, addr MsgBoxText, addr MsgBoxCaption, 0
	invoke ExitProcess, 0

Подробный разбор содержания этих двух строк будет уже в следующей Чтиве. Она была написана год назад, я тогда в первый раз увидел в WinXP код программы на Асме, поэтому дотошно описывал всё новое (но с таким количеством ошибок! :/).


end start

Найдя оператор END в этом случае, компилятор MASM'a сочтёт, что метка "start" будет точкой входа в программу. Потому что больше заканчивать в этом файле нечего. Именно со строки
END первая метка
начнётся трансляция полезного кода в файл :).

В любой программе под форточки используется стек, и в следующей главе я расскажу о нём.

Bitfry

<<предыдущая глава     следующая глава>>

Вернуться на главную


- Фирма Интел после всем известной ошибки Пентимума разработала специальную утилиту для "конечных" пользователей, благодаря которой можно изменять код микропрограммного блока управления в процессорах "выше" Пентиума. То есть у нас с вами теоретически есть возможность менять свойства инструкций процессора.

Некоторую информацию вы можете получить в популярной статье iXbt, а также здесь.

Hosted by uCoz