2012-01-14 27 views
7

tôi biên soạn mã dưới đây với các VC++ 2010 trình biên dịch:Tại sao trình biên dịch tạo ra cặp lệnh push/pop?

__declspec(dllexport) 
unsigned int __cdecl __mm_getcsr(void) { return _mm_getcsr(); } 

và mã được tạo là:

push ECX 
    stmxcsr [ESP] 
    mov EAX, [ESP] 
pop ECX 
retn 

Tại sao lại có một cặp hướng dẫn push ECX/pop ECX?

Trả lời

10

Trình biên dịch đang tạo chỗ trên ngăn xếp để lưu trữ MXCSR. Điều này có thể được thực hiện tốt như vậy:

sub esp,4 
stmxcsr [ESP] 
mov EAX, [ESP] 
add esp,4 
retn 

Nhưng "đẩy ecx" có thể ngắn hơn hoặc nhanh hơn.

+0

D'oh ... hoàn toàn bỏ lỡ điều đó. :) Cảm ơn rất nhiều. – Mehrdad

+0

Và làm thế nào để giải thích các cửa sổ pop? – CodesInChaos

+0

@CodeInChaos: Khôi phục con trỏ ngăn xếp? – Mehrdad

3

Đẩy tại đây được sử dụng để phân bổ 4 byte không gian tạm thời. [ESP] thường sẽ trỏ đến địa chỉ trả về được đẩy mà chúng tôi không thể ghi đè lên.

ECX sẽ bị ghi đè ở đây, tuy nhiên, ECX có thể là đăng ký dễ bay hơi trong ABI mà bạn đang nhắm mục tiêu, vì vậy chức năng không cần phải giữ gìn ECX.

Lý do push/pop được sử dụng ở đây là tối ưu hóa không gian (và có thể là tốc độ).

0

Nó tạo mục nhập chồng lên nhau mà ESP bây giờ gọi là mục tiêu cho lệnh stmxcsr. Sau đó, kết quả được lưu trữ trong EAX cho sự trở lại.

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