ასამბლეის ენის ინსტრუქციის სტრუქტურა შეიცავს. ასამბლერის ბრძანებები (ლექცია)

ასამბლერის ბრძანებები (ლექცია)

ლექციის გეგმა

1. ოპერაციების ძირითადი ჯგუფები.

პენტიუმი.

1. ოპერაციების ძირითადი ჯგუფები

მიკროპროცესორები ასრულებენ ინსტრუქციების ერთობლიობას, რომლებიც ახორციელებენ ოპერაციების შემდეგ ძირითად ჯგუფს:

გადამისამართების ოპერაციები,

არითმეტიკული მოქმედებები,

ლოგიკური ოპერაციები,

ცვლის ოპერაციები,

შედარება და ტესტის ოპერაციები,

ბიტის ოპერაციები,

პროგრამის კონტროლის ოპერაციები;

პროცესორის კონტროლის ოპერაციები.

2. პროცესორის ბრძანებების მნემოკოდები პენტიუმი

ბრძანებების აღწერისას ჩვეულებრივ გამოიყენება მათი მნემონური აღნიშვნები (მნემონური კოდები), რომლებიც გამოიყენება ბრძანების დასაყენებლად ასამბლეის ენაზე დაპროგრამებისას. ამისთვის სხვადასხვა ვერსიებიზოგიერთი ბრძანების ასამბლერის მნემონური კოდები შეიძლება განსხვავდებოდეს. მაგალითად, ქვეპროგრამის გამოძახების ბრძანებისთვის გამოიყენება მნემონური კოდიდარეკეთ ან JSR ("Გადახტომა ქვერუტინა”). ამასთან, მიკროპროცესორების ძირითადი ტიპების უმრავლესობის ბრძანებების მნემონიკური კოდები ემთხვევა ან ოდნავ განსხვავდება, რადგან ისინი შესაბამისი ინგლისური სიტყვების აბრევიატურებია, რომლებიც განსაზღვრავენ შესრულებულ ოპერაციას. განვიხილოთ პროცესორებისთვის მიღებული ბრძანებების მნემონური კოდებიპენტიუმი.

გადამისამართების ბრძანებები. ამ ჯგუფის მთავარი გუნდი გუნდიაMOV , რომელიც უზრუნველყოფს მონაცემთა გადაცემას ორ რეგისტრს შორის ან რეგისტრსა და მეხსიერების უჯრედს შორის. ზოგიერთი მიკროპროცესორი ახორციელებს გადაცემას მეხსიერების ორ უჯრედს შორის, ისევე როგორც მეხსიერებიდან რამდენიმე რეგისტრის შინაარსის ნაყარი გადაცემას. მაგალითად, 68 ოჯახის მიკროპროცესორები xxx Motorola-დან შეასრულეთ ბრძანებაგადაადგილება , რომელიც უზრუნველყოფს მეხსიერების ერთი უჯრედიდან მეორეში გადაცემას და ბრძანებასMOVEM , რომელიც წერს მეხსიერებაში ან მეხსიერებიდან იტვირთება რეგისტრების მოცემული ნაკრების შიგთავსს (16-მდე რეგისტრი). ბრძანებაXCHG ახდენს პროცესორის ორი რეგისტრის ან რეგისტრისა და მეხსიერების უჯრედის შიგთავსის ურთიერთგაცვლას.

შეყვანის ბრძანებები IN და გაყვანა გარეთ გადაიტანოს მონაცემები პროცესორის რეესტრიდან გარე მოწყობილობაზე ან მიიღოს მონაცემები გარე მოწყობილობიდან რეესტრში. ეს ბრძანებები განსაზღვრავს ინტერფეისის მოწყობილობის რაოდენობას (I/O პორტი), რომლის მეშვეობითაც ხდება მონაცემების გადაცემა. გაითვალისწინეთ, რომ ბევრ მიკროპროცესორს არ აქვს სპეციალური ინსტრუქციები წვდომისთვის გარე მოწყობილობები... ამ შემთხვევაში, სისტემაში მონაცემების შეყვანა და გამომავალი ხდება ბრძანების გამოყენებითMOV , რომელშიც მითითებულია საჭირო ინტერფეისის მოწყობილობის მისამართი. ამრიგად, გარე მოწყობილობას მიმართავენ როგორც მეხსიერების უჯრედს, ხოლო მისამართების სივრცეში გამოიყოფა გარკვეული განყოფილება, რომელშიც განთავსებულია სისტემასთან დაკავშირებული ინტერფეისის მოწყობილობების (პორტების) მისამართები.

არითმეტიკული ბრძანებები. ამ ჯგუფში ძირითადი ბრძანებებია შეკრების, გამოკლების, გამრავლებისა და გაყოფის ბრძანებები, რომლებსაც აქვთ რამდენიმე ვარიანტი. დამატების ბრძანებები დამატება და გამოკლება SUB შეასრულეთ შესაბამისი ოპერაციებიშეპყრობილი ორი რეგისტრით, რეგისტრით და მეხსიერების მდებარეობით, ან უშუალო ოპერანდის გამოყენებით. ბრძანებები ახ.წ C , სბ შეკრება და გამოკლება ხდება ატრიბუტის მნიშვნელობის გათვალისწინებითC, რომელიც დგინდება, როდესაც ტრანსფერი ყალიბდება წინა ოპერაციის შესრულებისას. ამ ბრძანებების დახმარებით რეალიზდება ოპერანდების თანმიმდევრული დამატება, რომელთა ბიტების რაოდენობა აღემატება პროცესორის ბიტების მოცულობას. ბრძანება ნეგ ცვლის ოპერანდის ნიშანს, თარგმნის მას კომპლემენტის კოდში.

გამრავლებისა და გაყოფის ოპერაციები შეიძლება შესრულდეს ხელმოწერილი რიცხვებით (ბრძანებებიმე MUL, მე DIV ) ან ხელმოუწერელი (ბრძანებები MUL, DIV ერთი ოპერანდი ყოველთვის გამოყოფილია რეესტრში, მეორე შეიძლება იყოს რეესტრში, მეხსიერების მდებარეობაში ან პირდაპირ ოპერანდში. ოპერაციის შედეგი განთავსებულია რეესტრში. გამრავლებისას (ბრძანებებიMUL , IMUL ), შედეგი არის ორნიშნა შედეგი, რისთვისაც გამოიყენება ორი რეგისტრი. გაყოფისას (ბრძანებებიDIV , IDIV ) დივიდენდად გამოიყენება ორნიშნა ოპერანდი, რომელიც მდებარეობს ორ რეგისტრში და შედეგად, კოეფიციენტი და ნაშთი იწერება ორ რეგისტრში.

ლოგიკური ბრძანებები ... თითქმის ყველა მიკროპროცესორი ასრულებს ლოგიკურ ოპერაციებს AND, OR, Exclusive OR, რომლებიც შესრულებულია ოპერანდების იმავე ბიტებზე ბრძანებების გამოყენებით. და, ან, X ან ... ოპერაციები შესრულებულია ორი რეგისტრის შიგთავსზე, რეგისტრისა და მეხსიერების მდებარეობაზე, ან უშუალო ოპერანდის გამოყენებით. ბრძანება არა აბრუნებს ოპერანდის თითოეული ბიტის მნიშვნელობას.

Shift ბრძანებები... მიკროპროცესორები ახორციელებენ მიმართული ოპერანდების არითმეტიკულ, ლოგიკურ და ციკლურ ცვლას ერთი ან მეტი ბიტით. გადატანილი ოპერანდი შეიძლება იყოს რეესტრში ან მეხსიერების ადგილას, ხოლო ცვლის ბიტების რაოდენობა მითითებულია ინსტრუქციაში მოცემული უშუალო ოპერანდის გამოყენებით, ან განისაზღვრება მითითებული რეგისტრის შიგთავსით. ტარების ნიშანი ჩვეულებრივ ჩართულია ცვლის განხორციელებაში.Cსტატუსის რეესტრში (სრან EFLAGS), რომელშიც განთავსებულია ოპერანდის ბოლო ბიტი, რომელიც ამოღებულია რეგისტრიდან ან მეხსიერების უჯრედიდან.

შეადარეთ და გამოსცადეთ გუნდები ... ოპერანდების შედარება ჩვეულებრივ ხდება ბრძანების გამოყენებითCMP , რომელიც აკლებს ოპერანდებს დამახასიათებელი მნიშვნელობების დაყენებით N, Z, V, Cსტატუსის რეესტრში შედეგის მიხედვით. ამ შემთხვევაში, გამოკლების შედეგი არ ინახება და ოპერანდების მნიშვნელობები არ იცვლება. მიღებული მახასიათებლების მნიშვნელობების შემდგომი ანალიზი შესაძლებელს ხდის ფარდობითი მნიშვნელობის დადგენას (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

ზოგიერთი მიკროპროცესორი ასრულებს სატესტო ბრძანებას TST , რომელიც არის compare ბრძანების ერთოპერანდიანი ვარიანტი. როდესაც ეს ბრძანება შესრულებულია, ნიშნები დაყენებულია ნ, ზმიმართული ოპერანდის ნიშნისა და მნიშვნელობის (ტოლი ან არა ტოლი ნულის) მიხედვით.

ბიტის ოპერაციების ბრძანებები ... ეს ბრძანებები ადგენს მახასიათებლის მნიშვნელობასCსტატუსის რეესტრში შემოწმებული ბიტის მნიშვნელობის მიხედვითბნ მისამართებულ ოპერანდში. ზოგიერთ მიკროპროცესორში, ბიტის ტესტირების შედეგის მიხედვით, ნიშანი დაყენებულია... ტესტი ბიტის ნომერიდაყენებულია ან ბრძანებაში მითითებული რეესტრის შიგთავსით, ან უშუალო ოპერანდით.

ამ ჯგუფის ბრძანებები ახორციელებს სხვადასხვა ვარიანტს ტესტირებული ბიტის შეცვლისთვის. BT ინარჩუნებს ამ ბიტის მნიშვნელობას უცვლელად. ტესტის შემდეგ ადგენს მნიშვნელობას ბნ= 1 და ბრძანება C - მნიშვნელობა ბნ= 0 ბრძანება C აბრუნებს bn ბიტის მნიშვნელობას ტესტირების შემდეგ.

პროგრამის კონტროლის ოპერაციები. პროგრამის სამართავად გამოიყენება ბრძანებების დიდი რაოდენობა, რომელთა შორისაა:

- უპირობო კონტროლის გადაცემის ბრძანებები;

- პირობითი ნახტომის ბრძანებები;

- პროგრამული ციკლების ორგანიზების გუნდები;

- შეწყვეტის ბრძანებები;

- ბრძანებები მახასიათებლების შეცვლისთვის.

კონტროლის უპირობო გადაცემა ხორციელდება ბრძანებითJMP რომელიც იტვირთება პროგრამის მრიცხველშიკომპიუტერიახალი შინაარსი, რომელიც არის შემდეგი შესასრულებელი ბრძანების მისამართი. ეს მისამართი ან პირდაპირ არის მითითებული ბრძანებაშიJMP (პირდაპირი მისამართი), ან გამოითვლება როგორც მიმდინარე შინაარსის ჯამიკომპიუტერიდა ბრძანება offset, რომელიც არის ხელმოწერილი ნომერი (ნათესავი მისამართი). იმიტომ რომკომპიუტერიშეიცავს შემდეგი პროგრამის ბრძანების მისამართს, შემდეგ ბოლო მეთოდი ადგენს გადახტომის მისამართს, რომელიც ანაცვლებს შემდეგი მისამართიდან ბაიტების განსაზღვრული რაოდენობით. დადებითი ოფსეტურით ხდება პროგრამის შემდგომ ბრძანებებზე გადასვლა, უარყოფითი ოფსეტურით - წინაზე.

ქვეპროგრამის გამოძახება ასევე ხორციელდება ბრძანების გამოყენებით კონტროლის უპირობო გადაცემითდარეკეთ (ან JSR ). თუმცა, ამ შემთხვევაში, ჩატვირთვამდეკომპიუტერი ახალი კონტენტი, რომელიც ადგენს ქვეპროგრამის პირველი ბრძანების მისამართს, აუცილებელია შეინახოს მისი მიმდინარე მნიშვნელობა (შემდეგი ბრძანების მისამართი), რათა უზრუნველყოფილი იყოს დაბრუნება მთავარ პროგრამაში (ან წინა ქვეპროგრამაში ქვეპროგრამების ჩადგმისას) ქვეპროგრამის შესრულების შემდეგ. პირობითი განშტოების ბრძანებები (პროგრამის ფილიალები) ჩატვირთულიაკომპიუტერიახალი შინაარსი, თუ დაკმაყოფილებულია გარკვეული პირობები, რომლებიც, როგორც წესი, დგინდება სტატუსის რეესტრში არსებული სხვადასხვა ნიშნების მიმდინარე მნიშვნელობის შესაბამისად. თუ პირობა არ არის დაკმაყოფილებული, მაშინ შესრულებულია პროგრამის შემდეგი ბრძანება.

დამახასიათებელი მენეჯმენტის ბრძანებები უზრუნველყოფს ჩაწერას - სტატუსის რეესტრის შინაარსის კითხვას, რომელშიც ინახება მახასიათებლები, ასევე ინდივიდუალური მახასიათებლების მნიშვნელობების შეცვლა. მაგალითად, Pentium პროცესორებში ბრძანებები განხორციელებულია LAHF და SAHF რომელიც იტვირთება დაბალი ბაიტი, რომელიც შეიცავს ნიშნებს სტატუსის რეესტრიდან EFLAGრეესტრის დაბალ ბაიტამდე EAXდა დაბალ ბაიტის შევსება EFLAGSრეესტრიდან ე აX.. გუნდები CLC, STCშეასრულეთ გადაცემის ატრიბუტის CF = 0, CF = 1 და ბრძანების მნიშვნელობების დაყენება CMCიწვევს ამ ატრიბუტის მნიშვნელობის ინვერსიას.ვინაიდან ფუნქციები განსაზღვრავს პროგრამის შესრულების კურსს პირობითი ნახტომების დროს, ფუნქციების შეცვლის ბრძანებები ჩვეულებრივ გამოიყენება პროგრამის გასაკონტროლებლად.

CPU ბრძანებები ... ამ ჯგუფში შედის გაჩერების ბრძანებები, ოპერაციების გარეშე და რიგი ბრძანებები, რომლებიც განსაზღვრავს პროცესორის ან მისი ცალკეული ბლოკების მუშაობის რეჟიმს. ბრძანებაHLT წყვეტს პროგრამის შესრულებას და აყენებს პროცესორს გაჩერებულ მდგომარეობაში, საიდანაც გასვლა ხდება შეფერხების ან გადატვირთვის სიგნალების მიღებისას (გადატვირთვა). ბრძანება NOP ("ცარიელი" ბრძანება), რომელიც არ იწვევს რაიმე ოპერაციების შესრულებას, გამოიყენება პროგრამის შეფერხებების განსახორციელებლად ან პროგრამაში წარმოქმნილი ხარვეზების შესავსებად.

სპეციალური ბრძანებები CLI, STI გამორთეთ და ჩართეთ შეფერხების მოთხოვნის სერვისი. პროცესორებშიპენტიუმი ამისათვის გამოიყენება საკონტროლო ბიტი (დროშა).თურეესტრში EFLAGS.

ბევრი თანამედროვე მიკროპროცესორი ახორციელებს საიდენტიფიკაციო ბრძანებას, რომელიც საშუალებას აძლევს მომხმარებელს ან სხვა მოწყობილობას მიიღოს ინფორმაცია მოცემულ სისტემაში გამოყენებული პროცესორის ტიპის შესახებ. პროცესორებში პენტუიმიამისთვის გამოიყენება ბრძანება CPUID , შესრულებისას, საჭირო მონაცემები პროცესორის შესახებ გადადის რეესტრებში EAX,EBX,ECX,EDXდა შემდეგ შეიძლება წაიკითხოს მომხმარებელი ან ოპერაციული სისტემა.

პროცესორის მიერ განხორციელებული ოპერაციული რეჟიმებიდან და დამუშავებული მონაცემების მითითებული ტიპებიდან გამომდინარე, შესრულებადი ბრძანებების ნაკრები შეიძლება მნიშვნელოვნად გაფართოვდეს.

ზოგიერთი პროცესორი ასრულებს არითმეტიკულ მოქმედებებს ბინარულ-ათწილადი რიცხვებით ან ასრულებს სპეციალურ ბრძანებებს შედეგის გამოსასწორებლად ასეთი რიცხვების დამუშავებისას. ბევრი მაღალი ხარისხის პროცესორი მოიცავს FPU - ნომრის დამუშავების განყოფილებამცურავი წერტილი.

რიგი თანამედროვე პროცესორები ახორციელებენ რამდენიმე მთელი რიცხვის ან რიცხვის ჯგუფურ დამუშავებასგ მცურავი წერტილი ერთი ინსტრუქციით პრინციპის მიხედვით SIMD („ერთი ინსტრუქცია - მრავალი მონაცემი ”) -” ერთი ბრძანება - ბევრი მონაცემი”. რამდენიმე ოპერანდზე ოპერაციების ერთდროული შესრულება მნიშვნელოვნად აუმჯობესებს პროცესორის მუშაობას ვიდეო და აუდიო მონაცემებთან მუშაობისას. ასეთი ოპერაციები ფართოდ გამოიყენება გამოსახულების დამუშავებისთვის, აუდიო სიგნალებისთვის და სხვა აპლიკაციებისთვის. ამ ოპერაციების შესასრულებლად, პროცესორებში შეყვანილია სპეციალური ბლოკები, რომლებიც ახორციელებენ ბრძანებების შესაბამის კომპლექტს, რომლებიც სხვადასხვა ტიპის პროცესორებში (პენტიუმი, ათლონი) მიიღო სახელიMMX (“ მილტი- მედია გაფართოება ”) - მულტიმედიური გაფართოება,SSE("Streaming SIMD Extension") - Streaming SIMD - გაფართოება, “3 გაფართოება- 3D გაფართოება.

კომპანიის პროცესორების დამახასიათებელი თვისებაინტელი 80286 მოდელიდან დაწყებული, მეხსიერებაზე წვდომისას არის პრიორიტეტული კონტროლი, რომელიც გათვალისწინებულია, როდესაც პროცესორი მუშაობს დაცულ ვირტუალურ მისამართის რეჟიმში - ”დაცული რეჟიმი ”(დაცული რეჟიმი). ამ რეჟიმის განსახორციელებლად გამოიყენება ბრძანებების სპეციალური ჯგუფები, რომლებიც ემსახურება მეხსიერების დაცვის ორგანიზებას მიღებული პრიორიტეტული წვდომის ალგორითმის შესაბამისად.

ბრძანებები შეიძლება გამოიყოს მათი მიზნის მიხედვით (ფრჩხილებში მოცემულია ოპერაციების მნემონიკური კოდების მაგალითები კომპიუტერის ასამბლერის ბრძანებებისთვის, როგორიცაა IBM PC):

l არითმეტიკული მოქმედებების შესრულება (ADD და ADC - შეკრება და დამატება გადაცემით, SUB და SBB - გამოკლება და გამოკლება სესხით, MUL და IMUL - ხელმოუწერელი და ხელმოწერილი გამრავლება, DIV და IDIV - ხელმოუწერელი და ხელმოწერილი გაყოფა, CMP - შედარება და ა.შ.) ;

l ლოგიკური ოპერაციების შესრულება (OR, AND, NOT, XOR, TEST და ა.შ.);

l მონაცემთა გადაცემა (MOV - გაგზავნა, XCHG - გაცვლა, IN - მიკროპროცესორში შესვლა, OUT - გამომავალი მიკროპროცესორიდან და ა.შ.);

l კონტროლის გადაცემა (პროგრამის განშტოებები: JMP - უპირობო განშტოება, CALL - პროცედურის გამოძახება, RET - დაბრუნება პროცედურისგან, J * - პირობითი განშტოება, LOOP - მარყუჟის კონტროლი და ა.შ.);

l სიმბოლოების სტრიქონების დამუშავება (MOVS - გადარიცხვები, CMPS - შედარება, LODS - ჩამოტვირთვები, SCAS - სკანირება. ეს ბრძანებები ჩვეულებრივ გამოიყენება პრეფიქსით (განმეორების მოდიფიკატორი) - REP;

l პროგრამის შეფერხებები (INT - პროგრამული შეფერხებები, INTO - პირობითი შეფერხება გადადინების შემთხვევაში, IRET - დაბრუნება შეფერხებიდან);

l მიკროპროცესორული კონტროლი (ST * და CL * - დროშების დაყენება და გასუფთავება, HLT - გაჩერება, WAIT - ლოდინი, NOP - უმოქმედო და ა.შ.).

ასამბლერის ბრძანებების სრული სია შეგიძლიათ იხილოთ ნამუშევრებში.

მონაცემთა გადაცემის ბრძანებები

l MOV dst, src - მონაცემთა გადაცემა (გადატანა - გადატანა src-დან dst-ზე).

გადარიცხვები: ერთი ბაიტი (თუ src და dst არის ბაიტის ფორმატში) ან ერთი სიტყვა (თუ src და dst არის Word ფორმატში) რეგისტრებს შორის ან რეგისტრსა და მეხსიერებას შორის, და ასევე წერს უშუალო მნიშვნელობას რეესტრში ან მეხსიერებაში.

dst და src ოპერანდები უნდა იყოს იგივე ბაიტის ან სიტყვის ფორმატში.

Src შეიძლება იყოს ტიპის: r (რეგისტერი) - რეგისტრი, m (მეხსიერება) - მეხსიერება, i (წინააღდეგობა) - უშუალო მნიშვნელობა. Dst შეიძლება იყოს r, m ტიპის. თქვენ არ შეგიძლიათ გამოიყენოთ შემდეგი ოპერანდები იმავე ბრძანებაში: rsegm i-სთან ერთად; m ტიპის ორი ოპერანდი და rsegm ტიპის ორი ოპერანდი). i ოპერანდი ასევე შეიძლება იყოს მარტივი გამოხატულება:

mov AX, (152 + 101B) / 15

გამოთქმა ფასდება მხოლოდ თარგმანის დროს. დროშებს არ ცვლის.

l PUSH src - სიტყვის დასტაზე გადატანა (ბიძგ - გაძევება; გადაიტანეთ დასტაზე src-დან). უბიძგებს src-ის შიგთავსს სტეკის ზედა ნაწილში - ნებისმიერი 16-ბიტიანი რეგისტრი (სეგმენტის ჩათვლით) ან მეხსიერების ორი ადგილი, რომელიც შეიცავს 16-ბიტიან სიტყვას. დროშები არ იცვლება;

l POP dst - ამოიღეთ სიტყვა სტეკიდან (pop - pop; წაკითხვა დასტადან dst-ში). ამოიღებს სიტყვას სტეკის ზემოდან და დებს მას dst - ნებისმიერ 16-ბიტიან რეგისტრში (სეგმენტის ჩათვლით) ან მეხსიერების ორ ადგილას. დროშები არ იცვლება.

იმისათვის, რომ მანქანამ შეასრულოს ადამიანის ბრძანებები აპარატურის დონეზე, აუცილებელია მოქმედებების გარკვეული თანმიმდევრობის დაყენება "ნულებისა და ერთების" ენაზე. ამ საკითხში ასამბლეერი გახდება ასისტენტი. ეს არის პროგრამა, რომელიც მუშაობს ბრძანებების მანქანურ ენაზე თარგმნით. თუმცა, პროგრამის დაწერა ძალიან შრომატევადი და რთული პროცესია. ეს ენა არ არის გამიზნული მარტივი და მარტივი მოქმედებების შესაქმნელად. ამ დროისთვის, ნებისმიერი გამოყენებული პროგრამირების ენა (ასემბლერი მშვენივრად მუშაობს) საშუალებას გაძლევთ დაწეროთ სპეციალური ეფექტური ამოცანები, რომლებიც დიდ გავლენას ახდენენ აპარატურის მუშაობაზე. მთავარი მიზანია მიკროინსტრუქციების და მცირე კოდების შექმნა. ეს ენა უფრო მეტ შესაძლებლობას იძლევა, ვიდრე, მაგალითად, პასკალი ან C.

ასამბლერის ენების მოკლე აღწერა

ყველა პროგრამირების ენა იყოფა დონეებად: დაბალი და მაღალი. Assembler-ის "ოჯახის" ნებისმიერი სინტაქსური სისტემა განსხვავდება იმით, რომ იგი ერთდროულად აერთიანებს ყველაზე გავრცელებული და თანამედროვე ენების ზოგიერთ უპირატესობას. მათ აქვთ საერთო სხვებთან, რომ კომპიუტერული სისტემის სრულად გამოყენება შესაძლებელია.

შემდგენელის გამორჩეული თვისებაა მისი მარტივი გამოყენება. ამით ის განსხვავდება მათგან, რომლებიც მუშაობენ მხოლოდ მაღალ დონეზე. თუ რომელიმე ასეთ პროგრამირების ენას გაითვალისწინებთ, Assembler ორჯერ უფრო სწრაფი და უკეთესია. მასში მსუბუქი პროგრამის დაწერას დიდი დრო არ სჭირდება.

მოკლედ ენის სტრუქტურის შესახებ

თუ ზოგადად ვსაუბრობთ ენის მუშაობასა და ფუნქციონირების სტრუქტურაზე, დანამდვილებით შეგვიძლია ვთქვათ, რომ მისი ბრძანებები სრულად შეესაბამება პროცესორის ბრძანებებს. ანუ ასამბლერი იყენებს მნემონიკურ კოდებს, რომლებიც ყველაზე მოსახერხებელია ადამიანებისთვის დასაწერად.

სხვა პროგრამირების ენებისგან განსხვავებით, ასემბლერი იყენებს სპეციფიკურ ლეიბლებს მისამართების ნაცვლად მეხსიერების მდებარეობების დასაწერად. ისინი ითარგმნება ეგრეთ წოდებულ დირექტივებში კოდის შესრულების პროცესთან ერთად. ეს არის შედარებითი მისამართები, რომლებიც გავლენას არ ახდენენ პროცესორის მუშაობაზე (ისინი არ ითარგმნება მანქანურ ენაზე), მაგრამ აუცილებელია თავად პროგრამირების გარემოს მიერ ამოცნობისთვის.

პროცესორის თითოეულ ხაზს აქვს თავისი. ამ სიტუაციაში, ნებისმიერი პროცესი, მათ შორის თარგმნილი, სწორი იქნება

ასამბლეის ენას აქვს რამდენიმე სინტაქსი, რომელიც ამ სტატიაში იქნება განხილული.

ენის პლიუსები

ასამბლეის ენის ყველაზე მნიშვნელოვანი და მოსახერხებელი თვისება იქნება ის, რომ თქვენ შეგიძლიათ დაწეროთ ნებისმიერი პროგრამა პროცესორისთვის, რომელიც იქნება ძალიან კომპაქტური. თუ კოდი აღმოჩნდება უზარმაზარი, მაშინ ზოგიერთი პროცესი გადამისამართებულია RAM-ზე. ამავდროულად, ისინი ყველაფერს აკეთებენ სწრაფად და შეფერხების გარეშე, თუ, რა თქმა უნდა, მათ აკონტროლებს კვალიფიციური პროგრამისტი.

დრაივერები, ოპერაციული სისტემები, BIOS, კომპილატორები, თარჯიმნები და ა.შ. ყველა ასამბლეის ენის პროგრამაა.

დემონტაჟის გამოყენებისას, რომელიც ითარგმნება მანქანიდან მანქანაზე, თქვენ შეგიძლიათ მარტივად გაიგოთ, როგორ მუშაობს ესა თუ ის სისტემური დავალება, თუნდაც ამის ახსნა არ იყოს. თუმცა, ეს შესაძლებელია მხოლოდ იმ შემთხვევაში, თუ პროგრამები მსუბუქია. სამწუხაროდ, საკმაოდ რთულია არატრივიალური კოდების გაგება.

ენის უარყოფითი მხარეები

სამწუხაროდ, დამწყები პროგრამისტებისთვის (და ხშირად პროფესიონალებისთვის) რთულია ენის გარჩევა. ასამბლეერი მოითხოვს საჭირო ბრძანების დეტალურ აღწერას. მანქანის ინსტრუქციების გამოყენების აუცილებლობა ზრდის არასწორი ქმედებების ალბათობას და შესრულების სირთულეს.

იმისთვის, რომ თუნდაც უმარტივესი პროგრამა დაიწეროს, პროგრამისტი უნდა იყოს კვალიფიციური და მისი ცოდნის დონე საკმარისად მაღალია. საშუალო სპეციალისტი, სამწუხაროდ, ხშირად წერს ცუდ კოდებს.

თუ პლატფორმა, რომლისთვისაც პროგრამა შეიქმნა, განახლებულია, მაშინ ყველა ბრძანება უნდა გადაიწეროს ხელით - ამას თავად ენა მოითხოვს. ასამბლერს არ უჭერს მხარს პროცესების სიჯანსაღის ავტომატური რეგულირების და ნებისმიერი ელემენტის ჩანაცვლების ფუნქციას.

ენის ბრძანებები

როგორც ზემოთ აღინიშნა, თითოეულ პროცესორს აქვს ინსტრუქციების საკუთარი ნაკრები. უმარტივესი ელემენტები, რომლებიც აღიარებულია ნებისმიერი ტიპის მიხედვით, არის შემდეგი კოდები:


დირექტივების გამოყენება

მიკროკონტროლერების დაპროგრამება ენაზე (ასემბლერი ამის საშუალებას იძლევა და სრულყოფილად უმკლავდება ფუნქციონირებას) ყველაზე დაბალი დონის უმეტეს შემთხვევაში კარგად მთავრდება. უმჯობესია გამოიყენოთ რესურსებით შეზღუდული პროცესორები. 32-ბიტიანი ტექნოლოგიისთვის ეს ენა შესანიშნავია. ხშირად შეგიძლიათ იხილოთ დირექტივები კოდებში. Ეს რა არის? და რისთვის გამოიყენება?

პირველ რიგში, თქვენ უნდა ხაზგასმით აღვნიშნოთ, რომ დირექტივები არ ითარგმნება მანქანურ ენაზე. ისინი მართავენ როგორ მუშაობს შემდგენელი. ბრძანებებისგან განსხვავებით, ეს პარამეტრები, რომლებსაც აქვთ განსხვავებული ფუნქციები, განსხვავდება არა სხვადასხვა პროცესორის, არამედ განსხვავებული მთარგმნელის გამო. მთავარ დირექტივებს შორისაა შემდეგი:


სახელის წარმოშობა

რატომ მიიღო ენამ სახელი – „ასემბლერი“? საუბარია მთარგმნელზე და შემდგენელზე, რომელიც შიფრავს მონაცემებს. ინგლისურად Assembler არაფერს ნიშნავს, თუ არა ასამბლერს. პროგრამა არ იყო აწყობილი ხელით, გამოყენებული იყო ავტომატური სტრუქტურა. უფრო მეტიც, ამ დროისთვის მომხმარებლებსა და სპეციალისტებს შორის ტერმინებს შორის განსხვავება უკვე გაქრა. ასამბლეის ენას ხშირად პროგრამირების ენებად მოიხსენიებენ, თუმცა ეს მხოლოდ უტილიტაა.

ზოგადად მიღებული კოლექტიური სახელწოდების გამო, ზოგიერთი ადამიანი იღებს მცდარ გადაწყვეტილებას, რომ არსებობს ერთი დაბალი დონის ენა (ან მისთვის სტანდარტული ნორმები). იმისათვის, რომ პროგრამისტმა გაიგოს, რა სტრუქტურაზეა საუბარი, აუცილებელია განვმარტოთ, რომელი პლატფორმისთვის გამოიყენება კონკრეტული ასამბლეის ენა.

მაკრო ინსტრუმენტები

ასამბლეის ენებს, რომლებიც შედარებით ახალია, აქვთ მაკროები. ისინი ამარტივებს პროგრამის დაწერას და გაშვებას. მათი არსებობის გამო მთარგმნელი დაწერილ კოდს ბევრჯერ უფრო სწრაფად ასრულებს. პირობითი შერჩევის შექმნისას შეგიძლიათ დაწეროთ ბრძანებების უზარმაზარი ბლოკი, მაგრამ უფრო ადვილია მაკრო ინსტრუმენტების გამოყენება. ისინი საშუალებას მოგცემთ სწრაფად გადახვიდეთ მოქმედებებს შორის პირობის შესრულების ან შეუსრულებლობის შემთხვევაში.

მაკრო ენის დირექტივების გამოყენებისას პროგრამისტი იღებს ასამბლერის მაკროებს. ზოგჯერ ის შეიძლება ფართოდ იქნას გამოყენებული, ზოგჯერ კი მისი ფუნქციონირება მცირდება ერთ ბრძანებამდე. კოდში მათი ყოფნა აადვილებს მასთან მუშაობას, ხდის მას უფრო ნათელს და ინტუიციურს. თუმცა, მაინც ფრთხილად უნდა იყოთ - ზოგ შემთხვევაში მაკროები, პირიქით, აუარესებს სიტუაციას.

კურსის მუშაობა

დისციპლინაში "სისტემური პროგრამირება"

თემა ნომერი 4: "პროცედურების პრობლემების გადაჭრა"

ვარიანტი 2

აღმოსავლეთ ციმბირის სახელმწიფო უნივერსიტეტი

ტექნოლოგია და კონტროლი

____________________________________________________________________

ტექნოლოგიური კოლეჯი

ვარჯიში

საკურსო ნაშრომისთვის

დისციპლინა:
თემა: პროცედურების ამოცანების ამოხსნა
შემსრულებელი: გლავინსკაია არინა ალექსანდროვნა
ხელმძღვანელი: დამბაევა სესეგმა ვიქტოროვნა
ნაშრომის შეჯამება: რუტინების შესწავლა ასამბლეის ენაზე,
პრობლემის გადაჭრა ქვეპროგრამების გამოყენებით
1. თეორიული ნაწილი: ძირითადი ინფორმაცია ასამბლეის ენის შესახებ (კომპლექტი
ბრძანებები და ა.შ.), ქვეპროგრამების ორგანიზება, პარამეტრებში გადაცემის მეთოდები
ქვეპროგრამებში
2. პრაქტიკული ნაწილი: შექმენით ორი ქვეპროგრამა, რომელთაგან ერთი აქცევს ნებისმიერ მოცემულ ასოს დიდ რეგისტრში (მათ შორის რუსული ასოებისთვის), ხოლო მეორე აქცევს ასოს პატარას.
აკონვერტებს ნებისმიერ მოცემულ ასოს დიდად, ხოლო მეორე აქცევს ასოს პატარას.
აქცევს ასოს პატარას.
პროექტის ვადები გრაფიკით:
1. თეორიული ნაწილი - 30% 7 კვირისთვის.
2. პრაქტიკული ნაწილი - 70% 11 კვირისთვის.
3. დაცვა - 100% 14 კვირისთვის.
მოთხოვნები რეგისტრაციისთვის:
1. კურსის პროექტის ანგარიშსწორება და განმარტებითი ჩანაწერი წარმოდგენილი უნდა იყოს ქ
ელექტრონული და ნაბეჭდი ასლები.
2. მოხსენების მოცულობა უნდა იყოს არანაკლებ 20 საბეჭდი გვერდი, დანართების გამოკლებით.
3. RPZ შედგენილია GOST 7.32-91 შესაბამისად და ხელს აწერს ხელმძღვანელი.

სამუშაო მენეჯერი _________________

კონტრაქტორი _________________

Გაცემის თარიღი " 26 " სექტემბერი 2017 გ.


შესავალი. 2

1.1 ძირითადი ინფორმაცია ასამბლეის ენის შესახებ. 3

1.1.1 ბრძანების ნაკრები. 4

1.2 ქვეპროგრამების ორგანიზება ასამბლეის ენაზე. 4

1.3 ქვეპროგრამებში პარამეტრების გადაცემის მეთოდები. 6

1.3.1 პარამეტრების გავლა რეგისტრებში .. 6

1.3.2 პარამეტრების გავლა დასტაში. 7

2 პრაქტიკული ნაწილი .. 9

2.1 პრობლემის განცხადება. ცხრა

2.2 პრობლემის გადაჭრის აღწერა. ცხრა

2.3 პროგრამის ტესტირება .. 7

დასკვნა. რვა

ცნობები .. 9


შესავალი

საყოველთაოდ ცნობილია, რომ ასემბლერში პროგრამირება რთულია. მოგეხსენებათ, ახლა ბევრი სხვადასხვა ენაა. მაღალი დონერაც საშუალებას გაძლევთ დახარჯოთ გაცილებით ნაკლები ძალისხმევა პროგრამების წერისას. ბუნებრივია, ჩნდება კითხვა, როდესაც პროგრამისტს შეიძლება დასჭირდეს ასემბლერის გამოყენება პროგრამების წერისას. ამჟამად, არსებობს ორი სფერო, სადაც ასამბლეის ენის გამოყენება გამართლებულია და ხშირად აუცილებელია.

პირველ რიგში, ეს არის ეგრეთ წოდებული მანქანაზე დამოკიდებული სისტემური პროგრამები, ჩვეულებრივ, ისინი აკონტროლებენ სხვადასხვა მოწყობილობებს კომპიუტერზე (ასეთ პროგრამებს უწოდებენ დრაივერებს). ამ სისტემურ პროგრამებში გამოიყენება სპეციალური მანქანის ინსტრუქციები, რომლებიც არ საჭიროებს ჩვეულებრივ გამოყენებას (ან, როგორც ამბობენ გამოყენებითი) პროგრამები. ამ ბრძანებების განსაზღვრა შეუძლებელია ან ძალიან რთულია მაღალი დონის ენაზე.

ასემბლერის გამოყენების მეორე სფერო დაკავშირებულია პროგრამის შესრულების ოპტიმიზაციასთან. ძალიან ხშირად, მაღალი დონის ენებიდან მთარგმნელობითი პროგრამები (შემდგენელები) აწარმოებენ ძალიან არაეფექტურ მანქანათმცოდნეობის პროგრამას. ეს ჩვეულებრივ ეხება გამოთვლითი ხასიათის პროგრამებს, რომლებშიც პროგრამის ძალიან მცირე (დაახლოებით 3-5%) განყოფილება (მთავარი ციკლი) უმეტესად სრულდება. ამ პრობლემის გადასაჭრელად შეიძლება გამოვიყენოთ ეგრეთ წოდებული მრავალენოვანი პროგრამირების სისტემები, რომლებიც საშუალებას გაძლევთ დაწეროთ პროგრამის ნაწილები სხვადასხვა ენაზე. ჩვეულებრივ, პროგრამის ძირითადი ნაწილი იწერება მაღალი დონის პროგრამირების ენაზე (Fortran, Pascal, C და ა.შ.), ხოლო პროგრამის დროის კრიტიკული სექციები იწერება ასემბლერში. ამ შემთხვევაში, მთელი პროგრამის სიჩქარე შეიძლება მნიშვნელოვნად გაიზარდოს. ეს ხშირად ერთადერთი გზაა იმისათვის, რომ პროგრამამ შედეგი გამოიღოს გონივრულ დროში.

ამ კურსის მუშაობის მიზანია ასამბლეის ენაზე პროგრამირების პრაქტიკული უნარების მოპოვება.

სამუშაო ამოცანები:

1. ასამბლერის ენის შესახებ ძირითადი ინფორმაციის შესწავლა (ასემბლერის პროგრამის სტრუქტურა და კომპონენტები, ბრძანებების ფორმატი, ქვეპროგრამების ორგანიზება და ა.შ.);

2. ბიტის მოქმედებების ტიპების შესწავლა, ასამბლერის ლოგიკური ინსტრუქციების ფორმატი და ლოგიკა;

3. ასემბლერში ქვეპროგრამების გამოყენების შესახებ ინდივიდუალური ამოცანის ამოხსნა;

4 .. ჩამოაყალიბეთ დასკვნა შესრულებული სამუშაოს შესახებ.

1 თეორიული სექცია

ასამბლეის ენის გაგება

Assembler არის დაბალი დონის პროგრამირების ენა, რომელიც არის ადამიანის მიერ წაკითხული ფორმატი მანქანის ინსტრუქციების დასაწერად.

ასამბლეის ენის ინსტრუქციები ერთი-ერთზე შეესაბამება პროცესორის ინსტრუქციებს და, ფაქტობრივად, წარმოადგენს ბრძანებებისა და მათი არგუმენტების მოსახერხებელ სიმბოლურ აღნიშვნას (მნემონიკურ კოდს). ასევე, ასამბლეის ენა უზრუნველყოფს პროგრამული უზრუნველყოფის ძირითად აბსტრაქციებს: პროგრამის ნაწილებისა და მონაცემების დაკავშირებას ეტიკეტების საშუალებით სიმბოლური სახელებითა და დირექტივებით.

ასამბლერის დირექტივები საშუალებას გაძლევთ პროგრამაში შეიტანოთ მონაცემთა ბლოკები (აღწერილი აშკარად ან წაკითხული ფაილიდან); გაიმეორეთ გარკვეული ფრაგმენტი რამდენჯერმე; ფრაგმენტის პირობითად შედგენა; დააყენეთ ფრაგმენტის შესრულების მისამართი, შეცვალეთ ეტიკეტების მნიშვნელობები შედგენის პროცესში; გამოიყენეთ მაკროები პარამეტრებით და ა.შ.

Დადებითი და უარყოფითი მხარეები

· ზედმეტი კოდის მინიმალური რაოდენობა (ნაკლები ინსტრუქციების და მეხსიერების წვდომის გამოყენებით). შედეგად - უფრო მაღალი სიჩქარე და პროგრამის მცირე ზომა;

· კოდის დიდი რაოდენობა, დამატებითი მცირე ამოცანების დიდი რაოდენობა;

· კოდის ცუდი წაკითხვა, შენარჩუნების სირთულე (გამართვა, ფუნქციების დამატება);

· პროგრამირების პარადიგმების და სხვა ნებისმიერი უფრო რთული კონვენციის განხორციელების სირთულე, ერთობლივი განვითარების სირთულე;

· ნაკლები ხელმისაწვდომი ბიბლიოთეკა, მათი დაბალი თავსებადობა;

· პირდაპირი წვდომა აპარატურაზე: შეყვან-გამომავალი პორტები, პროცესორის სპეციალური რეგისტრები;

· სასურველ პლატფორმაზე მაქსიმალური „მორგება“ (სპეციალური ინსტრუქციების გამოყენება, „ტექნიკის“ ტექნიკური მახასიათებლები);

· შეუწყნარებლობა სხვა პლატფორმების მიმართ (გარდა ორობითი თავსებადი).

ინსტრუქციების გარდა, პროგრამა შეიძლება შეიცავდეს დირექტივებს: ბრძანებებს, რომლებიც პირდაპირ არ ითარგმნება მანქანის ინსტრუქციებში, მაგრამ აკონტროლებენ შემდგენლის მუშაობას. მათი კომპლექტი და სინტაქსი მნიშვნელოვნად განსხვავდება და დამოკიდებულია არა აპარატურულ პლატფორმაზე, არამედ გამოყენებულ შემდგენელზე (რის შედეგადაც წარმოიქმნება ენათა დიალექტები იმავე ოჯახის არქიტექტურაში). როგორც დირექტივების ერთობლიობა, შეიძლება გამოვყოთ:

· მონაცემთა განსაზღვრა (მუდმივები და ცვლადები);

· პროგრამის ორგანიზების მეხსიერებაში და გამომავალი ფაილის პარამეტრების მართვა;

· კომპილერის მუშაობის რეჟიმის დაყენება;

· ყველა სახის აბსტრაქცია (ანუ მაღალი დონის ენების ელემენტები) - პროცედურების და ფუნქციების დიზაინიდან (პროცედურული პროგრამირების პარადიგმის განხორციელების გასამარტივებლად) პირობით სტრუქტურებსა და მარყუჟებამდე (სტრუქტურირებული პროგრამირების პარადიგმისთვის);

· მაკროები.

ბრძანების ნაკრები

ასამბლეის ენის ტიპიური ბრძანებებია:

მონაცემთა გადაცემის ბრძანებები (mov და ა.შ.)

არითმეტიკული ბრძანებები (add, sub, imul და ა.შ.)

ლოგიკური და ბიტური ოპერაციები (ან, და, xor, shr და ა.შ.)

· ბრძანებები პროგრამის შესრულების გასაკონტროლებლად (jmp, loop, ret და ა.შ.)

შეწყვეტის გამოძახების ბრძანებები (ზოგჯერ მოიხსენიება როგორც საკონტროლო ბრძანებები): int

I/O ბრძანებები პორტებზე (შესვლა, გამოსვლა)

მიკროკონტროლერებისა და მიკროკომპიუტერებისთვის ასევე დამახასიათებელია ბრძანებები, რომლებიც ასრულებენ შემოწმებას და გადასვლებს მდგომარეობის მიხედვით, მაგალითად:

· ჯნე - გადაადგილება თუ თანაბარი არ არის;

· Jge - ნახტომი თუ მეტია ან ტოლი.

1. კომპიუტერის არქიტექტურა ……………………………………………………………… 5

    1.1. რეგისტრირებს.

    1.1.1 ზოგადი დანიშნულების რეგისტრები.

1.1.2. სეგმენტის რეგისტრები

1.1.3 დროშის რეგისტრი

1.2. მეხსიერების ორგანიზაცია.

1.3. მონაცემთა პრეზენტაცია.

1.3.1 მონაცემთა ტიპები

1.3.2 სიმბოლოების და სტრიქონების წარმოდგენა

2. ასამბლერის პროგრამის ოპერატორები …………………………………………

    1. ასამბლეის ენის ბრძანებები

2.2. მიმართვის რეჟიმები და მანქანების ინსტრუქციის ფორმატები

3. ფსევდოოპერატორები …………………………………………………………….

3.1 მონაცემთა განსაზღვრის დირექტივები

3.2 ასამბლეის ენის პროგრამის სტრუქტურა

3.2.1 პროგრამის სეგმენტები. ვივარაუდოთ დირექტივა

3.2.3 გამარტივებული სეგმენტაციის დირექტივა

4. პროგრამის აწყობა და დაკავშირება …………………………….

5. მონაცემების გაგზავნის ბრძანებები ………………………………………………….

    5.1 გენერალური ბრძანებები

    5.2 დასტასთან მუშაობის ბრძანებები

5.3 I/O ბრძანებები

5.4 მისამართის გადამისამართების ბრძანებები

5.5 დროშების გადამისამართების ბრძანებები

6. არითმეტიკული ბრძანებები ………………………………………………….

    6.1 არითმეტიკული მოქმედებები ბინარულ მთელ რიცხვებზე

6.1.1 შეკრება და გამოკლება

6.1.2 მიმღების გაზრდისა და შემცირების ბრძანებები ერთით

6.2 გამრავლება და გაყოფა

6.3 ნიშნის შეცვლა

7. ლოგიკური მოქმედებები ………………………………………………….

8. ძვრები და ციკლური ძვრები ………………………………………………

9. სიმებიანი მოქმედებები ……………………………………………………

10. პროგრამების ლოგიკა და ორგანიზაცია ……………………………………………

10.1 უპირობო ნახტომები

10.2 პირობითი ხტომები

10.4 რუტინები ასამბლეის ენაზე

10.5 INT წყვეტები

10.6 სისტემური პროგრამული უზრუნველყოფა

10.6.1.1 კლავიატურის კითხვა.

10.6.1.2 სიმბოლოების ჩვენება ეკრანზე

10.6.1.3 პროგრამების დასრულება.

10.6.2.1 ჩვენების რეჟიმების არჩევა

11. დისკის მეხსიერება ………………………………………………………… ..

11.2 ფაილების განაწილების ცხრილი

11.3 დისკი I/O

11.3.1 ფაილის ჩაწერა დისკზე

11.3.1.1 მონაცემები ASCIIZ ფორმატში

11.3.1.2 ფაილის ნომერი

11.3.1.3 დისკის ფაილის შექმნა

11.3.2 დისკის ფაილის წაკითხვა

შესავალი

ასამბლეის ენა არის მანქანური ენის სიმბოლური წარმოდგენა. ყველა პროცესი პერსონალურ კომპიუტერში (PC) უმცირეს, ტექნიკის დონეზე მართულია მხოლოდ მანქანის ენის ბრძანებებით (ინსტრუქციები). შეუძლებელია აპარატურასთან დაკავშირებული პრობლემების ჭეშმარიტად გადაჭრა (ან თუნდაც, უფრო მეტიც, აპარატურაზე დამოკიდებული პრობლემები, როგორიცაა პროგრამის მუშაობის გაუმჯობესება) ასამბლერის ცოდნის გარეშე.

Assembler არის ბრძანებების მოსახერხებელი ფორმა უშუალოდ კომპიუტერის კომპონენტებისთვის და მოითხოვს ცოდნას ამ კომპონენტების შემცველი ინტეგრირებული მიკროსქემის, კერძოდ, კომპიუტერის მიკროპროცესორის თვისებებისა და შესაძლებლობების შესახებ. ამრიგად, ასამბლეის ენა პირდაპირ კავშირშია კომპიუტერის შიდა ორგანიზაციასთან. და შემთხვევითი არ არის, რომ მაღალი დონის ენების თითქმის ყველა შემდგენელი მხარს უჭერს ასამბლეის ენის პროგრამირების დონეზე წვდომას.

პროფესიონალი პროგრამისტის მომზადების ელემენტია აუცილებლად ასამბლერის შესწავლა. ეს იმიტომ ხდება, რომ ასამბლეის ენის პროგრამირება მოითხოვს კომპიუტერის არქიტექტურის ცოდნას, რაც საშუალებას გაძლევთ შექმნათ უფრო ეფექტური პროგრამები სხვა ენებზე და დააკავშიროთ ისინი ასამბლეის ენის პროგრამებთან.

სახელმძღვანელო ეხება Intel-ის მიკროპროცესორებზე დაფუძნებული კომპიუტერების ასამბლეის ენაზე პროგრამირების საკითხებს.

ეს გაკვეთილი მიმართულია ყველასთვის, ვინც დაინტერესებულია პროცესორის არქიტექტურით და ასამბლეის ენის პროგრამირების საფუძვლებით, პირველ რიგში პროგრამული უზრუნველყოფის დეველოპერებისთვის.

    კომპიუტერის არქიტექტურა.

კომპიუტერული არქიტექტურა არის კომპიუტერის აბსტრაქტული წარმოდგენა, რომელიც ასახავს მის სტრუქტურულ, სქემებსა და ლოგიკურ ორგანიზაციას.

ყველა თანამედროვე კომპიუტერს აქვს არქიტექტურის ზოგიერთი საერთო და ინდივიდუალური თვისება. ინდივიდუალური თვისებები თანდაყოლილია მხოლოდ კონკრეტულ კომპიუტერულ მოდელში.

კომპიუტერული არქიტექტურის კონცეფცია მოიცავს:

    კომპიუტერის ბლოკ-სქემა;

    კომპიუტერული ბლოკ-სქემის ელემენტებზე წვდომის საშუალებები და მეთოდები;

    რეესტრების ნაკრები და ხელმისაწვდომობა;

    ორგანიზაცია და მიმართვის მეთოდები;

    კომპიუტერული მონაცემების პრეზენტაციის მეთოდი და ფორმატი;

    კომპიუტერული მანქანების ინსტრუქციების ნაკრები;

    მანქანების ინსტრუქციების ფორმატები;

    შეწყვეტის მართვა.

კომპიუტერული ტექნიკის ძირითადი ელემენტები: სისტემური ერთეული, კლავიატურა, დისპლეის მოწყობილობები, დისკის დისკები, საბეჭდი მოწყობილობები (პრინტერი) და სხვადასხვა საკომუნიკაციო საშუალებები. სისტემის ერთეული შედგება დედაპლატისგან, კვების წყაროსგან და დამატებითი ბარათების გაფართოების სლოტებისგან. სისტემის დაფაზე განთავსებულია მიკროპროცესორი, მხოლოდ წაკითხვის მეხსიერება (ROM), შემთხვევითი წვდომის მეხსიერება (RAM) და კოპროცესორი.

      რეგისტრირებს.

მიკროპროცესორის შიგნით ინფორმაცია შეიცავს 32 რეგისტრის ჯგუფს (16 მომხმარებლის რეგისტრი, 16 სისტემის რეგისტრი), რომლებიც გარკვეულწილად ხელმისაწვდომია პროგრამისტისთვის გამოსაყენებლად. ვინაიდან გაკვეთილი ეძღვნება 8088-i486 მიკროპროცესორის პროგრამირებას, ყველაზე ლოგიკურია ამ თემის დაწყება მომხმარებლისთვის ხელმისაწვდომი მიკროპროცესორის შიდა რეგისტრების განხილვით.

მომხმარებლის რეგისტრებს პროგრამისტი იყენებს პროგრამების დასაწერად. ეს რეესტრები მოიცავს:

    რვა 32-ბიტიანი რეგისტრი (ზოგადი დანიშნულების რეგისტრი) EAX / AX / AH / AL, EBX / BX / BH / BL, ECX / CX / CH / CL, EDX / DX / DLH / DL, EBP / BP, ESI / SI, EDI / DI, ESP / SP;

    ექვსი 16 - ბიტიანი სეგმენტის რეგისტრი: CS, DS, SS, ES, FS, GS;

    სტატუსის და კონტროლის რეგისტრები: EFLAGS / FLAGS დროშის რეგისტრი და EIP / IP ინსტრუქციის მაჩვენებლის რეგისტრი.

ხაზი აღნიშნავს ერთი 32-ბიტიანი რეგისტრის ნაწილებს. E (Extended) პრეფიქსი აღნიშნავს 32-ბიტიანი რეგისტრის გამოყენებას. ბაიტებთან მუშაობისთვის გამოიყენება რეგისტრები პრეფიქსებით L (დაბალი) და H (მაღალი), მაგალითად, AL, CH - აღნიშნავს რეგისტრების 16-ბიტიანი ნაწილების დაბალ და მაღალ ბაიტებს.

        ზოგადი დანიშნულების რეგისტრები.

EAX / AX / AH / AL (აკუმულატორის რეგისტრი) - ბატარეა... გამოიყენება გამრავლებისა და გაყოფისას, I/O ოპერაციებში და ზოგიერთ ოპერაციებში სტრიქონებზე.

EBX / BX / BH / BL - ბაზის რეესტრი(საბაზისო რეგისტრი), ხშირად გამოიყენება მეხსიერებაში მონაცემების მიმართვისას.

ECX / CX / CH / CL - მრიცხველი(დათვლის რეგისტრი), გამოიყენება როგორც მარყუჟის განმეორების მრიცხველი.

EDX / DX / DH / DL - მონაცემთა რეესტრი(მონაცემთა რეგისტრი), გამოიყენება შუალედური მონაცემების შესანახად. ეს სავალდებულოა ზოგიერთი ბრძანებისთვის.

ამ ჯგუფის ყველა რეგისტრი იძლევა წვდომას მათ "ქვედა" ნაწილებზე. ამ რეგისტრების მხოლოდ ქვედა 16- და 8-ბიტიანი ნაწილები შეიძლება გამოყენებულ იქნას თვითმიმართვისთვის. ამ რეგისტრების ზედა 16 ბიტი არ არის ხელმისაწვდომი, როგორც დამოუკიდებელი ობიექტები.

ხაზის დამუშავების ბრძანებების მხარდასაჭერად, რომლებიც საშუალებას იძლევა 32, 16 ან 8 ბიტის სიგრძის ელემენტების ჯაჭვების თანმიმდევრული დამუშავება, გამოიყენება შემდეგი:

ESI / SI (წყაროს ინდექსის რეგისტრი) - ინდექსი წყარო... შეიცავს მიმდინარე წყაროს ელემენტის მისამართს.

EDI / DI (განსხვავების ინდექსის რეგისტრი) - ინდექსი მიმღები(მიმღები). შეიცავს მიმდინარე მისამართს მიმღების სტრიქონში.

მიკროპროცესორის არქიტექტურაში მონაცემთა სტრუქტურა - სტეკი - მხარდაჭერილია აპარატურულ-პროგრამულ დონეზე. არსებობს სპეციალური ბრძანებები და სპეციალური რეგისტრები სტეკთან მუშაობისთვის. უნდა აღინიშნოს, რომ სტეკი ივსება მცირე მისამართების მიმართ.

ESP / SP (stack poINTer რეგისტრაცია) - რეგისტრაცია მაჩვენებელი დასტის... შეიცავს მაჩვენებელს სტეკის ზევით მიმდინარე სტეკის სეგმენტზე.

EBP / BP (საბაზისო მაჩვენებელი რეგისტრი) - სტეკის ბაზის მაჩვენებლის რეგისტრი... შექმნილია დასტის შიგნით მონაცემებზე შემთხვევითი წვდომის ორგანიზებისთვის.

1.1.2. სეგმენტის რეგისტრები

მიკროპროცესორის პროგრამულ მოდელში არის ექვსი სეგმენტის რეგისტრები: CS, SS, DS, ES, GS, FS. მათი არსებობა განპირობებულია Intel მიკროპროცესორების მიერ ოპერატიული მეხსიერების ორგანიზებისა და გამოყენების სპეციფიკით. მიკროპროცესორული აპარატურა მხარს უჭერს პროგრამის სტრუქტურულ ორგანიზაციას, რომელიც შედგება სეგმენტები.სეგმენტური რეგისტრები გამოიყენება ამჟამად ხელმისაწვდომი სეგმენტების აღსანიშნავად. მიკროპროცესორი მხარს უჭერს შემდეგ სეგმენტურ ტიპებს:

    კოდის სეგმენტი.შეიცავს პროგრამის ბრძანებებს. ამ სეგმენტზე წვდომისთვის გამოიყენეთ CS (კოდის სეგმენტის რეგისტრი) რეგისტრი - სეგმენტის კოდის რეგისტრი... ის შეიცავს მანქანის ინსტრუქციის სეგმენტის მისამართს, რომელზეც მიკროპროცესორს აქვს წვდომა.

    მონაცემთა სეგმენტი.შეიცავს პროგრამის მიერ დამუშავებულ მონაცემებს. ამ სეგმენტზე წვდომისთვის გამოიყენეთ DS (მონაცემთა სეგმენტის რეგისტრი) რეგისტრი - სეგმენტის მონაცემთა რეგისტრირომელიც ინახავს მიმდინარე პროგრამის მონაცემთა სეგმენტის მისამართს.

    დასტის სეგმენტი.ეს სეგმენტი წარმოადგენს მეხსიერების არეალს, რომელსაც ეწოდება სტეკი. მიკროპროცესორი აწყობს დასტას პრინციპის მიხედვით - პირველი მოდი, პირველი წადი. SS (სტაკის სეგმენტის რეგისტრი) რეგისტრი გამოიყენება სტეკზე წვდომისთვის - სტეკის სეგმენტის რეგისტრირომელიც შეიცავს სტეკის სეგმენტის მისამართს.

    დამატებითი მონაცემთა სეგმენტი.დამუშავებული მონაცემები შეიძლება იყოს სამ დამატებით მონაცემთა სეგმენტში. ნაგულისხმევად, მონაცემები ითვლება მონაცემთა სეგმენტში. დამატებითი მონაცემების სეგმენტების გამოყენებისას, მათი მისამართები ცალსახად უნდა იყოს მითითებული ბრძანებაში სპეციალური სეგმენტის გადაფარვის პრეფიქსების გამოყენებით. მონაცემთა დამატებითი სეგმენტების მისამართები უნდა იყოს შეტანილი ES, GS, FS (extenSion data segment registers) რეგისტრებში.

        კონტროლისა და სტატუსის რეგისტრები

მიკროპროცესორი შეიცავს რამდენიმე რეგისტრს, რომლებიც შეიცავს ინფორმაციას როგორც თავად მიკროპროცესორის, ასევე პროგრამის მდგომარეობის შესახებ, რომლის ბრძანებები ამჟამად ჩატვირთულია მილსადენში. ეს:

EIP / IP Command Pointer Register;

    დაარეგისტრირე დროშები EFLAGS / FLAGS.

ამ რეგისტრების გამოყენებით შეგიძლიათ მიიღოთ ინფორმაცია ბრძანების შესრულების შედეგების შესახებ და გავლენა მოახდინოთ თავად მიკროპროცესორის მდგომარეობაზე.

EIP / IP (ინსტრუქციის PoINTer რეგისტრი) - მაჩვენებელი გუნდები... EIP / IP რეგისტრი არის 32 ან 16 ბიტიანი და შეიცავს შემდეგი ინსტრუქციის ოფსეტს, რომელიც უნდა შესრულდეს მიმდინარე ინსტრუქციის სეგმენტში CS სეგმენტის რეგისტრის შიგთავსთან მიმართებაში. ეს რეესტრი არ არის პირდაპირ წვდომა, მაგრამ ის იცვლება გადახტომის ბრძანებებით.

EFLAGS / FLAGS (დროშის რეგისტრი) - რეგისტრაცია დროშები... ბიტის სიღრმე 32/16 ბიტი. ამ რეგისტრის ცალკეულ ბიტებს აქვთ კონკრეტული ფუნქციონალური დანიშნულება და ეწოდება დროშები. დროშა არის ბიტი, რომელიც იღებს 1 მნიშვნელობას („დროშა დაყენებულია“) თუ გარკვეული პირობა დაკმაყოფილებულია, ხოლო მნიშვნელობა 0 („დროშა წაშლილია“) წინააღმდეგ შემთხვევაში. ამ რეესტრის ქვედა ნაწილი სრულიად ანალოგიურია FLAGS რეგისტრის i8086-ისთვის.

1.1.3 დროშის რეგისტრი

დროშების რეგისტრი არის 32-ბიტიანი და აქვს სახელი EFLAGS (სურათი 1). რეგისტრის ცალკეულ ბიტებს აქვთ კონკრეტული ფუნქციონალური დანიშნულება და ეწოდება დროშები. თითოეულ მათგანს ენიჭება კონკრეტული სახელი (ZF, CF და ა.შ.). EFLAGS-ის ქვედა 16 ბიტი წარმოადგენს 16-ბიტიან FLAGS რეგისტრს, რომელიც გამოიყენება i086 და i286 მიკროპროცესორებისთვის დაწერილი პროგრამების შესრულებისას.

ნახ. 1 დროშების რეესტრი

ზოგიერთ დროშას ჩვეულებრივ მოიხსენიებენ, როგორც მდგომარეობის დროშებს; ისინი ავტომატურად იცვლებიან ბრძანებების შესრულებისას და აფიქსირებენ მათი შედეგის გარკვეულ თვისებებს (მაგალითად, ნულის ტოლია თუ არა). სხვა დროშებს სახელმწიფო დროშები ეწოდება; ისინი იცვლებიან პროგრამიდან და გავლენას ახდენენ პროცესორის შემდგომ ქცევაზე (მაგალითად, ბლოკირების შეფერხებები).

მდგომარეობის დროშები:

CF (დროშის ტარება) - დროშის ტარება... იღებს 1 მნიშვნელობას, თუ მთელი რიცხვების დამატებისას გამოჩნდა დეფისის ერთეული, რომელიც არ „ჯდება“ ბიტების ბადეში, ან თუ, ხელმოუწერელი რიცხვების გამოკლებისას, პირველი მათგანი მეორეზე ნაკლები იყო. Shift ბრძანებებში, ბიტი, რომელიც გასცდა ბიტების ქსელს, დაყენებულია CF-ში. CF ასევე ასახავს გამრავლების ბრძანების მახასიათებლებს.

OF (გადინება დროშა) - გადინება დროშა... ის დაყენებულია 1-ზე, თუ ხელმოწერილი მთელი რიცხვების დამატების ან გამოკლებისას მიიღება შედეგი, რომელიც აღემატება დასაშვებ მნიშვნელობას აბსოლუტური მნიშვნელობით (მანტისა გადმოვიდა და ის "ავიდა" ნიშნის ბიტში).

ZF (ნულოვანი დროშა) - ნულოვანი დროშა... დაყენებულია 1-ზე, თუ ბრძანების შედეგი იყო 0-ის ტოლი.

SF (ნიშნის დროშა) - დროშა ნიშანი... ის დაყენებულია 1-ზე, თუ ხელმოწერილი ნომრების მოქმედება იწვევს უარყოფით შედეგს.

PF (პარიტეტის დროშა) - დროშა პარიტეტი... უდრის 1-ს, თუ შემდეგი ბრძანების შედეგი შეიცავს ბინართა ლუწი რაოდენობას. ჩვეულებრივ მხედველობაში მიიღება მხოლოდ I/O ოპერაციების დროს.

AF (დამხმარე ტარების დროშა) - დამატებითი ტარების დროშა... აფიქსირებს ორობით-ათწილად რიცხვებზე მოქმედებების შესრულების თავისებურებებს.

სტატუსის დროშები:

DF (მიმართულების დროშა) - მიმართულების დროშა... ადგენს ხაზების ნახვის მიმართულებას სტრიქონების ბრძანებებში: DF = 0-ით, ხაზები სკანირებულია "წინ" (თავიდან ბოლომდე), DF = 1 - საპირისპირო მიმართულებით.

IOPL (შეყვანის / გამომავალი პრივილეგიის დონე) - I/O პრივილეგიის დონე.იგი გამოიყენება მიკროპროცესორის დაცულ რეჟიმში I/O ბრძანებებზე წვდომის გასაკონტროლებლად, დავალების პრივილეგიიდან გამომდინარე.

NT (ჩადგმული დავალება) - დავალების მობუდული დროშა.იგი გამოიყენება მიკროპროცესორის დაცულ რეჟიმში ჩასაწერად, რომ ერთი დავალება მეორეშია ჩასმული.

სისტემის დროშა:

IF (შეწყვეტის დროშა) - შეწყვეტის დროშა... როდესაც IF = 0, პროცესორი წყვეტს პასუხს შემომავალ შეფერხებებზე; როდესაც IF = 1, შეფერხების დაბლოკვა იხსნება.

TF (ხაფანგის დროშა) - კვალი დროშა... თუ TF = 1, თითოეული ინსტრუქციის შესრულების შემდეგ, პროცესორი აკეთებს შეფერხებას (ნომრით 1), რომელიც შეიძლება გამოყენებულ იქნას პროგრამის გამართვისას მის კვალზე.

RF (რეზიუმე დროშა) - რეზიუმეს დროშა... გამოიყენება გამართვის რეგისტრებიდან შეფერხებების დამუშავებისას.

VM (ვირტუალური 8086 რეჟიმი) - ვირტუალური 8086 დროშა. 1-პროცესორი მუშაობს ვირტუალურ 8086 რეჟიმში.0- პროცესორი მუშაობს რეალურ ან დაცულ რეჟიმში.

AC (განლაგების შემოწმება) - გასწორების კონტროლის დროშა.შექმნილია მეხსიერებაზე წვდომისას გასწორების კონტროლის გასააქტიურებლად.

      მეხსიერების ორგანიზაცია.

ფიზიკურ მეხსიერებას, რომელზეც მიკროპროცესორს აქვს წვდომა, ეწოდება ოპერატიული მეხსიერება (ან შემთხვევითი წვდომის მეხსიერება - ოპერატიული მეხსიერება). RAM არის ბაიტების ჯაჭვი, რომელსაც აქვს საკუთარი უნიკალური მისამართი (მისი ნომერი), ე.წ ფიზიკური.ფიზიკური მისამართების მნიშვნელობების დიაპაზონი 0-დან 4 გბ-მდეა. მეხსიერების მართვის მექანიზმი მთლიანად დაფუძნებულია აპარატურაზე.

მიკროპროცესორი მხარს უჭერს RAM-ის რამდენიმე მოდელს აპარატურაში:

    სეგმენტირებული მოდელი... ამ მოდელში პროგრამების მეხსიერება იყოფა მიმდებარე მეხსიერების არეებად (სეგმენტებად) და თავად პროგრამას შეუძლია მხოლოდ იმ მონაცემებზე წვდომა, რომლებიც ამ სეგმენტებშია;

    გვერდის მოდელი... ამ შემთხვევაში, ოპერატიული მეხსიერება განიხილება, როგორც 4 KB ფიქსირებული ზომის ბლოკების ნაკრები. ამ მოდელის ძირითადი გამოყენება დაკავშირებულია ვირტუალური მეხსიერების ორგანიზებასთან, რაც პროგრამებს საშუალებას აძლევს გამოიყენონ მეხსიერების სივრცე უფრო დიდი ვიდრე ფიზიკური მეხსიერების რაოდენობა. Pentium მიკროპროცესორისთვის, შესაძლო ვირტუალური მეხსიერება შეიძლება იყოს 4 ტბ-მდე.

ამ მოდელების გამოყენება და განხორციელება დამოკიდებულია მიკროპროცესორის მუშაობის რეჟიმზე:

    რეალური მისამართის რეჟიმი (რეალური რეჟიმი).რეჟიმი ჰგავს i8086 პროცესორის მუშაობას. ეს აუცილებელია ადრეული პროცესორის მოდელებისთვის შემუშავებული პროგრამების ფუნქციონირებისთვის.

    დაცული რეჟიმი.დაცულ რეჟიმში შესაძლებელი ხდება ინფორმაციის მრავალამოცანის დამუშავება, მეხსიერების დაცვა ოთხდონიანი პრივილეგიური მექანიზმის და მისი პეიჯინგის გამოყენებით.

    ვირტუალური 8086 რეჟიმი.ამ რეჟიმში, i8086-ისთვის რამდენიმე პროგრამის გაშვება ხდება შესაძლებელი. ამ შემთხვევაში შესაძლებელია რეალურ რეჟიმში პროგრამების მუშაობა.

სეგმენტაცია არის მისამართის მექანიზმი, რომელიც იძლევა მრავალი დამოუკიდებელი მისამართის სივრცის არსებობის საშუალებას. სეგმენტი არის მეხსიერების დამოუკიდებელი, ტექნიკით მხარდაჭერილი ბლოკი.

ზოგადად, თითოეული პროგრამა შეიძლება შედგებოდეს ნებისმიერი რაოდენობის სეგმენტისგან, მაგრამ მას აქვს პირდაპირი წვდომა სამ მთავარზე: კოდზე, მონაცემზე და დასტაზე - და ერთიდან სამ დამატებით მონაცემთა სეგმენტზე. ოპერაციული სისტემა ათავსებს პროგრამის სეგმენტებს RAM-ში კონკრეტულ ფიზიკურ მისამართებზე და შემდეგ ათავსებს ამ მისამართების მნიშვნელობებს შესაბამის რეესტრებში. სეგმენტის ფარგლებში პროგრამა წვდება მისამართებს სეგმენტის დასაწყისთან შედარებით წრფივად, ანუ დაწყებული 0 მისამართიდან და მთავრდება სეგმენტის ზომის ტოლი მისამართით. ნათესავი მისამართი ან მიკერძოება,რომელსაც მიკროპროცესორი იყენებს სეგმენტში მონაცემებზე წვდომისათვის ეწოდება ეფექტური.

ფიზიკური მისამართის ფორმირება რეალურ რეჟიმში

რეალურ რეჟიმში, ფიზიკური მისამართის ცვლილების დიაპაზონი არის 0-დან 1 მბ-მდე. სეგმენტის მაქსიმალური ზომაა 64 კბ. კონკრეტულზე მითითებისას საცხოვრებელი მისამართიოპერატიული მეხსიერება განისაზღვრება სეგმენტის დასაწყისის მისამართით და სეგმენტის შიგნით ოფსეტურით. სეგმენტის საწყისი მისამართი აღებულია შესაბამისი სეგმენტის რეესტრიდან. ამ შემთხვევაში სეგმენტის რეგისტრი შეიცავს სეგმენტის დასაწყისის ფიზიკური მისამართის მხოლოდ ზედა 16 ბიტს. 20-ბიტიანი მისამართის დაკარგული ქვედა ოთხი ბიტი მიიღება სეგმენტის რეგისტრის მნიშვნელობის მარცხნივ 4 ბიტით გადატანით. ცვლის ოპერაცია ხორციელდება აპარატურაში. შედეგად მიღებული 20-ბიტიანი მნიშვნელობა არის რეალური ფიზიკური მისამართი, რომელიც შეესაბამება სეგმენტის დასაწყისს. ანუ ფიზიკური მისამართიმითითებულია, როგორც წყვილი "სეგმენტი: ოფსეტი", სადაც "სეგმენტი" არის მეხსიერების სეგმენტის საწყისი მისამართის პირველი 16 ბიტი, რომელსაც ეკუთვნის უჯრედი, ხოლო "ოფსეტი" არის ამ უჯრედის 16-ბიტიანი მისამართი, დათვლილი მეხსიერების ამ სეგმენტის დასაწყისი (მნიშვნელობა 16 * სეგმენტი + ოფსეტი იძლევა უჯრედის აბსოლუტურ მისამართს). თუ, მაგალითად, CS რეესტრი ინახავს მნიშვნელობას 1234h, მაშინ მისამართების წყვილი 1234h: 507h განსაზღვრავს აბსოლუტურ მისამართს, რომელიც ტოლია 16 * 1234h + 507h = 12340h + 507h = 12847h. ასეთი წყვილი იწერება ორმაგი სიტყვის სახით და (რაც შეეხება რიცხვებს) „შებრუნებული“ ფორმით: პირველი სიტყვა შეიცავს ოფსეტს, ხოლო მეორე - სეგმენტს და თითოეული ეს სიტყვა თავის მხრივ წარმოდგენილია "შებრუნებული" ფორმა. მაგალითად, წყვილი 1234h: 5678h ჩაიწერება ასე: | 78 | 56 | 34 | 12 |.

ფიზიკური მისამართის ფორმირების ეს მექანიზმი საშუალებას გაძლევთ გახადოთ პროგრამული უზრუნველყოფა გადაადგილებადი, ანუ ის არ არის დამოკიდებული RAM-ში მისი ჩატვირთვის კონკრეტულ მისამართებზე.

გააზიარე ეს