Assembler for newbies in Low level Programming

Ассемблер для новичков в низкоуровневом программировании.

Киньте грязью в того, кто вам скажет, что Ассемблер - очень сложный для изучения язык. И никогда не читайте глупых книг, в которых написана подобная чушь. О том, что это очень сложно, говорят и пишут люди, у которых в свое время не хватило смелости (и/или ума) попытаться "въехать" в "машинные коды", "прерывания", "порты ввода-вывода" и прочую низкоуровневую "чепуху", с которой рано или поздно сталкивается любой профессиональный программист. Можно сколько угодно ругать глюки в "винде", кривой SQL в Delphi, Билла-Гейтса или "эту проклятую зидовскую мамку" - это не избавляет от элементарного невежества в области "компьютерных технологий". А без знания последних любой программист может уподобиться танцору, которому мешает танцевать сами знаете что :)...

Iczelion.

Выпуск 00.

Я начну с утверждения что чем ниже “уровень” программирования, тем больше возможностей. Чем это обуславливается? Да тем, что различные компиляторы, и другие “шняги” высокоуровнего программирования навязывают нам свои законы, правила, по которым нам приходится играть. В программировании на асме у нас есть два набора правил, это правила диктуемые процессором, и те что мы устанавливаем сами.

Сначала мы будем изучать программирование на ассемблере под MS DOS. Почему под ДОС, ведь эта ОС устарела и мало кем используется? Просто потому что я не хочу чтобы ты уснул на первых страницах рассылки, т.к. Это будет слишком уж много теории, а к тому-же еще и API...

Значит что нам необходимо:

Хотябы минимальное знание какого нибудь языка программирования высокого уровня (C/C++, Pascal/Delphi, или другой).

Минимальное знание команд ДОС (как то cd, dir, copy, move). Если не знаете,обращайтесь ко мне.

MS DOS установленная на жестком диске, или в виртуальной машине. (url на файлы для Connectix Virtual PC внизу страницы). Для счастливых обладателей Linux есть Dosemu отличный эмулятор Доса и кажется FreeDos.

MASM или TASM как транслятор и линковщик.

Какой нибудь редактор. (Можно пользоваться EDIT который входит в состав DOS) Я предпочитаю UltraEdit32.

Отладчик. Cv, Td, соответственно от Microsoft и Borland (входят в пакеты Masm и Tasm). Для продвинутых SoftIce.

Дизассемблер IDA



Ну чтож, хватит разглагольствовать, начнем.

Если по честному, хотел я начать с небольшой эдакой лекции про биты, и байты, но все-таки проктика по моему главнее, так-что вот вам простенький hello world в лучших традициях программирования.

;--------------------------------------------------------

Title Hello_World ; не несет никакой смысловой нагрузки

Codseg segment ; директива сегмента, короче сегмент кода.

org 100h ; суровая необходимость .com программ.

Begin: ; начало программы. Метка начала программы.

mov ax,codseg ; эта и след строки – инициализация сегмента данных.

mov ds,ax



mov DX,offset text ; помещаем в регистр DX смещение (в байтах) метки (переменной) text)

mov ah,09h ; помещаем в AH номер вызываемой функции (вывод текста, адрес которого лежит в DX)

int 21h ; вызываем 21h прерывание.

mov ah,4ch ; номер вызываемой функции (4Ch – выход из программы)

int 21h ; вызываем 21h прерывание.

text db 'Hello World!!!$' ; наш текст, $ означает конец строки

Codseg ends

end Begin

;--------------------------------------------------------

компилируем так:

masm hello.asm,,,;

линкуем (собираем в exe) link hello.obj,,,;

да, link выведет вам предупреждение, что типа “no stack segment” , но не обращай внимания, это нормально.

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

Регистр – это такая сверхбыстрая ячейка памяти находящаяся внутри процессора. Регистров всего много, но в основном для своей работы мы будем пользоваться регистрами обшего назначения и сегментными. Вот они: AX,CX,BX,DX и сегментные: CS,DS,SS,ES.

Бит – минимальная еденица данных, он может быть равным 0 или 1, (двоичная система счисления).

Поскольку бит – не очень удобная еденица, придумали байт, который равен 8 битам. (они нумеруются справа налево, т.е. Самый правый является самым первым).

Два байта – слово(word), два слова -двойное слово(double word).

В слове 16 бит.

1 Килобайт равен 1024 байта, 1 мегабайт равен 1024 Kb, 1 гигабайт равен 1024 Mb, 1 терабайт равен 1024 Gb.

Регистры у нас являются 16 битными, следовательно в них можно вместить одно слово.

Для совместимости со старыми моделями процессоров, а так – же просто для удобства программистов, наши регистры общего назнач. логически разделены на 2 8-битных регистра – AL и AH (от англ. Higner и Low), т.е BX/BH/BL, CX/CH/CL, DX/DH/DL.

То есть мы можем обратиться к старшему байту регистра AX таким образом к примеру:

mov ah,11 ; команда mov помещает значение второго операнда в первый. Операнд – число, метка, переменная, все что угодно.

; в данном случае помещает число 11 в регистр ah.

Да, работать мы с вами будем в основном с байтами и словами, т.к. именно ими “кодируются “ цифры, буквы(ASCII).

ПЕРВЫЙ БАЙТ – ЭТО БАЙТ СПРАВА!!!



Теперь проведем небольшую модификацию нашей програмки, заставим её переводить указатель на новую строку. Так, нам надо вставить после текста число 113(код клавиши enter), т.к. 9 функция доса воспринимает её как сигнал того, что надо перевести указатель на начало новой строки. Чтобы записать число 113, надо понять как записываются числа в асме. Обин байт может вместить 2 числа, 2 разряда, т.е. Обин байт может вместить максимум число 99. Следовательно надо число 113 разбить на разряды, и получим то что надо! Следовательно 13, 10 – искомое число.

text db 'Hello World!!!', 13,10,'$' ; наш текст, $ означает конец строки

теперь скомпилировав, получаем искомое – прога переводит строку после Hello world

Теперь небольшое домашнее задание – сделайте такую программку, которая выводит hello world несколько раз, каждый раз на новой строке.



Файлы для Connectix Virtual PC( диск с предустановленной MS-DOS)

http://ass3mbler.narod.ru/dos.part01.rar

http://ass3mbler.narod.ru/dos.part02.rar

http://ass3mbler.narod.ru/dos.part03.rar

http://ass3mbler.narod.ru/dos.part04.rar

http://ass3mbler.narod.ru/dos.part05.rar

http://ass3mbler.narod.ru/dos.part06.rar

http://ass3mbler.narod.ru/dos.part07.rar

http://ass3mbler.narod.ru/dos.part08.rar

http://ass3mbler.narod.ru/dos.part09.rar

вес каждого файла ~488 kb



Добро пожаловать в мир низкоуровнего программирования, мир где программист – царь и бог!

Автор рассылки Skif_Quest.

mailto:skif_q@mail.ru



Программирование OpenGL, 3D графика, для новичков в программировании.

Хостинг от uCoz