2010-10-07 21 views
5
int main(void){ 

printf("Hello World"); 

return 0; 

} 

Làm thế nào là được chuyển thành giá trị trả về ở cấp độ lắp ráp? Có một thanh ghi CPU chuyên dụng cho công việc này không?Giá trị trả lại được thực hiện ở cấp độ lắp ráp như thế nào?

CẬP NHẬT

Đây là 2 bảng trên truyền/dữ liệu trở lại trong pdf, nhưng không dường như có các thông tin chính xác về cách quy ước gọi của một API được xác định và đó register được sử dụng cho lưu trữ trở lại địa chỉ:

alt text

alt text

+1

Điều này phụ thuộc vào nhiều yếu tố bao gồm: trình biên dịch nào, CPU nào, hệ điều hành nào gọi các quy ước, tối ưu hóa hoạt động, v.v ... Và tất nhiên, ngôn ngữ nào. –

+0

Trên x86 giá trị trả về của một syscall/API là ** thường ** 'eax' register – jyz

Trả lời

8

đó phụ thuộc vào kiến ​​trúc. Chỉ với một vài ví dụ, trên x86 thanh ghi EAX thường được sử dụng cho các giá trị trả về. Trên x86-64, đó là RAX. Trên SPARC, thông thường nó sẽ hiển thị trong% o0.

+0

Vì vậy, luôn luôn có một ** quy định ** dành riêng cho đăng ký này, phải không? – Alan

+1

Chính xác thì ý của bạn là gì? Không, EAX (ví dụ) không được dành riêng cho mục đích đó. Có, khi bạn cần trả về một giá trị, hầu hết các trình biên dịch sẽ trông đợi nó nằm trong EAX. Trong hội đồng viết tay, bạn có nhiều khả năng thấy các thanh ghi khác được sử dụng thường xuyên hơn (ví dụ: ESI hoặc EDI cho các chuỗi). Quay trở lại trong 16-bit ngày, 16-bit trả về thường trong AX, và 32-bit trả về trong DX: AX. –

+0

Nếu thanh ghi không cố định, các API khác nhau giao tiếp như thế nào? – Alan

3

Đó là một phần của application binary interface.

Những ngày này giá trị trả về và thông số hàm thường được chuyển trong sổ đăng ký, vì đó là tùy chọn hiệu quả nhất. Chỉ khi điều đó quá lớn đối với các thanh ghi có sẵn, ngăn xếp sẽ được sử dụng.

+0

Bạn có thể cung cấp một ví dụ về 'ABI' để tôi có thể biết nó giống như thế nào trên trái đất? – Alan

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