мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
asm:lesson3 [30/09/2010 19:46] arabusovasm:lesson3 [07/02/2012 18:38] (текущий) arabusov
Строка 1: Строка 1:
-======Урок 3 ====== +======Начало работы с ассемблером ====== 
-Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, затем в папку asm. Проверим наличие в ней файлов debug.exe, папок tasm и tc, в которых содержится turbo assembler и turbo c. Если чего-то нет, то переходите к началу [[http://wiki.nsunc.com/asm]], скачивайте необходимые файлы и распаковывайте их в нужные каталоги. Затем запустим и выключим dosbox, затем в терминале введём команду gedit ~/.dosbox/dosbox-0.73.conf В конце файла должны быть следующие строки:+Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, затем в папку asm. Проверим наличие в ней файлов debug.exe, папок tasm и tc, в которых содержится turbo assembler и turbo c. Если чего-то нет, то переходите к началу [[http://wiki.nsunc.com/asm]], скачивайте необходимые файлы и распаковывайте их в нужные каталоги. Затем запустим и выключим dosbox (Приложения -> Игры -> Эмулятор DosBox), затем в терминале (Приложения -> Стандартные -> Терминал) введём команду gedit ~/.dosbox/dosbox-0.74.conf В конце файла должны быть следующие строки:
   * mount c ~/asm   * mount c ~/asm
   * path=z:\;c:\;c:\tasm;c:\tc   * path=z:\;c:\;c:\tasm;c:\tc
Строка 6: Строка 6:
   * keyb ru   * keyb ru
 Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован. Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован.
 +
 ===== Сегментация программы ===== ===== Сегментация программы =====
 По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82,_%D0%9D%D0%B8%D0%BA%D0%BB%D0%B0%D1%83%D1%81]]) программа = алгоритм + данные. Этот принцип в программировании реализуется повсеместно. Процессор 8086 на аппаратном уровне производит разделение программы на код и данные. Для этого вводится понятие сегмента: это участок памяти объёмом в 64 KB, в котором процессор подразумевает нахождение либо данных, либо кода. Адрес начала сегмента хранят сегментные (системные) регистры: cs, ds, ss, es. При выполнении программы процессор обращается по адресу cs:ip и выполняет команду, которая содержится в этой ячейке памяти. Регистр ds указывает на начало сегмента данных, многие команды процессора, которые связаны с работой с памятью, вычисляют физический адрес данных, начиная от ds. Однако мы рассмотрели не все системные регистры: осталось ещё два. es - это дополнительный сегмент данных, он функционирует практически так же, как и ds. А вот ss - сегмнт стека (stack segment), он по-сложнее... По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82,_%D0%9D%D0%B8%D0%BA%D0%BB%D0%B0%D1%83%D1%81]]) программа = алгоритм + данные. Этот принцип в программировании реализуется повсеместно. Процессор 8086 на аппаратном уровне производит разделение программы на код и данные. Для этого вводится понятие сегмента: это участок памяти объёмом в 64 KB, в котором процессор подразумевает нахождение либо данных, либо кода. Адрес начала сегмента хранят сегментные (системные) регистры: cs, ds, ss, es. При выполнении программы процессор обращается по адресу cs:ip и выполняет команду, которая содержится в этой ячейке памяти. Регистр ds указывает на начало сегмента данных, многие команды процессора, которые связаны с работой с памятью, вычисляют физический адрес данных, начиная от ds. Однако мы рассмотрели не все системные регистры: осталось ещё два. es - это дополнительный сегмент данных, он функционирует практически так же, как и ds. А вот ss - сегмнт стека (stack segment), он по-сложнее...
Строка 20: Строка 21:
 ===== Написание программ на ассемблере ===== ===== Написание программ на ассемблере =====
 Первое, с чем мы столкнёмся: для ассемблера нет оболочки. Исторически сложилось, что программу вводят в текстовом редакторе, а затем запускают сам ассемблер и получают исполняемый файл - файл, который можно (а может и нельзя) запустить на компьютере. Итак, чтобы написать программу мы должны создать файл в папке asm, отредактировать его с помощью gedit (особо одарённые могут использовать vi или emacs) и скомпилировать его в dosbox. Компиляция проходит в два этапа. Первый: собственно ассемблирование (команда tasm имя_файла). В результате получится файл имя_файла.obj. Этот файл запустить в dosbox просто так не удастся. Вы можете подключить к этому файлу другие с аналогичным расширением. Это действие называется линковкой. В нашем случае почти всегда мы будем линковать только один файл командой tlink имя_файла.obj. Если программа была написана без ошибок, то на выходе мы получим имя_файла.exe или имя_файла.com. Первое, с чем мы столкнёмся: для ассемблера нет оболочки. Исторически сложилось, что программу вводят в текстовом редакторе, а затем запускают сам ассемблер и получают исполняемый файл - файл, который можно (а может и нельзя) запустить на компьютере. Итак, чтобы написать программу мы должны создать файл в папке asm, отредактировать его с помощью gedit (особо одарённые могут использовать vi или emacs) и скомпилировать его в dosbox. Компиляция проходит в два этапа. Первый: собственно ассемблирование (команда tasm имя_файла). В результате получится файл имя_файла.obj. Этот файл запустить в dosbox просто так не удастся. Вы можете подключить к этому файлу другие с аналогичным расширением. Это действие называется линковкой. В нашем случае почти всегда мы будем линковать только один файл командой tlink имя_файла.obj. Если программа была написана без ошибок, то на выходе мы получим имя_файла.exe или имя_файла.com.
 +== ВНИМАНИЕ!!! ==
 +Имя файла в MS-DOS и в DOSBox не может превышать восьми символов!!!
 +
 ===== Программы типа *.com ===== ===== Программы типа *.com =====
 Главная особенность com-программ: cs, ds, es и ss указывают на один и тот же сегмент, тем самым смешивая всё в одну кучу! При компиляции tasm тщательно следит за тем, чтобы вы не меняли содержимого системных регистров. Так как на всю программу выделен всего один сегмент, то максимальный размер программы: 64 КБайт. Обычно этот тип файлов используется в качестве драйверов для MS-DOS. Главная особенность com-программ: cs, ds, es и ss указывают на один и тот же сегмент, тем самым смешивая всё в одну кучу! При компиляции tasm тщательно следит за тем, чтобы вы не меняли содержимого системных регистров. Так как на всю программу выделен всего один сегмент, то максимальный размер программы: 64 КБайт. Обычно этот тип файлов используется в качестве драйверов для MS-DOS.
Строка 155: Строка 159:
 обработке диpективы PAGE. обработке диpективы PAGE.
  
-===Директива TITLE ===+=== Директива TITLE ===
 Для того,  чтобы вверху каждой страницы Для того,  чтобы вверху каждой страницы
 листинга печатался заголовок (титул) программы, используется листинга печатался заголовок (титул) программы, используется
Строка 173: Строка 177:
 содержащих много подпрограмм. содержащих много подпрограмм.
  
-=== Директива SEGMENT===+=== Директива SEGMENT ===
  
 Любые ассемблерные  программы  содержат  по  крайней мере Любые ассемблерные  программы  содержат  по  крайней мере
Строка 194: Строка 198:
 Директива  SEGMENT  может  содержать  три  типа  параметров, Директива  SEGMENT  может  содержать  три  типа  параметров,
 определяющих выравнивание, объединение и класс. определяющих выравнивание, объединение и класс.
- +== Выравнивание == 
-   ВыравниваниеДанный параметр определяет границу начала+Данный параметр определяет границу начала
 сегмента.  Обычным значением является PARA,  по которму сегмента.  Обычным значением является PARA,  по которму
 сегмент устанавливается на  границу  параграфа.  В этом сегмент устанавливается на  границу  параграфа.  В этом
Строка 201: Строка 205:
 имеет  шест.  адрес  nnn0.  В  случае  отсутствия этого имеет  шест.  адрес  nnn0.  В  случае  отсутствия этого
 операнда ассемблер принимает по умолчанию PARA. операнда ассемблер принимает по умолчанию PARA.
-   Объединение.  Этот элемент  определяет объединяется  ли+== Объединение == 
 +Этот элемент  определяет объединяется  ли
 данный   сегмент   с  другими  сегментами   в  процессе данный   сегмент   с  другими  сегментами   в  процессе
 компановки  после  ассемблирования   (пояснения  см.  в компановки  после  ассемблирования   (пояснения  см.  в
Строка 214: Строка 219:
 PUBLIC,  COMMON и  MEMORY.  В случае, если программа не PUBLIC,  COMMON и  MEMORY.  В случае, если программа не
 должна объединяться  с другими  программами,  то данная опция может быть опущена. должна объединяться  с другими  программами,  то данная опция может быть опущена.
-   КлассДанный элемент, заключенный в апострофы,  используется  для группирования  относительных  сегментов при+== Класс == 
 +Данный элемент, заключенный в апострофы,  используется  для группирования  относительных  сегментов при
 компановке: компановке:
  
Строка 222: Строка 228:
 иллюстрирует директиву SEGMENT и ее различные опции. иллюстрирует директиву SEGMENT и ее различные опции.
  
-   Директива PROC+=== Директива PROC ===
  
-   Сегмент  кода  содержит  выполняемые  команды  программы.+Сегмент  кода  содержит  выполняемые  команды  программы.
 Кроме  того  этот  сегмент также включает  в  себя  одну или Кроме  того  этот  сегмент также включает  в  себя  одну или
 несколько процедур,  определенных директивой  PROC. Сегмент, несколько процедур,  определенных директивой  PROC. Сегмент,
Строка 235: Строка 241:
                     .                   одной                     .                   одной
                     RET                 процедурой                     RET                 процедурой
- 
- 
- 
-Ассемблер для IBM PC. Глава 3                             65 
- 
- 
      имя-процедуры  ENDP      имя-процедуры  ENDP
      имя-сегмента   ENDS      имя-сегмента   ENDS
- +Имя  процедуры  должно  обязательно  присутствовать, быть
-   Имя  процедуры  должно  обязательно  присутствовать, быть+
 уникальным и удовлетворять соглашениям по именам  в ассембле уникальным и удовлетворять соглашениям по именам  в ассембле
 ре.  Операнд FAR указывает загрузчику DOS, что начало данной ре.  Операнд FAR указывает загрузчику DOS, что начало данной
 процедуры является точкой входа для выполнения программы. процедуры является точкой входа для выполнения программы.
-   Директива  ENDP  определяет конец процедуры  и имеет имя,+Директива  ENDP  определяет конец процедуры  и имеет имя,
 аналогичное  имени в директиве PROC.  Команда  RET завершает аналогичное  имени в директиве PROC.  Команда  RET завершает
 выполнение программы и в данном случае возвращает управление выполнение программы и в данном случае возвращает управление
 в DOS. в DOS.
-   Сегмент может содержать несколько процедур (см. гл.7).+Сегмент может содержать несколько процедур.
  
-   Директива  ASSUME+=== Директива  ASSUME ===
  
-   Процессор  использует  регистр  SS  для  адресации стека,+Процессор  использует  регистр  SS  для  адресации стека,
 ркгистр  DS для адресации  сегмента данных и регистр  CS для ркгистр  DS для адресации  сегмента данных и регистр  CS для
 адресации  cегмента  кода.  Ассемблеру  необходимо  сообщить адресации  cегмента  кода.  Ассемблеру  необходимо  сообщить
Строка 265: Строка 264:
      ASSUME     SS:имя_стека,DS:имя_с_данных,CS:имя_с_кода      ASSUME     SS:имя_стека,DS:имя_с_данных,CS:имя_с_кода
  
-   Например,  SS:имя_стека  указывает,  что ассемблер должен+Например,  SS:имя_стека  указывает,  что ассемблер должен
 ассоциировать  имя сегмента  стека с регистром  SS. Операнды ассоциировать  имя сегмента  стека с регистром  SS. Операнды
 могут  записываться  в любой последовательности.  Регистр ES могут  записываться  в любой последовательности.  Регистр ES
Строка 272: Строка 271:
 ES:NOTHING. ES:NOTHING.
  
-   Директива END+=== Директива END ===
  
-   Как уже показано,  директива  ENDS  завершает  сегмент, а+Как уже показано,  директива  ENDS  завершает  сегмент, а
 директива  ENDP  завершает процедуру.  Директива END  в свою директива  ENDP  завершает процедуру.  Директива END  в свою
 очередь полностью завершает всю программу: очередь полностью завершает всю программу:
Строка 281: Строка 280:
           END            [имя_процедуры]           END            [имя_процедуры]
  
-   Операнд может быть опущен,  если программа не предназначе +Операнд может быть опущен,  если программа не предназначе 
-на для выполнения, например, если ассемблируются только опре +на для выполнения, например, если ассемблируются только определения данных, или эта программа должна быть скомпанована с
-деления данных, или эта программа должна быть скомпанована с+
 другим  (главным)  модулем.  Для  обычной программы  с одним другим  (главным)  модулем.  Для  обычной программы  с одним
 модулем oперанд содержит  имя,  указанное в  директиве PROC, модулем oперанд содержит  имя,  указанное в  директиве PROC,