2013-04-06 18 views
5

Xin chào Tôi đang đọc hướng dẫn về x86 của Đại học Virginia và nó nói rằng việc đẩy và popping ngăn xếp sẽ loại bỏ hoặc thêm phần tử dữ liệu 4 byte vào ngăn xếp.x86 Có thể nhấn/pop dưới 4 byte không?

Tại sao giá trị này được đặt thành 4 byte? Điều này có thể được thay đổi, bạn có thể tiết kiệm bộ nhớ trên ngăn xếp bằng cách đẩy vào các yếu tố dữ liệu nhỏ hơn không?

Hướng dẫn có thể được tìm thấy ở đây nếu có ai muốn xem nó: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

Tuyên bố đó chỉ áp dụng ở chế độ 32 bit và bạn cũng có thể đẩy/bật 2 byte các yếu tố. – harold

Trả lời

7

Câu trả lời ngắn: Vâng, 16 hoặc 32 bit. Và, đối với x86-64, 64 bit.

Lý do chính cho ngăn xếp là trả về từ các cuộc gọi hàm lồng nhau và lưu/khôi phục giá trị đăng ký. Nó cũng thường được sử dụng để truyền các tham số và trả về các kết quả hàm. Ngoại trừ các tham số nhỏ nhất, các mục này thường có cùng kích thước bằng thiết kế của bộ xử lý, cụ thể là, kích thước của thanh ghi chỉ dẫn con trỏ. Đối với 8088/8086, nó là 16 bit. Đối với 80386 và kế thừa, nó là 32-bit. Do đó, có rất ít giá trị trong việc có hướng dẫn ngăn xếp hoạt động trên các kích thước khác.

Ngoài ra còn có cân nhắc về kích thước của dữ liệu trên bus bộ nhớ. Phải mất cùng một lượng thời gian để truy xuất hoặc lưu trữ một từ như một byte. (Ngoại trừ 8088 có thanh ghi 16 bit nhưng một bus dữ liệu 8 bit.) Căn chỉnh cũng đi vào hoạt động. Ngăn xếp phải được căn chỉnh trên các ranh giới từ để mỗi giá trị có thể được lấy ra dưới dạng một thao tác bộ nhớ. Việc trao đổi thường được thực hiện để tiết kiệm thời gian cho việc tiết kiệm bộ nhớ. Để chuyển một byte thành tham số, một từ thường được sử dụng. (Hoặc, tùy thuộc vào tối ưu hóa có sẵn cho trình biên dịch, một thanh ghi kích thước từ sẽ được sử dụng, tránh ngăn xếp hoàn toàn.)

+9

Trong x86-64, bạn không thể đẩy các thanh ghi 32 bit hoặc các giá trị được lưu trữ trong bộ nhớ, chỉ các thanh ghi 16 và 64-bit và các giá trị được lưu trong bộ nhớ. 'push ax',' push rax', 'push word [rax]' và 'push qword [rax]' là tất cả các lệnh x86-64 hợp lệ, nhưng 'push eax' và' push dword [rax] 'không hợp lệ trong x86-64. – nrz

+0

Lưu ý lịch sử, (rất hiếm khi được sử dụng) 80188 (từ 16 bit, bus dữ liệu 8 bit) và (hơi phổ biến trong một thời gian) 386SX (từ 32 bit, bus dữ liệu 16 bit) nằm trong cùng một thuyền các 8088 liên quan đến dữ liệu kích thước xe buýt không phù hợp. –

+0

Đối với "Ngăn xếp phải được căn chỉnh trên các ranh giới từ để mỗi giá trị có thể được truy xuất dưới dạng một thao tác bộ nhớ.", Điều này có áp dụng cho các biến cục bộ bên trong một hàm không? – Thomson

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