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


Программа из прошлого выпуска - часть 2


Строки (5) и (6) места в памяти не занимают (как и метки). Ассемблер (при ассемблировании) запомнит, что метка My_lab находится по адресу 100h (помните: org 100h?), а метка My_lab2 - 102h. Рекомендую Вам посмотреть в отладчике эту программу.

В программе из прошлого выпуска (как вы уже поняли) мы размещаем Buffer в конце кода. Т.о. оператор: mov dx,offset Buffer

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

Что касается строк (21) - (22). На сколько вы помните из прошлых выпусков, функция 09h прерывания 21h выводит на экран строку. Сама строка должна заканчиваться символом $. Я уже говорил, что если этот знак убрать, то функция, выведя строку на экран, продолжит выводить остальные символы до тех пор, пока в памяти не встреится тот самый "бакс" - $.

Теперь внимательно смотрите на строки (21) - (22): (21)Mess_error db 'Не удалось открыть (найти) файл ' (22)File_name db 'c:\msdos.sys',0,'!$'

Что мы видим? Мы видим то, что не видим в конце строки (21) символ $ (да простят меня за каламбур!). Функция 09h (если файл не был найден) выведет на экран следующее:

Не удалось открыть (найти) файл c:\msdos.sys !

Символ '0' будет отображен как пробел. А для чего нужен '0' в строке (22)? При открытии файла в DS:DX должен быть указан сам файл. Строка должна завершаться символом '0'. Если этот символ убрать, то функция скорее всего вернет ошибку. Ведь файла c:\msdos.sys!$ не существует!

Можем сделать и так, конечно. Только мы потеряем байты: Mess_error db 'Не удалось открыть (найти) файл c:\msdos.sys!$' File_name db 'c:\msdos.sys',0

Какой смысл?

Вот и разобрались... Мы будем очень часто на практике использовать данный метод. Поэтому, если у вас и остались "темные моменты", мы их постепенно "просветлим".




Начало  Назад  Вперед



Книжный магазин