2012-06-24 33 views
8

Tôi đang chơi xung quanh với gcc -S để hiểu cách thức hoạt động của bộ nhớ và ngăn xếp. Trong những vở kịch này tôi đã tìm thấy một vài điều không rõ ràng với tôi. Bạn có thể vui lòng giúp tôi hiểu lý do không?Tại sao gcc thực hiện điều này khi tạo mã assembly?

  1. Khi gọi chức năng đặt tham số cho một gọi là một nó sử dụng mov để esp thay push. Lợi thế không sử dụng push là gì?

  2. Chức năng hoạt động với các đối số vị trí xếp chồng của chúng trỏ đến chúng là ebp + (N + offset) (trong đó N là kích thước dành riêng cho địa chỉ trả lại). Tôi mong đợi để xem esp - offset đó là dễ hiểu hơn. Lý do để sử dụng ebp là điểm cơ bản ở khắp mọi nơi? Tôi biết những cái này đều bình đẳng nhưng sao?

  3. Ma thuật này vào đầu năm main là gì? Tại sao chỉ cần khởi tạo esp theo cách này?

    and esp,0xfffffff0 
    

Cảm ơn,

+3

Đây có thể là 3 câu hỏi riêng biệt. Dù sao, câu trả lời cho điểm thứ 3 là sắp xếp ngăn xếp. – Mysticial

Trả lời

7

tôi sẽ cho rằng bạn đang làm việc trong một môi trường 32-bit bởi vì trong một môi trường 64-bit đối số được truyền trong thanh ghi.

Câu hỏi 1

Có lẽ bạn đang chuyển đối số dấu chấm động tại đây. Bạn không thể đẩy chúng trực tiếp, vì lệnh push trong thời gian chạy 32 bit đẩy 4 byte tại một thời điểm, do đó bạn sẽ phải chia nhỏ giá trị. Đôi khi dễ dàng trừ 8 từ esp và chúng di chuyển quadword 8 byte thành [esp].

Câu hỏi 2

ebp thường được sử dụng để chỉ mục các thông số và người dân địa phương trong các khung stack trong mã 32-bit. Điều này cho phép các offset trong các khung được cố định ngay cả khi con trỏ ngăn xếp di chuyển. Ví dụ xem xét

void f(int x) { 
    int a; 
    g(x, 5); 
} 

Bây giờ nếu bạn chỉ truy cập các nội dung stack frame với esp, sau đó a[esp], địa chỉ trả về sẽ là tại [esp+4]x sẽ có mặt tại [esp+8]. Bây giờ hãy tạo mã để gọi g. Trước tiên, chúng tôi phải đẩy 5 rồi đẩy x. Nhưng sau khi đẩy 5, giá trị bù trừ của x từ esp đã thay đổi! Đây là lý do tại sao ebp được sử dụng. Thông thường khi vào chức năng, chúng tôi đẩy giá trị cũ của ebp để lưu nó, sau đó sao chép esp đến ebp. Bây giờ ebp có thể được sử dụng để truy cập nội dung khung ngăn xếp. Nó sẽ không di chuyển khi chúng ta đang ở giữa các đối số.

Câu hỏi 3

hướng dẫn and này Zeros ra 4 bit cuối cùng của esp, sắp xếp nó vào một ranh giới 16-byte. Kể từ khi ngăn xếp phát triển xuống, điều này là tốt đẹp và an toàn.

+1

Q3: Nó không nằm trong 4 bit cuối cùng – hirschhornsalz

+0

Oh my, thanks, @drhirsch. Gõ mà không suy nghĩ. Khủng khiếp. Cám ơn rất nhiều! Đã chỉnh sửa. –

Các vấn đề liên quan