რა განსხვავებაა x86- ში "mov" და "lea" ბრძანებებს შორის?


პასუხი 1:

X86 CPU– ს აქვს საკმაოდ მოქნილი მისამართის განყოფილება, რომელთანაც შეგიძლიათ დაამატოთ შემდეგი:

  • არაკანონიერი რეესტრი რეგისტრი, მასშტაბით 1, 2, 4 ან 8 დაუყოვნებლივ მუდმივად

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

LEA გამოდის Load ეფექტური მისამართი. ის ადგენს მისამართის შექმნის შედეგს და ინახავს მას პირდაპირ რეესტრში მეხსიერებაში წვდომის გარეშე.

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

LEA– ის საერთო გამოყენებაა მრავალჯერადი არითმეტიკული საფეხურის ერთ ინსტრუქციაში გაერთიანება. მისი გამოყენება შეიძლება გამრავლების სიმულაციისთვის მცირე მნიშვნელობებითაც კი, მაგალითად, 1, 2, 3, 4, 5, 8 და 9.

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


პასუხი 2:

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

მოდით ვთქვათ, რომ ჩვენ გვაქვს რეგისტრირებული foo და ბარი. ბარი შეიცავს მეხსიერების მისამართს 0x01. მისამართი 0x01 შეიცავს 100 ნომერს.

  • "Mov foo bar" ეხება იმ მნიშვნელობას, რომელზეც ბარი მიუთითებს. ბარი არის განხილული და foo ხდება 100. "lea foo-bar" მხოლოდ ბარის შინაარსს ეხება და არა შენახვის ადგილს. ბარი არ არის განხილული და foo ხდება 0x01.