Воробьёвы

(-:

№12. В гостях у Коробочкина, или сегменты данных

НОВОСТИ ПРОЕКТА HI-TECH

Хороший сегодня выпуск :). Тринадцатый!! Для кого-то это, может быть, и несчастливое число, но для нас, в общем-то, скорее наоборот :). 13 - это хорошее число! Потому что новостей сегодня много :). И все - приятные!! Ура!

ДZенствующие братья и сестры! Поздравляю! Мы сделали для вас зеркало! Теперь вам не нужно с дрожью в коленках ждать, когда же, наконец, загрузится наш гребаный сайт (который, как известно, в BY-нете находится). Теперь вам не нужно эксплуатировать нашего многострадального почтового робота! Теперь вам... а впрочем хватит словоблудия :). Вот он, адрес нашего первого зеркала: http://hi-tech.ph.ru :).

Делал его для вас (нам оно, в принципе, нафиг сдалось) DZ Void. Он же будет его поддерживать в более-менее работоспособном состоянии. Он же и сядет, если что :). Так что прошу любить и жаловать :) Вот его (Void'а) мыл: vovikoid@mail.ru. Со всеми вопросами насчет зеркала - к нему!

Думаете это все? Как бы не так! Есть еще одна новость! У нас появился "карректар", который "красным фламастиром" будет фиксить все наши грамматические очепятки и прочие досадные ляпы :). Эт хорроший корректор :). Рулит! Это ж не каждому корректору дано понять, что слово "щас" ошибкой не является! А наш - понимает! Более того - он даже не пытается исправить слово "гребаный" пошлым зачеркиванием первых двух букв :).

Я и говорю - карректар у нас супер! Вы только посмотрите, что он с архивом рассылки сделал, гад! Намазюкал красным фламастиром, как последняя школьная училка, и доволен!

Зовут корректора LeXa, и он тоже DZ. Вот его мыл: le-xa@freemail.ukr.net. Прошу любить и жаловать! Предпочтительно в тoй же извращенной форме, в какой он две ночи напролет "любил и жаловал" архив нашей рассылки...

И да пребудет с вами сила, братья (ну и сестры тож)!

СЛОВО МОДЕРАТОРУ RTFM_HELPERS

ДZенствующий народ!! В первый и последний раз объясняю вам политику партии (читай: политику eGroup)!

Если вы хотите получать глупые ответы на ваши глупые вопросы, вы должны:

1. Подписаться на сообщения eGroup. Для этого нужно выслать пустое письмо по адресу RTFM_Helpers-subscribe@egroups.com. Сие означает, что вы подписываетесь на ВСЕ сообщения группы. Соответственно, все ваши вопросы и все наши/ваши ответы будут автоматически рассылаться ВСЕМ ПОДПИСАВШИМСЯ.

2. Задать вопрос. После успешной регистрации это нужно делать мылом по адресу RTFM_Helpers@egroups.com.

Внимание! Ответ на ваш вопрос будет приходить в группу! То есть: если вы НЕ ПОДПИСАЛИСЬ на сообщения данной группы, НО ЗАДАЛИ ВОПРОС, то ОТВЕТА ВЫ НЕ ПОЛУЧИТЕ :). Вернее, ответ-то, конечно, будет, :) но на ваш почтовый ящик он не придет :(. Вывод: сначала нужно подписаться...

Если кто чего не понял - мыльте: bejenari@beltsy.md.

ДZенского вам всем настроения!

НОВЫЕ ПОСТУПЛЕНИЯ

В разделе "Справочные системы":

- Справочная система по языкам программирования (ASM'у в том числе).

- Справочная система HelpPC 2.10.

В разделе "Документация":

- Мануал по процессору Intel 80386.

- Мануал по процессору Intel 80486.

- MS-DOS Interrupt List. Наиболее полное описание прерываний.

- Архитектура ввода-вывода персональных ЭВМ IBM под ред. некоего Ю. С. Лукача.

ВДОГОНКУ К ПРОШЛОМУ НОМЕРУ (ТРАДИЦИЯ, ОДНАКО!)

DZ Sashok или облажался, или времени у него не было проверять... Так или иначе, DZ Kir777 вот какую очепятку нашел:

- под 5 пунктом вместо "адреса 100...200" читать надо "адреса 100...104".

Оно-то и ежу понятно, что это очепятка, но вдруг кого из вас это не той дорогой повело?

Публичный сенькс тебе, DZ Kir777!

УСОВЕРШЕНСТВОВАНЫЙ "СУПЕРПАИНТ" BY STS

В прошлом номере я предложил дZенствующим братьям усовершенствовать наш "суперпаинт" (ну рисовалку, то бишь). Молодцы, народ! Хорошо поработали!

:0100  MOV  AX,0013
:0103  INT  10
:0105  XOR  DX,DX
:0107  XOR  CX,CX
:0109  MOV  BL,1E
:010B  MOV  AL,BL
:010D  MOV  AH,0C
:010F  INT  10
:0111  XOR  AH,AH
:0113  INT  16
:0115  CMP  AH,4A
:0118  JNZ  011B
:011A  DEC  BX
:011B  CMP  AH,4E
:011E  JNZ  0121
:0120  INC  BX
:0121  CMP  AH,4B
:0124  JNZ  0127
:0126  DEC  CX
:0127  CMP  AH,4D
:012A  JNZ  012D
:012C  INC  CX
:012D  CMP  AH,48
:0130  JNZ  0133
:0132  DEC  DX
:0133  CMP  AH,50
:0136  JNZ  0139
:0138  INC  DX
:0139  CMP  AL,1B
:013B  JNZ  010B
:013D  MOV  AX,0003
:0140  INT  10
:0142  INT  20

Ну а лучше всех поработал DZ STS, который, пользуясь удобным случаем, передает привет 2 GMS, Volos and all ZX-Spectrum Users!

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

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

Если есть какие вопросы - мыльте автору на z80@CHAT.RU.

И да пребудет с вами сила, братья!

ЗЫ: STS! Я надеюсь, ты примешь участие в работе группы RTFM_Helpers? В качестве эксперта?

Predator! Ты - тоже! Только без матов!

Al-Gali! То, что ты скоро станешь соавтором рассылки, вовсе не означает, что можно отлынивать от черновой работы!

Sergey Kondratenko! Тебя это тоже касается ;).

Serge Vetroff! Пользуясь случаем, (я тут попросту пустое место словоблудием всяческим забиваю) передаю тебе большой пламенный привет! (В mbr его сам прошей, ладно? А не прошьешь - на eGroup подпишем! Правда, страшно?)

К ВОПРОСУ О СИСТЕМЕ СЧИСЛЕНИЯ (НЕСКЛАДУШКА)

0A программеров с утра "продукт" решили сделать,

Один спросил: "А платит кто?" и их осталось 9...

9 программеров потом предстали перед боссом,

Один из них не знал FoxPro и их осталось 8...

8 программеров затем купили IBM

Один из них сказал: "MAC-класс!", и их осталось 7...

7 программистов с бодуна хотели хелп прочесть,

Один английского не знал и их осталось 6...

5 программистов за свой счет купили CD-ROM,

Один принес пиратский диск - остались вчетвером...

И вчетвером они взялись лабать "продукт" на Си,

Один из них знал лишь Паскаль и их осталось 3...

3 программиста по сети сыграть решили в DOOM,

Один Game Wizard подгрузил и счет стал равен двум...

2 програмиста, отдохнув, набрали дружно "win"

Один устал загрузки ждать - остался лишь 1...

В один прекрасный день 1 все взял под свой контроль!

Но встретился с заказчиком и их осталось 0...

00 программеров ругал отборным матом шеф,

Потом уволил одного... и стало их FF! :)

Чей копилефт не знаю, но амфибрахий еще тот!

ОБРАЩАЕМСЯ К СЕГМЕНТУ ДАННЫХ

[1] Зачем нужен сегмент данных, вы уже знаете - чтобы хранить в нем данные. Зачем нужен сегмент кода, вы тоже знаете - чтобы хранить в нем последовательность команд, которые должен выполнить ваш компьютер. Вводить всякую лабуду в сегмент кода вы уже умеете. А вот вводить лабуду в сегмент данных мы с вами сейчас научимся...

В принципе это уже описано в NYRON'овском мануале по DZEBUG'у, но повторить лишний раз никогда не помешает...

Итак, запускаем DZEBUG и вводим следующую команду:

     -e cs:115

Которая означает: "набиваем сегмент данных всяким дерьмом начиная со смещения 115".

В ответ он вам выплюнет:

     17B3:0115 00.

Что означает: байт по смещению 115 равно 00. И точка. Но это не простая точка - это приглашение ввести НОВОЕ ЗНАЧЕНИЕ этого байта. Когда вы его ввели, нужно нажать на пробел.

Если вы вознамеритесь последовательно ввести 1,2,3,4,5, то это будет выглядеть приблизительно так:

     17B3:0115 00.1 75.2 AD.3
     17B3:0118 66.4 FF.5 [Enter]

А теперь делаем дамп памяти и смотрим, что за дрянь у нас получилась...

А ведь получилoсь же!!

[2] Мы запросто умеем "присваивать" регистру любое значение (mov AL,1C какой-нить), запросто можем "копировать" содержимое одного регистра в другой (mov AL,BL например)... А сейчас мы с вами научимся при помощи той же команды MOV еще и с сегментом данных работать.

Все проще пареной репы... Если мы напишем MOV AL,[115] , то в результате выполнения этой команды в регистр AL "внесутся" две шестнадцатеричные циферки (байт), которые по адресу 115 находятся. То есть в нашем случае AL станет равным 1.

А теперь посмотрите, что делает "обратная" команда:

      mov AL,55
      mov [115],AL

В первой строчке мы присвоили AL значение 55, а второй строчкой "скопировали" значения регистра в байт по адресу 115. Правда, проще некуда?

Обязательно посмотрите на этот процесс под отладчиком! А еще обращаю ваше внимание на то, что фокус MOV [115],55 у вас не пройдет... Команда эта, все же, больше для регистров "придумана" :)), не могет MOV без них жить...

Как говаривал В. И. Ленин по этому поводу: "формально - верно, а по существу - издевательство"...

[3] А еще вот какой изврат с этим можно делать:

      mov BX,115
      mov AL,[BX]

Сие присваивает регистру AL значение байта по адресу 115 :). Ну... через посредника "BX" присваивает! Который у нас "переменная", как известно :).

      mov AL,1C      
      mov BX,115
      mov [BX],AL

А этот кусок кода у нас "записал" 1C в сегмент данных по адресу 115 :).

Ну, и извращения наподобие:

      mov AL,[BX+1]

и

      mov [BX+1],AL

Тоже весьма и весьма полезны в программерском деле :).

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

Задание на медитирование: перепробовать все возможные комбинации операндов команды MOV, работающих с сегментом данных. Особо продвинутые могут поэкспериментировать с выражениями наподобие MOV AX,[BX*SIN(2/pi^2)+1]... или с MOV AX,[DX]... работает это, кстати, абсолютно одинаково...

[4] Низкоуровневый Paint мы с вами уже писали. Сегодня напишем низкоуровневый дZенский EXCEL.

Задание простое... Есть у нас табличка типа:

1 8  
2 9  
3 1  
4 2  
5 2  

в которой данные в формате HEX. И все, что нам нужно с ними сделать - это просуммировать каждую "строчку", а сумму занести в третий "столбец"... В EXCEL'е это делается элементарно... А на машинном уровне, в общем-то, не намного сложней!!

Для начала мы наберем "исходные данные" и зарезервируем место (например, забьем нулями) под третий столбец, в который собираемся помещать результат...

Данные у нас где?? В сегменте данных! Вот его и набиваем, начиная с адреса, например, 115:

   -e ds:115
   17EA:0115  01.1    08.8    02.0
   17EA:0118  09.2    02.9    00.0    03.3    03.1    00.0    04.4    04.2
   17EA:0120  00.0    05.5    05.2    00.0

Вот так это у меня в DZEBUG'е выглядело :). Только я еще дамп посмотрел, правильно ли я ввел:

   17EA:0110  03 E2 F3 CD 20 01 08 00-02 09 00 03 01 00 04 02   .... ...........
   17EA:0120  00 05 02 00 6A 87 04 FF-76 FE 57 57 9A 5C 6C 87   ....j...v.WW.\l.

Вроде правильно :)). Ну а программу я вот какую придумал:

   17EA:0100 BB1501        MOV     BX,0115
   17EA:0103 B90500        MOV     CX,0005
   17EA:0106 8A07          MOV     AL,[BX]
   17EA:0108 024701        ADD     AL,[BX+01]
   17EA:010B 884702        MOV     [BX+02],AL
   17EA:010E 83C303        ADD     BX,3
   17EA:0111 E2F3          LOOP    0106
   17EA:0113 CD20          INT     20

В BX я занес адрес начала сегмента данных (он же - верхний левый угол нашей таблицы).

В CX внес 5, чтобы столько раз цикл выполнился (LOOP по адресу 111).

1. А тело цикла вообще простое: команда по адресу 106 забирает в AL цифирь из первого столбца;

2. 108 - суммирует "цифирь из первого столбца с цифирью из второго столбца" (сумма, само собой, в AL'е остается);

3. 10B - записывает сумму в третий столбец :).

4. Ну и ADD BX,3 для перехода на следующую строчку :).

И все на этом...

Сделайте трассировку (внутрь INT 20 залезать не надо) и посмотрите на дамп нашего сегмента данных :)

Я и говорю: ПРОЩЕ ПАРЕНОЙ РЕПЫ!! ;)

[5] Видите? В качестве переменных "в компьютере" можно использовать не только регистры, но и "куски" памяти! А уж там вы можете клепать свои переменные в почти неограниченном количестве! Единственное, что нужно иметь ввиду: с переменными-регистрами компьютер работает намного быстрее, чем с переменными-в-сегменте-данных :).

Кстати, если вы хотите сохранить плод своих сегодняшних трудов на веник, то имейте ввиду, что вы и сегмент данных тоже должны сохранить! То есть: вам нужно сохранить весь "диапазон" от адреса 100 до 123 включительно :).

Ну и, само собой, при попытке дизассемблирования с адреса 115 у вас абракадабра пойдет... мы об этом уже говорили... один из принципов фон Неймана упоминали...

На сегодня все... ДZенствуйте до следующего понедельника!

Уффф... устал я сегодня, однако...

ОБЗОР ДZЕНСКИХ САЙТОВ - HOMEPAGE АЛЕКСЕЯ ФРУНЗЕ

Однажды монах спросил своего учителя: "В чем сущность дзен-буддизма?"

В ответ старый мастер стукнул ему по голове бамбуковой палкой и ушел медитировать.

Ученик, вмиг достигший просветления, выполз в сад и написал на земле:

  :0102 MOV  CX,0000
  :0105 MOV  AX,0001
  :0108 LOOP 0105 

Намного позже этот дZенствующий монах научился программировать на TASM, MASM, NASM, Watcom C, DJGPP; отбил почки, свернул шею своему учителю (интересно, в какой последовательности он это делал), и уединился в трехэтажной келье, откуда он время от времени являет миру свои PMode (и не только PMode) откровения...

Как то (авторские разработки):

- Frounze Commander (в детстве Алексей занимался детским грехом в виде программирования на Паскале);

- 3-х мерные движки (создатели DOOM'a их потом сплагитили);

- демонстрационные программы, в том числе по 2-х-мерной и 3-х-мерной графике (текстурирование, z-буфер), звуку, работе с системными ресурсами (память, сеть, порты и пр.);

- обучающие программы по тематике защищенного режима и разработке ОС: 32-битный защищенный режим 386+ процессора, обработка исключений, обработка прерываний, переключение задач, страничная адресация, монитор режима v86. Исходные тексты для TASM 3.2+;

- COFF-утилиты, преобразующие объектные файлы в исполняемые. Исходные тексты для NASM и C (компилятор DJPP);

- программы загрузочного сектора, обеспечивающие запуск программ с диска. Исходные тексты для NASM;

- статьи по программированию микроконтроллеров...

Ну и подборка документов на этом сайте соответствующая, то есть самая, что ни на есть, дZенская:

- по 2-х-мерной и 3-х-мерной графике (более 10 документов, 10...600 Кбайт, 3 на русском);

- описание формата файла 3d Studio;

- алгоритмы архивации / компрессии (8 документов, 4 на русском);

- документация по программированию на TASM и MASM (6 документов, 75...500 Кбайт, 4 на русском);

- книга по программированию Дэвида Брэдли (на русском);

- документы и книги по программированию на C/C++ (15, 10...500 Кбайт, в основном на русском);

- справочники по форматам файлов (coff, elf, exe, gif, omf);

- программирование жестких дисков (7 документов, 2 на русском);

- программирование процессоров Intel (8 документов, 4 на русском);

- оптимизация программ, в том числе для Pentium;

- программирование на Паскале (более 10 документов, в основном на русском);

- The great PC Games Programmers Encyclopedy 1.0 (746 Кбайт, английский). Огромное количество специфических советов и примеров для программирования игр;

- Asphyxia VGA Trainers by Denthor (английский) - основы 2d/3d-графики на пальцах;

- документы по программированию CD-ROM, мыши, портов, LAN, Sound Blaster, DPMI, драйверов для DOS, видеоадаптеров, файловых систем;

Вот... обозрили мы, так сказать, DZ Алексея Фрунзе, а адрес его сайта указать чуть не забыли!! Итак, вот он, продукт кипения возмущенного дZенского разума: http://www.chat.ru/~alexfru. Обязательно посетите! Ведь среди многочисленных плевел "программерских сайтов" так редко попадаются настоящие крепкие зерна...

АНОНС!

В следующем номере - "второе погружение в регистры". Может быть... если мне на голову опять не уронят кирпич...