Асемблер Лесно е! Научете се да програмирате брой N 012 (bler) Бюлетин

Последните 60 дни5 броя (2-3 пъти на месец)

Пощенски сайт: http://rusfaq.ru Отворен: 28-06-2000

Статистика

асемблер? Просто е! Да се ​​научим да програмираме, брой N 012

Здравейте, здравейте, мили мои!

Брой N 012

Квас. Отново квас глътка хляб.

Знам, че сега ще получа пощата.

Просто трябва бързо да вляза онлайн.

За да намерите ново издание там.

Къде си, моя дългоочаквана, къде?

Лигите вече се стичат по брадата ми.

Ето ти! ще те чета.

Какво имаме днес?

http://www.oleg77.newmail.ru (тук можете да намерите и целия необходим софтуер за работа с Assembler).

Ако нямате достъп до мрежата, тогава ми напишете писмо с молба да изпратя този или онзи брой или всички заедно:

Моите приятели! Променихме значително облика на сайта. BoB ми помогна за това, за което много му благодаря, както и много благодарности.

Вече има и Книга за гости, където можете лично да оставите вашите впечатления, пожелания, критики и др.

Има и раздел с писма, които можете да изпратите сами на сайта (например решение на програмата, мисли, бележки и др.).

Единственият проблем: качете всичко на сайта www.oleg77.newmail.ru. Мисля, че тази седмица ще направя всичко.

Ако проявявате интерес, можете да разгледате по-късно. Всички ваши отговори се приемат тук: [email protected]?Subject=Website

Вече съм писал неведнъж, че много писма идват при мен. Ако имаше 124 часа в денонощието, може би бих могъл да отговоря на всички. Извинявам се ако някой не е получил отговор. Всъщност нямам време да отговарям на всички имейли.

Така чеНа първо място Отговарям на имейли:

  • с искане за изпращане на предишни издания на бюлетина;
  • с искане за изпращане на shell.asm, virus.asm, resident.asm и други програми в асемблер, които са необходими за работа;
  • с искане за изпращане на софтуер (masm, afd, hiew и др.).

Второ отговарям на следните имейли:

  • "Написах програма от версия X, но тя не работи. Направих това и това, имам такъв и такъв компютър (386, Pentium. ), такъв и такъв асемблер (MASM, TASM версия x.xx), такава и такава ОС (MS-DOS, Windows 95/98). Прилагам програмата, която съм написал. Намерете и коригирайте грешките ми."
  • "MASM (TASM, AFD, HIEW) не работи. Пише това и това. Пускам го по този начин. Какво да правя?"

НЕ отговарям на имейли като този:

  • „Аз самият съм тракторист. Никога не съм виждал компютър в очите си. Преди седмица наследих Pentium-III 800 от моята прабаба. Моля, напишете подробно какво трябва да се направи, за да работи (какви кабели да включа, какъв бутон да натисна, какви програми да инсталирам и т.н.). Моля, изпратете и ВСИЧКИ необходимия софтуер на моя приятел по имейл (Windows 2000, MS Office 2000 и т.н.). Искрено ly, Izya Abdulaev.P.S. Откъде мога да купя друг твърд диск и най-важното - как да го сложа в компютъра? Дядо ми има такъв, но всеки ден ходи на лов с него и не ми позволява."
  • "Наскоро се абонирах за вашия пощенски списък. Един проблем: никога не съм работил с DOS. Напишете подробно как мога да изтегля Norton Commander (DOS Navigator), как да създавам и изтривам файлове в него, как да ги редактирам. И като цяло, какво е командният ред? С уважение, ученик от 3 клас, Т. Чайников."
  • "Пиша програма за управление на сателити. Моля, напишете ми процедура, която да изведе сателит в орбита. Иначе нещо не ми се получава. С уважение, космонавт Невесомов."
  • "Хей, брато! Помогни ми да хакна банката в Кидалово. Искам да преведа пари от един човек в моята сметка. Чакам отговор! Вован Безбазаров."

Подобни писма идват на партиди. Просто физически не мога да отговоря на всичко. Не забравяйте, че имам работа, училище, син и много проблеми. Моля, не се обиждайте, ако не отговоря на никого.

Още един момент. защото Използвам безплатни пощенски кутии (beep.ru, hotmail.ru), които не носят отговорност за предоставените услуги, възможно е вашето писмо да не стигне до мен. Ако не отговоря в рамките на 3 дни, моля, изпратете го отново.

„Изпратете ми стюард и вземете лимон!“

— Вие всички сте козли, а аз съм д'Артанян!

„Вижте моите снимки в прикачения файл!“

"Предлагам готина работа за луди пари! Подробности в кандидатстването."

И така нататък. Не изпращам такива писма и не ги чета, което ви съветвам да правите. Ако все пак получите такова писмо от мое име, моляВЕДНАГА да ме информирате за това. Аз ще бъда много благодарен.

Получих писмо от един от абонатите миналата седмица, който посочи грешка в брой N 009 (когато се четат в паметта). О, каква неприятна логическа грешка направих! И само един абонат забеляза, който дълго ми обясняваше същността му. Ай-да, браво, Серьога! И така, ето го това писмо:

Здравей Олег! Простете за настойчивостта, но.

Опасявам се, че не зададох въпроса си много добре. първо ще пробвам.

Четвъртък, 05 октомври 2000 г., 13:24:51, вие написахте:

KO> Open_File процес

KO> cmp Handle, 0FFFFh ;Ако Hanlde не е 0FFFFh (вижте по-долу), тогава не е необходимо да го отваряте отново. КО> jne Quit_open KO> movax, 3D00h ; отворен за четене KO> int 21h KO> mov Handle, axe ;save handle

KO> Сега нашата дръжка не е 0FFFFh. Следователно, ако се опитаме да затворим файла, първо проверяваме дали е бил отворен (дали Handle е 0FFFFh; ако е така, няма нищо за затваряне.) Съгласно. Трудно е да не се съглася.

KO> Тук проверяваме дали Handle съдържа 0FFFFh. Тези. дали файлът наистина е отворен или не. Да, но между извикванията на open_file и close_file ние препрочитаме файла и това променя манипулатора! А именно, по мое мнение, събитията се случват така Действие за манипулиране (след) ------------------------------------------------- стартиране на FFFF open_file 1 (без значение какво, основното нещо не е FFFF) четене на FFFF файла! За това говоря! Вижте по-долу close_file FFFF

Опитайте да замените процедурата за затваряне със следното (просто добавете 2 реда изход) - това, което добавих вдясно, е отбелязано с ';///':

Close_File proc cmp Handle, 0FFFFh je No_Close mov ah, 3Eh mov bx, Handle int 21h mov Handle, 0FFFFh mov ah, 9h ;/// mov dx, отместване Mess_Close_ok ;/// int 21h ;/// No_Cl ose: mov ah, 9h ;/// mov dx, отместване Mess_Close_Nok ;/// int 21h ;/// ret Close_File endp

Ако всичко работи добре (както казвате), първо се показва редът Mess_Close_ok, а след това Mess_Close_Nok. Но в действителност редът Mess_Close_ok не се показва (но изглежда, че е, ако Handle не е FFFF)!! И Mess_Close_Nok се показва веднага

Тоест имаме - командата 'je No_Close' в тази процедура се изпълнява и отива към етикета No_Close. За всеки случай прикачих asm файл(никога не знаеш, че си изтрил този пример, а не да управляваш на ръка), където процедурата на затваряне е точно такава и може да се наблюдава този ефект.

Това е ефектът, за който говорих. Но след отваряне на файла Handle определено не е FFFF (поне в дебъгера). Но преди затваряне - FFFF. Тоест, остава да се приеме, че когато препрочитаме файла, Handle става FFFF. Защо така - опитах се да опиша по-рано.

Най-добри пожелания, Сергей

Ето още едно предложение:

Според мен тя е 2 пъти по-добра от Джордейн. Навремето се научих от това.

Е, още едно писмо. Един от нашите последователи има нужда от помощ. Някой може ли да предложи какво:

А сега да се заемем с работата.

Днес ще разгледаме една от възможностите за използване на резидент. Първо погледнете файловете resid12.asm и test12.asm.

Какво прави програмата? Първо, нека заредим файла resid12.com в паметта. След това стартирайте файла test12.com. какво виждаме

Resid12.com поддържа рутина в паметта, която отпечатва низа ASCIIZ (низът, завършващ на 0) на екрана. Освен това процедурата Int_10h_proc е "окачена" на 10h прекъсване (това е прекъсване на BIOS (ROM), както вече знаете). Нещо подобно разгледахме в предишния брой. В този случай добавяме още една функция (88h), за да прекъснем 10h. За да работи, трябва да извикаме 10h прекъсване и да заредим необходимите числа (данни) в регистрите. Това:

AH=88h - номер на нашата функция;

Моля, обърнете внимание отново, че не зареждаме нищо в DS (сегмент), а само в SI (отместване). Ако сте забравили, нека ви напомня: при стартиране на който и да е *.com файл сегментните регистри CS, DS, ES, SS са равни на нашия единствен сегмент, в който е заредена програмата. Сегментът може да бъде всякакъв. Всичко зависи от това колко резидентни програми са заредени.

Така че, нека да разгледаме по-подробно програмата resid12.asm.

Първо, нека отидем на етикета за инициализация. По време на инициализацията обикновено се настройват необходимите регистри, прекъсванията се прихващат и т.н. има "подготвителен процес".

Първо, нека проверим дали нашият резидент е зареден в паметта или не. Как се прави? защото прихванахме прекъсването, тогава можем да направим отговор от него. Това правим ние. Извикваме прекъсването 10h, като въвеждаме "магическото число" в регистъра AX: 8899h (възможно е всяко друго. Основното е, че не е в конфликт с никоя функция на това прекъсване). Ясно е, че 88h е въведено в AH, а 99h е въведено в AL. Функцията 88h не съществува за 10h прекъсване (разработчиците все още не са достигнали това число). Това може да се предположи с 99,9% сигурност. защото такава функция не съществува, тогава прекъсването 10hведнага ще излезе (регистрите не се променят!), което е лесно да се провери в дебъгера. Следователно, като извикаме прекъсване 10h с номер 8899h в AX и получим 8899h в същия AX в отговор, ние сме сигурни, че нашият резидент все още не е зареден. Сега всичко ще стане ясно.

Ако вече сме в паметта, след като сме уловили прекъсването от 10h, тогава първо ще проверим дали се извиква с номер 8899h в AX. Ако е така, тогава ще трябва да се изпрати някакъв отговор. Който? В нашия пример разменяме съдържанието на регистрите AH и AL и незабавно излизаме от прекъсването. Просто казано, връщаме се към нашата програма, която от своя страна проверява дали номерът 8899h или 9988h се е върнал (не забравяйте, че ако нашият резидент не е в паметта, тогава 8899h ще се върне в AX. BIOS няма да промени регистрите, защото просто няма такава функция!). Ако 9988h се върна, значи сме в паметта! Тези. част от нашата процедура Int_10h_proc размени регистрите (и кой друг може да направи това?). Вижте първите редовепроцедури (част от нашия резидент):

pushf; флагове за запазване

cmp ax,8899h ;проверка за "магическо число"

jne Next_test ;ако не го, тогава работим по-нататък