თარიღი
/   ავტორიSCSA

Assembly-ის ბრძანებების მისამართები

 რუბრიკა:  კომპიუტერები და სისტემები

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

ბრმა ოპერანდების გამოყენების დროს, მეხსიერებაში, სადაც იმყოფება ჩვენთვის საჭირო მნიშვნელობა, მას ვწერთ კვადრატულ ფრჩზილებში: [მისამართი] ; თუ ჩვენ ვუწერთ მიმთითებელს, მისამართის სიმბოლურ აღნიშვნას, მაგალითად : [ESI] მაშინ მანქანის კოდის ლისტინგში ჩვენ დავინახავთ, რომ სიმბოლური აღნიშვნა შეიცვლება რეალური მისამართით, შეიძლება ასევე ჩვენ თვითონ მივუთითოთ რეალური მისამართი. მაგალითად: [0x594F].

განვიხილოთ პატარა ფრაგმენტი პროგრამიდან, რომელშიც რეგისტრ ESI-ში შეტანილია პირველი ელემენტის მისამართი (ნუმერაცია იწყება 0-დან) ბაიტების მასივში და ჩვენი მიზანია წავიკითხოთ მეორე ელემენტი (1 ბაიტით უფრო მეტი)? პროცესორი შესაძლებლობას გვაძლევს მეხსიერებაზე მოვახდინოთ მარტივი და რთული არითმეტიკული ოპერაციები.  ჩვენს შემთხვევში, რომ მივაღწიოთ სასურველ შედეგ ჩავწერთ ასე [ESI+1].

განვიხილოთ უფრო რთული ოპერაციებიც, მაგალითად: [მისამართი + ЕВХ + 4]. ამ შემთხვევაში

პროცესორი შეკრიბავს მისამართის ციფრ 4-ს და EBX რეგისტრში არსებულ მნიშვნელობას. ასეთ ოპერაციას ეწოდება ეფექტური მისამართი (ЕА, Effective Address). ეფექტური მისამართის გამოთვლის დრო 80386 პროცესორი გვაძლევს საშუალებას ასევე

გავამრავლოთ მნიშვნელობები კონსტანტაზე, [მისამართი + EBX * 4]. ასევე გვაქვს შემდეგი “გიჟი” ოპერაციების ჩატარების შესაძლებლობა  [რიცხვი – 6 + ЕВХ * 8 + ESI]. 80386 პროცესორებში შემთხვევში შეგვიძლია გამოვიყენოთ ნებისმიერი 16 და 32 განყოფილებიანი რეგისტრი [ЕАХ], [ЕВХ],… [ЕВР], 80286 პროცესორისგან განსხვავებით, სადაც მარტო 16 განყოფილებიანი რეგისტრებით მოგვიწევს დაკმაყოფილება: ВР, SI, DI, და ВХ.

მეხსიერებაზე მისამართზე შეიძლება ასევე გამოვიყენოთ სეგმენტური რეგისტრები, მათი ფუნქციები დამოკიდებულია პროცესორის რეჟიმზე. გადამისამართების ყოველი პროცედურა, როდესაც დგინდება მეხსიერების რეალური მისამართი, ჩვეულებრივ მოიცავს სეგმენტურ რეგისტრებს, ჩვენ მათ ვერ ვხედავთ. რეგისტრის შეცვლა შეგვიძლია შემდეგნაირად : ES:[ESI]; ზოგიერთი assembly მოითხოვს, რომ ორივე ნაწილი მოვათავსოთ კვადრატულ ფრჩხილებში: [ES:ESI];

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

Assembly – ში ბრძანებების ჩვეულებრივი ფორმატი ასეთია:

ბრძანების_სახელი [მითითება] ოპერანდი შემდეგ სტატიებში განვიხილავთ ბრძანებებს დეტალურად, ოპერანდები უკვე განვიხილეთ და

დაგვრჩა ერთი ნაკლებან მნიშვნელოვანი მაგრამ სასარგებლო ნიუანსი, მითითება რომელიც კომპილატორს ეუბნება თუ რა ზომის არის ოპერანდი, მისი მნიშვნელობა შეიძლება იყოს Byte (8 ბიტისანი ოპერანდი), WORD (16 ბიტიანი ოპერანდი) და DWORD (32 ბიტიანი ოპერანდი);

წარმოვიდგინოთ რომ ჩვენ გვჭირდება ჩავწეროთ 0 მნიშვნელობები რაღაც კონკრეტულ მისამართზე ან მისამართიდან დაწყებული, როგორ ჩამოვაყალიბოთ კოდი თუ დავუშვათ გვჭირდება 4,2 და 1 ბაიტის ჩაწერა მისამართზე 0x12345678.

ამას გავაკეთებთ შემდეგნაირად:

mov dword [ 0x12345678 ],0 ; ჩაწერს 4 ნულოვან ბაიტს დაწყებული 0x12 345678 მისაამართიდან

mov word [ 0x12345678 ],0 ; ჩაწერს 2 ნულოვან ბაიტს დაწყებული 0x12 345678 მისაამართიდან

mov byte [ 0x12345678 ],0 ; ჩაწერს 1 ნულოვან ბაიტს მისამართზე 0x12345678

დადატებითი ინფორმაცია: ASSEMBLY ენაში წერტილმძიმე( ; ) მიუთითებს იმაზე რომ იწყება

კომენტარი.

 

პუბლიკაციის გაზიარება

Facebook
Twitter
LinkedIn
Telegram

მოგეწონათ სტატია ?

გამოიწერეთ ჩვენი სიახლეები

სხვა სტატიები

I agree to Privacy Policy of Scientific Cyber Security Association