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

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


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 80
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 5-й класс
Рейтинг: 0
∙ повысить рейтинг »
quirck
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1663
Дата выхода:28.10.2017, 21:15
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:46 / 17
Вопросов / ответов:1 / 1

Консультация # 191523: Уважаемые эксперты, здравствуйте, у меня возникли вопросы по главе 9 книги О.А.Калашникова, листинг 9.3 и листинг 10.1, 1) call Open_file jc Error_file процедура (subroutine в Фортране или функция в Си) Open_file:
Код ::

Консультация # 191523:

Уважаемые эксперты, здравствуйте,
у меня возникли вопросы по главе 9 книги О.А.Калашникова,

листинг 9.3 и листинг 10.1,
1) call Open_file
jc Error_file

процедура (subroutine в Фортране или функция в Си) Open_file:

Open_file proc
cmp Handle,0FFFFh
jne Quit_open
mov ax,3D00h
int 21h
mov Handle,ax
ret
Quit_open:
stc
ret
Handle dw 0FFFFh
Open_file endp

вопросы -
а) зачем нужна строка "cmp Handle,0FFFFh", когда переменная Handle уже инициализирована в этой процедуре-сабрутине-функции и ей уже присвоено значение 0FFFFh ?
б) ведь Handle - это всего лишь переменная, а не регистр ?
в) что означает шестнадцатиричное число 0FFFFh ? это адрес стэка ? адрес начала или конца стэка (последний зашел - первый вышел) ?

2)
mov cx,offset Finish-100h
mov dx,offset Begin
int 21h

здесь Finish - это адрес первого свободного байта сразу же после конца данной ассемблеровской com-программы. это я понимаю.
далее - 100h - это адрес, в CS-сегменте (сегменте кода), первой строки данной com-программы.
вопросы -
а) означает ли это, что строки
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin:

не занимают никакой памяти в com-файле, а предназначены лишь как инструкции для самого Ассемблера-компилятора, нежели для микропроцессора ?
б) что находится в первых от 0h до 0FFh байтах в полученном исполняемом com-файле ? либо поставим вопрос по-другому - данная исполняемая com-програма (файл) начинается с ассемблеровских инструкций сразу же после метки "Begin:" ? а когда данный com-файл загружается из ПЗУ в ОЗУ - сразу же после выдачи команды "prog09.com" в Dos-овской оболочке и соответственно после нажатия клавиши "Enter", то именно в ОЗУ (а не в самом com-файле) первые байты с коде сегмента CS, от 0h до 0FFh, заняты чем-то ? чем-именно ? эти первые байты заняты чем-то только для модели tiny ?
в) "Finish-100h" - это мне понятно:
это размер в количестве байта данной com-программы - от
"mov dx, offset File_name" и до "end Begin". правильно ли я это понимаю ?

3)
call Close_file
; ------------ Выводим сообщение --------------
mov ah,9
mov dx,offset Mess_ok
int 21h
ret

вопрос - почему используется команда "ret", а не "int 20h" ?

Спасибо.

Дата отправки: 23.10.2017, 21:06
Вопрос задал: ialmiev (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, ialmiev!

1)
При открытии файла, в переменную Handle записывается некоторое число-дескриптор, по которому ОСь однозначно идентифицирует данный файл. Это число не может быть 0-4(stdin, stdout, stderr, stdaux, stdprn) -значения соответственно уже зарезервированы, поигравшись с файлами-дескрипторами (три последовательно открытых файла имеют последовательные номера, т.е. это индексы некоторого массива управляющих файлами структур операционной системы) и величина ограниченна значением системной переменной FILES в файле config.sys и максимальное значение равно 255.
0хFFFF - уникальное число(-1 или 65535), т.к. такое число одновременно открытых файлов система не даст открыть.

2)

Код (Assembler) :: выделить код
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin:

Эти строки - директивы компилятора, они участвуют только в процессе создания кода:,
- 1) описывает сегмент памяти как отдельный логический блок, это сокращенная запись от записи:
имя_сегмента segment readonly выравнивание. тип разряд 'класс'
имя_сегмента segment - сокращенная запись;
readonly - опция директивы, которая, заставляет MASM(другим без разницы) выдавать сообщение о попытке записи в этот сегмент;
выравнивание - опция указывающая компилятору с какого адреса может начинаться сегмент, обычно PARA - 16-ть байт, т.к. меньше не имеет смысла из-за особенностей формирования физического адреса;
тип - опция, которая указывает можно ли и как комбинировать сегменты между собой;
разряд - 16-ть или 32-а битный сегмент;
'класс' - может быть любое имя в кавычках, все сегменты с одинаковым классом, будут расположены друг за другом;
- 2) указывает компилятору, что данный сегментный регистр связывается с таким-то сегментом или группой сегментов;
- 3) указывает компилятору, с какого адреса генерировать код.

Сейчас используется упрощенные директивы: .CODE, .DATA, .STACK, вместе с указанием модели памяти: .MODEL TINY | SMALL | FLAT.

В памяти от 0h до 0FFh находится префикс программы, для данной модели памяти(tiny) он одинаков для всех сом-файлов и подставляется автоматически системой. Это сложилось исторически, когда компьютеры были маленькие и места чтобы хранить в каждой программе аж 256 байт не было.

В данной строке вычисляется длина самого кода, от последнего адреса программы вычитается длина префикса программы(см. выше).

3)
Вместе с префиксом программ система ещё защищает себя, она автоматически в стек записывает код 0х0000, когда клавиатурный маньяк случайно завалит стек и очередной раз выполнит команду RET, то управление получит код по адресу CS : 0000, а там команда INT 20h.

Удачи!

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 25.10.2017, 16:30

5
нет комментария
-----
Дата оценки: 26.10.2017, 02:27

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное