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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10943
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4312
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2209
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1529
Дата выхода:20.07.2012, 11:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:84 / 31
Вопросов / ответов:1 / 1

Консультация # 186450: 1. Чем отличаются первая редакция книги Калашникова от 2006 и вторая от 2011(2) ?? 2. У меня при изучении ассемблера по книге Калашникова возникли мысли и хотелось бы понять насколько они верные. Почему в этой программе избыточный код http://www.kalashnikoff.ru/Assembler/issues/encl/009/PROG09.asm.htm ??? а именно Процеду...


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

1. Чем отличаются первая редакция книги Калашникова от 2006 и вторая от 2011(2) ??

2. У меня при изучении ассемблера по книге Калашникова возникли мысли и хотелось бы понять насколько они верные.

Почему в этой программе избыточный код
http://www.kalashnikoff.ru/Assembler/issues/encl/009/PROG09.asm.htm
???
а именно
Процедура

Open_file proc
cmp Handle,0FFFFh ; Вот эта проверка будет всегда пройдена поскольку мы сами ниже определяем значение Handle а второй раз этот код отрабатывать не будет и в итоге вообще непонятна целесообразность Handle
jne Quit_open
mov ax,3D00h
int 21h
mov Handle,ax <------ Здесь идентификатор переносится в переменную, хотя еще не была произведена проверка флага переноса. иначе вхолостую можно потерять время если файл не открыт.
ret
Quit_open:
stc
ret
Handle dw 0FFFFh
Open_file endp

то есть мы могли бы написать....
m ov dx,offset File_name
mov ax,3D00h
int 21h
jc Error_file

Но Олег усложнил код по какой то причине мне непонятной.... Очень любопытно !!!

Чисто теоретически файл мог бы быть открыт второй раз.... но!!!
если бы мы спрашивали ОС открыт ли файл, то это было бы верно, но там с потолка (???) идёт присвоение переменной идентификатора значения FFFFh

Допустим запустили раз эту программу и второй раз (что для DOSа нереально ибо он однозадачен), но даже если запустили под win98 то в каждой программе будет своё адресное пространство и своя переменная Handle и даже если файл уже открыт, другая копия программы об этом не узнает. Возможно более лучший выход файлы семафоры.

Дата отправки: 17.07.2012, 10:40
Вопрос задал: Роман И. (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Роман И.!
Давайте по-порядку...
1) cmp Handle,0FFFFh ; Вот эта проверка будет всегда пройдена поскольку мы сами ниже определяем значение Handle а второй раз этот код отрабатывать не будет и в итоге вообще непонятна целесообразность Handle
Да, Вы правы, проверка будет пройдена. И можно было ее не делать.
Но то, что сделано, ничего страшного. Дело в том, описатель файла надо было сохранить, чтобы потом файл закрыть.
Хотя опять же, можно было обойтись и регистром bx.
То, что, некая переменная, в нашем случае, handle изначально равна 0ffffh, часто используется, к примеру, в проверке, надо ли
закрывать файл. Здесь этого нет, но идея такая.

2)mov Handle,ax <------ Здесь идентификатор переносится в переменную, хотя еще не была произведена проверка флага переноса. иначе вхолостую можно потерять время если файл не открыт.
Вы опять правы. Сохранять описатель следует после проверки корректности открытия...

3) то есть мы могли бы написать....
mov dx,offset File_name
mov ax,3D00h
int 21h
jc Error_file
Можно было... Но handle желательно сохранять, можно, конечно, хранить и в bx...

4) Но Олег усложнил код по какой то причине мне непонятной.... Очень любопытно !!!
Я уже объяснил, что при чтении, записи, закрытии надо проверять корректность операций, что можно сделать проверкой handle на равенство 0ffffh. В простейших случаях, можно этого не делать. Но в более сложных программах без этого не обойтись. В данной программе просто заложен, но не реализован, механизм проверки.

5) с потолка (???) идёт присвоение переменной идентификатора значения FFFFh
Сделано присвоение заранее определенным значением, чтобы иметь возможность проверки на корректность

6) Допустим запустили раз эту программу и второй раз (что для DOSа нереально ибо он однозадачен), но даже если запустили под win98 то в каждой программе будет своё адресное пространство и своя переменная Handle и даже если файл уже открыт, другая копия программы об этом не узнает. Возможно более лучший выход файлы семафоры.
Под ДОС-ом программы не знают о существовании друг друга... А семафоры - это уже из программирования под другие ОС

После внимательного анализа программы, после замечания Зенченко Константина Николаевича,
выяснилась любопытная деталь, связанная с работой данной программы:
1) После открытия файла описатель файла сохраняется в переменной handle
2) После чтения файла, а это наша же программа на ее же место, переменная handle опять станет равной 0ffffh!
3) Последующее закрытие будет уже оперировать с handle = 0ffffh, что является ошибкой!
Выходов, как минимум два:
1) Хранить handle в другом месте (в bx, стеке, в другой памяти)
2) Читать не весь файл, например только сегмент кода (переделав слегка код)

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 17.07.2012, 11:46
Рейтинг ответа:

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


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

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

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



В избранное