Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 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) Читать не весь файл, например только сегмент кода (переделав слегка код)
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий