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

Ассемблер? Это просто! Учимся программировать Выпуск N 28 (Оболочка)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать
______________________________________

Выпуск N 028 (Оболочка)

Здравствуйте, уважаемые подписчики!

Сегодня в номере:

  • Информация для новых подписчиков

  • Новости

  • Ваши письма.

  • Оболочка

  • Наши партнеры


  • Информация для новых подписчиков

    Благодарю Вас, что подписались на рассылку "Ассемблер? Это просто! Учимся программировать". Надеюсь, что Вы не останетесь равнодушны к ней и почерпнете море полезной информации, а также повысите свой уровень в "общении" с IBM-совместимыми компьютерами.

    Прежде, чем приступать к изучению материала в данном выпуске, Вам необходимо внимательно ознакомиться с предыдущими. Я уверен, что Вы очень быстро и без труда догоните остальных подписчиков, не смотря на то, что у нас уже 28 выпуск.

    Все, что нужно для изучения Ассемблера (предыдущие выпуски, адреса экспертов, необходимые программы, документацию, а также многое другое), можно найти на сайте http://www.Kalashnikoff.ru. Рекомендую Вам сперва ознакомиться с разделом "Информация для новых подписчиков".

    Если у Вас нет выхода в Сеть, то предыдущие выпуски рассылки, информацию для новеньких и адреса экспертов можно получить по почте, направив пустое письмо по адресу AssmIssues@Kalashnikoff.ru. Архив (420 Кб) будет выслан Вам автоматически в течение двух рабочих дней с момента получения Вашего письма. Однако, пожалуйста, не злоупотребляйте этим, т. к. высылка писем подобного объема несет существенную нагрузку на почтовые сервера. Обращаю также Ваше внимание на тот факт, что бесплатные сервера (mail.ru, beep.ru, newmail. ru и т.п.) не всегда работают корректно. Если письмо к Вам не придет в указанный выше период, то поробуйте отправить запрос еще раз.


    Новости

    Новостей как всегда много. Есть хорошие, есть и плохая. Ну, начну с плохой.

    1. К сожалению, не получается у меня выпускать рассылку раз в неделю. Даже раз в две недели. Вся проблема в том, что как всегда не хватает времени. И еще рук. Эх, мне бы две говловы, да 4 руки, плюс 40 часов в сутки... Поверьте, работы очень много. Я параллельно над книгой работаю. Уже готова вторая часть и половина третей. И страниц - не поверите! - порядка 300! Вот такие вот дела...

    Я надеюсь, что рассылка дойдет до конца с периодичностью 1-2 раза в месяц. Тем более, что осталось-то совсем немого выпусков.

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

    "Как же так", - спросите вы. "А под Windows мы не будем программировать?". Не волнуйтесь! Все будет. Дело в том, что рассылка "Ассемблер? Это просто! Учимся программировать" будет закрыта, а вместо нее станет выходить под другим названием. Но об этом позже...

    Хорошие новости.

    2. Начала потихоньку набирать обороты новая рассылка FAQ, в которой публикуются вопросы подписчиков и ответы экспертов на них. Не буду долго рассказывать, скажу только, что теперь любой желающий может стать экспертом, а также выйти из состава экспертов. Все эксперты получают баллы за отправленные ответы, за которые можно получить... А, впрочем, если вы заинтересовались, то заходите сюда: http://www.kalashnikoff.ru/Experts/Rules.html. Вскоре будут также поощряться подписчики подающие самые интересные вопросы.

    В рассылке FAQ планируется также публиковать ваши письма, мысли, предложения по программированию, алгоритмы, выдержки и многое другое, что относится к программированию. Все сообщения вы сможете отправлять самостоятельно. Выпуски, как уже отмечалось, выходят автоматически. В них будет скоро установлена форма голосования на ответы экспертов. От этого будет также зависеть начисление баллов тому или иному эксперту. Более того, скоро каждый желающий сможет самостоятельно создать свою экспертную группу (например, по программированию на Паскале, Си и т.п.). На эту группу смогут подписываться эксперты.

    Весь сервис осуществляется теперь через сервер Kalashnikoff.ru. Хостинг предоставляется компанией www.100mb.ru.

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

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

    Благодарю всех, кто уже зарегистрировался в качестве экспертов, а также всех подписчиков, отправляющих вопросы.

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

    4. Количество подписчиков на нашу рассылку перевалило за 10.000. Спасибо вам, что читаете, подписываетесь, участвуйте в обсуждениях. Хотя я должен извиниться за задержку с ответами на ваши письма, т.к. времени очень мало.


    Доброго времени суток, Олег!

    Я хотел бы предложить один интересный вариант вызова процедур с передачей параметров. Я сам это использую очень часто в своих ассемблерных программах. Это предложение появилось после прочтения письма Макса (Макс Черничкин (ака Semax) (semax@aport.ru)). Выглядит это так:

    .model tiny, pascal

    call MyProcedure, word ptr Param1, ax, ds, 12

    MyProcedure proc Param1:word, Param2:word, Param3:word, Param4:word

    mov ax, Param1

    mov bx, Param2

    add ax, Param3

    sub bx, Param4

    add ax, bx

    ret

    MyProcedure endp

    Модель памяти может использоваться любая, после оператора возвращения из процедуры не надо указывать число для освобождения стека. Если в качестве параметров передавать адрес переменной, то из процедуры можно будет менять содержимое переменной. Косая черта позволяет переносить продолжение длиной строки на новую строчку. Думаю, это будет интересно и полезно многим программистам на ассемблере. Про себя могу сказать, что я просто ОБОЖАЮ этот язык за его ВСЕДОЗВОЛЕННОСТЬ и ПРОСТОТУ.

    Best regards, TimsoN
    e-mail:
    timson@katehgr.almaty.kz



    Sshell28.asm (головной файл)

    Display.asm

    Files.asm

    Keyboard.asm

    Main.asm


    Messages.asm

    Data.asm

    Итак, теперь оболочка работает без сбоев, т.е. мы можем читать каталог, заходить в подкаталоги и возвращаться в корневой. Работают также клавиши PageUp, PageDown, Home, End, Insert (отметка файлов) Ctr+F3.

    Более того, алгоритм считывания файлов и вывод их на экран полностью изменился. Я позаимствовал алгоритм считывания каталога у Макса Черничкиина. Спасибо Вам, уважаемый читатель Макс, за присланный алгоритм. Надеюсь, что Вы не будете против его применения в наших файлах-приложениях. Более того, полагаю, что многие подписчики с удовольствием с ним ознакомятся.

    Что же это за алгоритм и как он работает?

    Об этом вкратце писалось в письме Макса в прошлом выпуске. Теперь рассмотрим его на практике.

    Считывание каталога происходит следующим образом:

    Готовим сегментные регистры:

    mov fs,Seg_offset ;FS - сегмент смещений файлов
    xor di,di
    mov Current_offset,di
    mov fs:[di],di ;Получаем смещение файла в банке данных смещений
    mov bp,2 ;Следующий файл будет помещаться по адресу 2

    Обратите внимание на новый сегментный регистр FS, который начал использоваться в 286 процессоре. Ничего особенного в нем нет. Поэтому считайте его дополнительным сегментом.

    Итак, файлы будут размещаться таким образом: отводим память под смещения для файлов:

    ;Здесь будут смещения на файлы
    mov ah,48h
    mov bx,250 ; 250 * 16 = 4000 байт = 2000 ссылок на файлы
    int 21h
    mov Seg_offset,ax ;Сохраним сегмент

    Отводим память для хранения файлов:

    ;Здесь будут сами файлы
    mov ah,48h
    mov bx,4096 ;4096 * 16 = 65536 байт
    int 21h
    mov Seg_files,ax ;Сохраним сегмент

    Сейчас все будет понятно.

    Представим, что в читаемом каталоге есть два файла: main.asm и other.asm.

    Таким образом, файлы в памяти будут размещены так:

      main.asm other.asm <Конец фалов>
    Seg_offset 0000h 0009h 0FFFFh
    Seg_files main.asm + ASCII 0 other.asm+ASCII 0  

    В таблице вы видите два сегмента, которые мы отвели (см. выше): Seg_offset и Seg_files. В первом сегменте будут сохраняться смещения на файлы, которые находятся во втором сегменте. Сигналом окончания файлов служит число 0FFFFh вместо смещения в первом сегменте.

    Теперь процедура вывода на экран:

    Получаем число (2 байта), расположенное в сегменте Seg_offset по смещению 0000h. В первом случае это будет 0000h. Затем читаем и выводим файл, который расположен по полученному смещению из сегмента Seg_offset.

    Увеличиваем указатель смещения в первом сегменте на 2 (т.е. перейдем на следующий файл). Получаем число 0009h. По этому смещению находится в памяти следующий файл (т.е. other.asm). Его и выводим.

    Увеличиваем указатель на 2. Получаем очередное смещение. Это 0FFFFh? Значит предыдущий файл был последним. Все! Вывод закончен.

    Все просто!

    Более того, обратите внимание, что и перемещаться по каталогу в памяти будет очень удобно. Хотим получить имя пятого файла в цепочке? Производим нехитрые вычисления: 5*2=10. Почему на два? Так ведь смещение занимает два байта. Т.о. получаем смещение пятого файла в сегменте Seg_files. Остается его только вывести.

    Реально наша оболочка заносит не только имя файла + ASCII 0, но и его статус (текущий, отмеченный) и размер. В следующем выпуске добавим атрибуты и дату создания / изменения.

    Вот, собственно, и весь алгоритм. Только на словах он звучит очень просто, а вот на практике не очень. Ну, я полагаю, вы разберетесь.

    Я, конечно, понимаю, что чем больше программа, тем сложнее в ней разобраться. Помните: терпение, упорство и желание изучить Ассемблер вам воздастся полностью.

    _____________

    Рассмотрим еще несколько новых переменных:

    1. mov Current_file,0
    2. mov Start_file,0
    3. mov Out_fstat,1

    Первая переменная хранит в себе смещение текущего файла (т.е. файла, на котором установлен курсор). Так нам удобней и быстрее будет искать текущий файл.

    Вторая переменная содержит смещение файла, с которого следует выводить файлы на экран. Наша оболочка может отображать на экране 21 файл. Если же в каталоге больше файлов, то, дойдя до самого нижнего внизу или вверху экрана, необходимо "прокрутить" их. Т.е. самый верхний / самый нижний на экране убирается, а на месте его появляется следующий / предыдущий. Вот переменная Start_file как раз и будет хранить смещение файла, с которого нужно выводить на экран все последующие файлы.

    Обратите внимание, что под словом "прокрутка" понимается на т.н. "скролинг", а запись файлов поверх себя. Дело в том, что скролинг осуществляется с помощью прерывания 10h, что существенно тормозит работу. Для этого мы будем лучше пользоваться нашим способом, который не требует вызова никакого прерывания.

    Третья переменная (Out_fstat) хранит состояние вывода одного файла, а именно: чистить ли полностью строку перед выводом или нет. Зачем чистить строку перед выводом файла? Представьте, что файлы прокручиваются на экране. Тогда получаем так:

    M A I N . A S M  
    O T H E R . A S M

    Таким образом, прокрутив файлы вниз (main.asm "ляжет" на место other.asm) мы получим такое на экране:

    main.asmm

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

    Почему же тогда в одних случаях мы чистим строку, а в некоторых - нет (это регулирует переменная Out_fstat)? Если чистить строку каждый раз, то файлы будут мерцать, что не очень удобно для просмотра. Если вы не поняли о чем идет речь (сумбурно я объяснил как-то), то поэкспериментируйте. Надеюсь, станет все понятно...

    Пример: пользователь на самом верхнем файле нажимает клавишу "Insert", что приводит к отметке файла (т.е. он на экране выделяется светло-желтым цветом). Делается это очень просто.

    У нас существует процедура вывода файлов (Out_files, FILES.ASM), которая выводит файл, начиная с позиции Start_file и до конца (либо 21). Как уже омечалось, в буфер заносится не только имя найденного файла, но и его статус (изначально все файлы имеют нулевой статус, т.е. не отмечен, не текущий). После перечитывания каталога мы автоматически делаем первый файл текущим (статус - 1), т.е. на нем будет стоять курсор.

    Вернемся. Пользователь нажал "Insert". Мы даем текущему файлу статус 2 (т.е. отмеченный). Для этого первый байт в буфере для файла (т.е. его статус) отмечается как 2. Для следующего файла ставим статус 1 (текущий) и вызываем процедуру Out_files. Out_files берет первый файл, "смотрит" его статус. Если это 1 - то выводит с обычными атрибутами (т.е. как будто на него указывает курсор), если 2, то как отмеченный (т.е. светло-желтый), если иной другой, то как отмеченный + текущий. И так с каждым файлом.

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

    Если при этом не было "прокрутки" фалов, то мы вызываем Out_files, при этом занеся в Out_fstat число 0, что укажет процедуре на то, что чистить строки не надо (все равно ведь все символы будут ложиться поверх уже существующих).

    Если же произошла прокрутка файлов, то вызываем процедуру Out_files, при этом занеся в Out_fstat число 1, что укажет процедуре чистить строку перед выводом каждого файла.

    Поэкспериментируйте с приложением...

    ____________

    Что происходит, если пользователь нажимает клавишу PageUp или PageDown. Очень просто! Мы имитируем нажатие на клавишу "Стрелка вверх" или "Стрелка вниз" столько раз, сколько файлов показано на экране.

    Что происходит, если пользователь нажимает на клавиши "Home" или "End"?

    Процедуры Up_pressed и Down_pressed (нажатие на стрелку вверх или вниз) устанавливают флаг переноса, если достигнут конец списка файлов (или начало). Сами же процедуры работают так:

    ; === Клавиша Home ASCII 49h ===
    K_Home proc
    ;Выводить будем до тех пор, пока процедура Up_pressed не вернет установленный флаг переноса (Carry Flag)
    Next_khome:
    call Up_pressed
    jnc Next_khome

    ret
    K_Home endp

    ; === Клавиша End ASCII 49h ===
    K_end proc
    Next_kend:
    call Down_pressed
    jnc Next_kend

    ret
    K_End endp

    _______________

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

    Удачи!


    Ну и на последок хотелось бы сказать пару слов о наших партнерах.

    1. Рассылка "Уроки для начинающих программистов".

    Одна из лучших рассылок по программированию для начинающих. Проект Эдуарда Дмитриева.

    Рассылка для тех, кто не знаком или почти не знаком с программированием, но хочет ему научиться... Я буду учить Вас писать программы начиная от работы с простейшими алгоритмами, кончая графикой и созданием полноценных видеоигр и системных программ... Вы научитесь писать гостевые книги, счетчики, рассылки и другие полезные вещи. Освоите HTML, JAVA и JAVA script...

    http://prog.agava.ru - Библиотека программиста.

    ________________

    2. Hi-tech - Рассылка "Низкоуровневое программирование для дZенствующих".

    В данной рассылке рассматривается программирование на Ассемблере. Как уверяют сами авторы данного проекта: "Наш авторский курс по низкоуровневому программированию. С его помощью вы наконец-таки разберетесь с тем, как все-таки работают эти чертовы компьютеры, научитесь программировать их "узкие места" и обходить многочисленные "подводные камни"...". На мой взгляд это довольно-таки интересный проект, причем, авторы постарались подойти к изучению Ассемблера с тонким компьютерным юмором, что придало рассылке "Низкоуровневое программирование..." некую уникальность (код рассылки: comp.soft.prog.hitech).

    ________________

    3. Рассылка Сергея Никифорова "Программирование на Visual Basic и ASP" на Subscribe.ru (код рассылки: comp.soft.prog.vbs).

    Название и сайт автора: Visual Basic Streets, http://www.vbstreets.ru.


    С уважением,

    Калашников Олег: Assembler@Kalashnikoff.ru
    Мой ICQ No.:
    68951340
    URL сайта подписчиков:
    http://www.Kalashnikoff.ru
    Форма для подачи вопроса:
    http://www.Kalashnikoff.ru/Experts/Question.html

    ______________

    По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

    1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
    2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
    3. Издание книги по материалам рассылки (спонсорство): Sponsor@Kalashnikoff.ru

    (C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.

    List Banner Exchange lite

    http://subscribe.ru/
    E-mail: ask@subscribe.ru

    В избранное