Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования (и ОС) ФОРТ (FORTH) S000..S020: школа хакера


Информационный Канал Subscribe.Ru

S000..S020: школа хакера

попробую копировать текст прямо из браузера -- ссылки и таблицы будут похерены,
так что если хотите нормальный текст, качайте с сайта, а лучше всего пользуйтесь
CVS checkout -kkv

Школа хакера
--------------------------------------------------------------------------------
О книге

S000: Достаем софт
S001: Как запустить Форт
S00F: Hello, World !

S010: Двоичные числа
S011: Шестнадцатитеричные числа
S012: Регистры
S013: Память
S014: Устройства ввода/вывода
S015: Система команд

S020: Шаблон текста программы

О книге

--------------------------------------------------------------------------------
Эта книга появилась в результате работы 
группы подписчиков рассылки comp.soft.prog.forth 
студентов и сотрудников лаборатории аэрокосмического приборостроения СГАУ 
В этой книге вы найдете учебный курс по изучению программирования, разработки
самодельного компьютерного железа и вообще качественному использованию компьютера
в своей работе. Большая часть книги посвящена изучения языку программирования
Форт, который отлично подходит в качестве операционной системы для маломощных
компьютеров и для низкоуровневого программирования: 

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

Естественно, что хакеру необходимо знание еще как минимум С(++), а для написания
сложных программ или вспомогательных утилит отлично подходит скриптовый язык
Python. Для написания прошивок цифровых устройств необходимо владение ассемблером.


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

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

выпускаются выпуски рассылки с ответами на вопросы, исправлениями и т.д.; 
готовятся новые выпуски с заданиями по темам, которые вас заинтересовали; 
ответы на вопросы перебытываются, группируются в кучки и входят в книгу. 
Хочу сразу обратить внимание: повсеместное использование GUI (графического интерфейса
пользователя), который сейчас пихают во все что движется (точнее считает) --
тупиковый путь. Доказать это очень просто -- на языке, если он достаточно полон,
можно описать любые действия. Нарисовать можно только то, что предусмотрел разработчик
вашей рисовалки. При использовании средств графического интерфейса или визуального
программирования вы получаете на несколько порядков меньше возможностей, чем
при использовании языковых
средств. Если вы хотя бы немножко понаблюдаете, вы сразу увидите слепоту околокомпьютерного
человечества, будь то пользователи, службы их поддержки (администраторы, настройщики
ПО и т.д.) и самое печальное программисты. Куча корпораций начиная с Xerox, IBM,
Microsoft, а теперь еще и сотни активных участников движения OpenSource (авторы
KDE и иже с ними) превратили пользователей в обезьян с мышью 8-(. Причины этого
очень просты: 

люди не в состоянии преодолеть "барьер обучения" у себя в голове, и освоить пару-тройку
языков программирования хотя бы на минимальном уровне, чтобы быть в состоянии
заставить работать компьютер, а не махать мышью самому (вы еще не видели дуриков,
которые вручную (в FARе) перекачивают по FTP в течение нескольких недель результаты
испытаний пром.установки из соседнего города ? уверяю, таких 90% всех пользователей,
и они в этом почти не виноваты 8-( ) 
авторы программ изначально не дают пользователям возможности модифицировать код,
выкинуть ненужные части или добавить свои, или хотя бы использовать программный
интерфейс для автоматизации каких-то действий. Тем, кто прозрел и освоил программирование,
зачастую приходится писать те же функции, которыми уже обладают десятки готовых
программы. В простых случаях это не критично -- выгода от того, что работает
компьютер, а не вы, перевешивает затраты на программирование. Но к сожалению
очень часто самостоятельно
написать такой софт практически невыгодно (из-за затрат на отладку, а особенно
если используются какие-то закрытые или сложные алгоритмы), а готовый софт не
дает доступа к своим функциям или делает это очень ограниченно. 
Естественно я не призываю всех снести Windows/KDE/PalmOS/., дружно убраться в
командную строку (несколько командных консолей в графическом режиме -- не GUI)
и обложиться книжками по программированию. Нужно смотреть на то, что вы делаете
на компьютере: если вы его используете на уровне не выше универсального плеера
и сетевой бродилки, вам великолепно подходит любая современная графическая среда.
Если же вы хотя бы ведете на нем переписку или документацию фирмы, у вас гарантированно
есть задачи, к которым нужно
приложить голову -- хотя бы автоматическое резервное копирования данных и оповещение
о входящей почте. 

Опять же я не предлагаю делать все из командной строки -- если вам почти всегда
нужно запустить что-то вручную, удобнее нажать экранную кнопку или пункт меню
мышью, чем вводить иногда очень длинное имя команды. Но GUI должен быть именно
и только UI (пользовательским интерфейсом), а не пришит намертво к основному
коду. Именно поэтому надо давить в зародыше Delphi и подобную дрянь, а вместо
этого уходить на развитие (скриптовых или компилируемых -- не важно) языков,
прививание программистам привычки обеспечивать
удобный программный интерфейс и делать программы отдельно из основной части и
легко отрываемого/заменяемого пользовательского интерфейса, и обучение пользователей
минимальным навыкам программирования. Авторов современных учебных программ в
школах и ВУЗах отправить на переподготовку в обязательном порядке. 

Лучший вариант изучать программирование -- писать программы сразу для нескольких
аппаратных платформ и операционных систем, пользуясь эмуляторами [1]. В этом
случае у вас есть шанс не стать ламером, который может писать только на Delphi
под недо-ОС Windows. 


--------------------------------------------------------------------------------
[1] bochs, VMware, VirtualPC, POSE, AVR Studio, эмуляторами различных процессоров
и микроконтроллеров и т.п. 

S000: Достаем софт

--------------------------------------------------------------------------------
комп компьютер, любая цифровая железка с микропроцессором 
софт программное обеспечение, программы 

эмулятор программа, имитирующая работу другого компьютера 

Для работы с книгой нужно обязательно отрабатывать все задания на компьютере,
а для этого нужно установить на него некоторый набор софта: 

Эмуляторы
Лучший вариант изучать программирование -- писать программы сразу для нескольких
аппаратных платформ и операционных систем, пользуясь эмуляторами. В этом случае
у вас есть шанс не стать ламером, который может писать только на Delphi под недо-ОС
Windows. 
bochs эмулятор железа i386 ПК 

POSE КПК Palm IIIxe (PalmOS 4.1) 

коммерческие эмуляторы: 

VirtualPC i386 ПК 

VMWare i386 ПК 

SIM8052 эмуль микроконтроллеров 8051/8052 

AVR Studio пакет разработки прошивок для микроконтроллеров AVR 


Python
Качайте последнюю версию дистрибутива Python для вашей ОС или устанавливайте
пакет из вашего дистрибутива Linux/BSD/. 


Компиляторы C(++)
GNU CC любые ОС и платформы 

DJGPP порт GCC для DOS 

коммерческие: 

Visual C++ Win 

Borland C++ Builder Win 

Borland C++ 3.1 DOS 

Watcom C++ 11b DOS, DOS DPMI (DOS2GW), Win, Netware 

OpenWatcom QNX 

Intel C++ Compiler 


Форт-системы
SP-FORTH Win, Linux 

GP FORTH DOS 

SMAL32 DOS DPMI 

GNU FORTH 

Dragon Forth КПК с PalmOS 3.5+ 

Quartus Forth КПК с PalmOS 3.5+ 

Win32forth Win 

BFCD Linux 


Прочий софт
DOS Navigator интегрированная текстовая оболочка 

FAR 

NASM ассемблер для i386 

Установить софт, задавая вопросы при проблемах с ним 


S001: Как запустить Форт

--------------------------------------------------------------------------------

SP-FORTH
Пакет поставляется в виде sfx-архива (самораспаковывающийся архив), но нам из
него пока будет достаточен файл spf4.exe -- вытащите его из архива и поместите
в любой каталог, на который указывает переменная среды PATH (Мой компьютер/Свойства/Дополнительно/Переменные
среды, для Win95/98 см. файл C:\AUTOEXEC.BAT). 
Для запуска в диалоговом режиме 

C:\> spf4

Для запуска с вводом исходника программы из текстового файла 

C:\> spf4 myprog.txt

SMAL32
Для запуска в диалоговом режиме 
C:\> forth

Для запуска с вводом исходника программы из текстового файла 

C:\> forth myprog.txt

При достижении конца файла будет автоматических выход 
GP FORTH
Для запуска в диалоговом режиме 
C:\> fs

Для запуска с вводом исходника программы из текстового файла 

C:\> forth myprog.txt

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

C:\> forth fs.frt

Dragon Forth
Для реального устройства загрузите на него файлы df.prc и dfcons.prc. 
Для эмулятора -- если вы скачали готовый пакет эмулятора, то ничего делать не
нужно, только пощелкайте домик в левом нижнем углу, чтобы появились иконки DFCons
и Dragon. Если вы используете оригинальный дистрибутив эмулятора POSE, перетащите
эти иконки на окно эмулятора. 

Quartus
Загрузите файл q4th...prc (см. выше) 
--------------------------------------------------------------------------------
Для выхода из форт-системы введите 
BYE


S00F: Hello, World !

--------------------------------------------------------------------------------
Лучший способ проверить настройку всех языковых систем (компиляторов и языковых
сред) -- запустить их с классическим тестом Hello World. 
Форт
Для диалоговых систем: 
запустите систему; 
введите 
: test    ." Hello World !" ;
test
BYE

Для Фортов, требующих ввод из текстового файла, наберите этот же текст в файл
hello.4th, и запустите 

forth hello.4th

C(++)
создайте файл hello.cpp 
#include 
#include 

int main()
{
     printf("\nHello World !\n");
     return 0;
}

напустите на него компилятор 
Visual C++ -- cl.exe hello.cpp, 
Borland C++ 3.1 -- bcc.exe hello.cpp, 
Borland C++ Builder -- bcc32.exe hello.cpp, 
GNU CC -- gcc -o hello hello.cpp 
если текст введен без ошибок, и у вас POSIX операционная система, в текущем каталоге
будет создан исполняемый файл hello[.exe] -- запустите его 
C:\> hello

В UNIX (Linux и другие) 
user$ ./hello

При использовании кросс-компилятора для другой ОС/платформы читай доку на компилятор
и загружай полученный бинарник в эмуль. 
Python
создайте файл hello.py 
print 'Hello World !'

запустите Python 
python hello.py


S010: Двоичные числа

--------------------------------------------------------------------------------
Компьютер умеет работать только с целыми числами -- операции с плавучкой (числа
с плавающей точкой, типа 12.34 или -4.56E-7) реализуются на специализированном
чипе (отдельном или на кристалле процессора сбоку) или с помощью эмуляции на
целых числах. 
Как всем известно, компьютер использует для представления любой информации двоичную
систему. Для хранения и обработки информации используются физические структуры,
имеющие два устойчивых состояния. Один такой элемент может кодировать только
два числа: 0 и 1. Также могут кодироваться наличие (1) или отсутствие (0) какого-то
события. Такой элемент называют триггером, флагом, семафором и т.п., самое общее
и часто используемое название -- бит. 

Для кодирования целых чисел используются группы бит. Чаще всего используются
группы из 2^N бит (2 в степени N). Если N=4, такая группа называется nibble,
если 8 -- байт. Иногда при преобразовании аналоговых сигналов (звук, видео, сигналы
с датчиков) используются группы из 6, 10, 12 бит -- в таком виде отдает данные
АЦП (аналого-цифровой преобразователь, ADC). 

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

Кстати, для многих будет открытием, что в вашем компьютере на самом деле сейчас
стоит минимум 5 процессоров, кроме основного: на видеокарте, в каждом винте,
CD/DVD, на звуковой карте, в модеме и т.п. Без него обошлись разве что сетевая
карта и дисковод. 

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

число 237 

номер бита 7 6 5 4 3 2 1 0 
 1 1 1 0 1 1 0 1 


перевод двоичного числа в десятичное: 

1*2^7 + 1*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 237

Перевод из десятичного числа в двоичное вручную выполняется как обычное деление
"столбиком" на 2, цифры двоичного числа см. остатки от деления. 

Некоторую сложность имеет представление чисел со знаком: в машинное слово одной
и той же длины влазит или число (безнаковое целое, unsigned int) 0..65535, или
(целое со знаком, signed int) -32767..32768 (16-битное машинное слово). 

Для изменения знака числа используется выражение: 

not(N)+1 = -N

Операция NOT выполняет инверсию бит: 0 заменяется на 1, а 1 на 0. 
Чтобы при записи чисел отличать десятичные и двоичные числа, в конце двоичного
числа добавляют символ b (binary): 

237 = 11101101b

К сожалению, это работает только в настоящем ассемблере. В Форте почему-то такую
возможность явного указания основания системы счисления не обеспечили. 

Форт в отличие от остальных языков может в принципе работать с любой системой
счисления при вводе и выводе чисел -- для переключения системы счисления нужное
основание (например 2 для двоичной) нужно записать в переменную BASE: 

2 BASE !

Тут лежат грабли: чтобы переключиться обратно на десятичную систему таким-же
способом, вам придется вводить 10 в двоичной системе. Для облегчения переключения
для основных оснований определены слова: 

DECIMAL включить десятичную систему; 
BINARY включить двоичную (bin) систему; 
HEX включить шестнадцатеричную (hex) систему. 
Большинство фортов также принимают числа в hex виде 0x1234. 

S011: Шестнадцатитеричные числа

--------------------------------------------------------------------------------
Для записи машинных слов двоичная запись очень неудобна из-за своей длины (16
и более бит). Для упрощения применяется шестнадцатеричная запись: кроме цифр
0..9 добавляются цифры A..F (соответствующие 10..15). В hex записи байты имеют
вид XX, 16-битные слова XXXX. 
Преобразование в hex и обратно аналогично двоичной системе, но при этом используется
степени 16 и деление на 16. 

Для указания что число записано в hex используются: 

префикс 0x (ассемблер, С(++), Форт, Python), например 0x1234; 
префикс $ (Pascal, GP-FORTH, SMAL32), например $8173 
суффикс h (ассемблер), например 5678h. 
Для Форта префикс 0x не оговорен в стандарте, но в большинстве форт-систем он
работает. В GP-FORTH и SMAL32 вместо 0x используется префикс $8173. 

Форт в отличие от остальных языков может в принципе работать с любой системой
счисления при вводе и выводе чисел -- для переключения системы счисления нужное
основание (например 2 для двоичной) нужно записать в переменную BASE: 

2 BASE !

Тут лежат грабли: чтобы переключиться обратно на десятичную систему таким-же
способом, вам придется вводить 10 в двоичной системе. Для облегчения переключения
для основных оснований определены слова: 

DECIMAL включить десятичную систему; 
BINARY включить двоичную (bin) систему; 
HEX включить шестнадцатеричную (hex) систему. 

S012: Регистры

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

Процессор использует регистры для хранения данных и для выполнения операций над
ними. Некоторые регистры могут отображаться на управляющие цепи процессора --
например запись в регистр PWCTL на самом деле будет переключать скоростной режим
работы процессора и его энергопотребление. Аналогично работает регистр флагов
-- флаги процессора собраны вместе в регистр FLAGS (80x86), и над ними могут
быть выполнены групповые операции (сохранить/восстановить состояние сразу всех
флагов). 

Флаг -- однобитный элемент, указывающий текущее состояние какой-то части процессора
(флаг PE=1 в 80x86 указывает что включен режим страничной адресации в защищенном
режиме работы процессора), особый результат выполнения операции (переполнение
при сложении), события (запрос на обслуживание от внешних устройств). Флаги,
состояние которых может быть изменено командами пересылки или специальными командами
управления, наоборот используются как управляющий вход. 

Вот наборы регистров и флагов некоторых распространенных процессоров: 

8086: AX BX CX DX SI DI BP SP FLAGS IP 

клоны i8080 (К580, Z80): A B C D H L FLAGS IP 

Подробное описание регистров см. разделы с описанием эмуляторов этих процессоров.



S013: Память

--------------------------------------------------------------------------------
Чаще всего объем регистровой памяти процессора недостаточен. В этом случае добавляется
память, расположенная на кристалле процессора или в отдельных внешних чипах.

Память состоит из тычяч регистров, которые адресуются по их номеру -- адресу.
Объем памяти может быть от сотен байт до сотен мегабайт (2^10 байт). 

Для подключения к процессору внешней памяти на отдельных чипах используются электрические
соединения, объединенные в группы: шину адреса и шину данных, и несколько управляющих
линий (чтение/запись, выбор чипа для работы). 

По шине адреса процессор передает адрес регистра памяти, с которым он хочет работать.
Ширина шины адреса определяется объемом чипа памяти. Для чипа 62256 шина адреса
равна 16 битам, и чип содержит 32 Kb (килобайта, 2^10 байт) регистров. 

По шине данных выполняется передача данных из процессора или из памяти (шина
данных двунаправлена). Ширина шины данных определяется размеров адресуемых регистров.
Для 62256 это 8 бит (один байт). 

Сигнал CS (chip select, выбор кристалла) переключает чип памяти из пассивного
состояния в рабочий режим. Очень часто в компьютере ставятся несколько чипов
параллельно -- банки памяти. В пассивном режиме все выводы чипов подключенных
к шине процессора (включает шину адреса, данных и несколько управляющих линий)
находятся в Z-состоянии (можно считать что они просто отключены -- сопротивление
цепи каждого вывода составляет десятки КОм). При передаче данных на шине могут
быть активны только процессор и один чип
памяти (или интерфейсный регистр другого устройства). 

Сигнал R/W (read/write, чтение/запись) указывает направление передачи по шине
данных. 

Память может быть разных типов: 

По возможности записи: 

ROM (read-only memory, ПЗУ) -- память не поддерживает запись; 
RAM (random access memory, ОЗУ) -- память с произвольным доступом. 
По типу полупроводниковых структур, используемых в регистрах: SRAM (статическая),
DRAM (динамическая), Flash/EPROM,.. 

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

Более подробно память будет описана в железячных разделах, пока нам достаточно
использовать модель ROM/RAM в виде одномерного массива фиксированной длины. 

При хранении машинных слов в памяти с байтовой адресацией обязательно нужно учитывать
порядок упаковки байт машинного слова -- младший (LSB) или старший (MSB) байт
хранится по минимальному адресу. У процессоров 80x86 порядок байт LSB: 

32-битное слово 0x12345678

адрес     байт
===============
00199507: 78
00199508: 56
00199509: 34
0019950A: 12

При просмотре hex дампа файла число будет выглядеть как 
00199507: ..   ..   ..   ..   78   56   34   12   ..   ..


S014: Устройства ввода/вывода

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


По способу передачи данных: параллельные, последовательные, синхронные/асинхронные,
с блочной передачей. 


S015: Система команд

--------------------------------------------------------------------------------
Регистровые процессоры поддерживают команды (операции) типа: 
регистр-регистр; 
память-регистр. 
Команды: 

управления -- условные/безусловные переходы, вызовы, управление работой процессора;

пересылки -- передача данных регистр-регистр и память-регистр; 
арифметика -- сложение, умножение, сравнение; 
битовые -- различные сдвиги битов в регистрах, побитовые логические операции,
сброс/установка/проврка бита 
ввод/вывод -- доступ к УВВ. 
В качестве подробного примера см. виртуальный регистровый процессор. 


S020: Шаблон текста программы

--------------------------------------------------------------------------------

Форт
В диалоговом режиме большинство кода можно просто вводить к командной строке
форт-системы. Некоторые слова (форт-слова, команды) работают только при определении
нового слова через : (двоеточие) ; (точка с запятой), поэтому если при вводе
текста появляются глюки, будет указано использовать определение слова через :
;. 
\ программа Hello World ! на Форте
( из рассылки comp.soft.prog.forth )

\ это выполнится сразу при загрузке исходника,
\ если ваш форт умеет выполнять слово ." в режиме интерпретации
( при ошибках закомментируйте словом \, не забудьте пробел после него )

 ." Hello World ! " CR

\ этот код компилирует (определяет) новое слово через существующие:

: Hello        ." Hello World ! " CR ;

\ для запуска нужно ввести Hello

\ Hello

\ для выхода из форт-системы выполнить BYE

C(++)
Если ваш браузер съел текст внутри символов "меньше" и "больше" или вообще возникают
непонятные глюки, посмотрите .html код в любом текстовом редакторе. 
Создайте в текстовом редакторе файл hello.cpp и запустите его с компилятором.
Примеры запуска компиляторов см. S00F. 

/* программа Hello World ! на Форте
   из рассылки comp.soft.prog.forth  */
// такой комментарий работает только для компиляторов С++

// секция подключения (заголовочных) .h-файлов

#include 
#include 

// функция _main()

int main(int argc, char *argv[])
{
     printf("\nHello World !\n");
     return 0;
}

Запустите создавшийся исполняемый файл. 
Python
Python выполняет код по мере его чтения, поэтому в начале программы возможно
нужно будет только подгрузить библиотечные модули: 
# подгружаем модули из стандартной библиотеки языка

import os
import sys

# выводим фигню

print "Hello World !"
print 'Python умеет два вида кавычек, внутри можно использовать "кавычки" '

# завершаем работу программы с кодом 0

sys.exit(0)

Эту программу можно отредактировать тектовым редактором, или использовать оболочку
IDLE, которая умеет подсвечивать синтаксис, и запускать программу по нажатию
Shift-F5. 

================
http://akps.ssau.ru
forth@km.ru
FidoNet SU.FORTH 2:5057/18.29
tel.: +7 8462 28 9910 (work), 15 4313 (home)

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.forth
Отписаться
Вспомнить пароль

В избранное