2010-04-06 21 views
11

Tôi đã đến để tìm hiểu rằng bạn không thể đẩy một byte trực tiếp vào ngăn xếp của Intel Pentium, bất cứ ai có thể giải thích điều này cho tôi xin vui lòng?Tại sao không thể đẩy byte vào ngăn xếp trên Pentium IA-32?

Lý do tôi được đưa ra là vì sổ đăng ký đặc biệt có thể định địa chỉ từ (hoặc, đó là giả định trong mô hình của chúng tôi) và nó phải là "địa chỉ đồng đều". Tôi đã giả định giảm giá trị của một số số nhị phân 32 bit sẽ không gây rối với sự liên kết của thanh ghi, nhưng dường như tôi không hiểu đủ.

Tôi đã thử một số thử nghiệm NASM và đưa ra rằng nếu tôi khai báo một biến (cắn db 123) và đẩy nó vào ngăn xếp, đặc biệt là giảm 4 (chỉ ra rằng nó đẩy 32-bit?). Nhưng, "đẩy byte cắn" (xin lỗi cho sự lựa chọn của tôi về tên biến) sẽ dẫn đến một lỗi loại:

test.asm: 10: lỗi: không được hỗ trợ phi 32-bit ELF di dời

Bất kỳ lời trí tuệ sẽ được đánh giá cao trong thời gian khó khăn này. Tôi là sinh viên năm nhất vì vậy xin lỗi vì sự ngây thơ của tôi trong bất kỳ điều này.

Trả lời

4

của nó dựa trên cách thức ngăn xếp đã được tạo ra:

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

In non-64-bit modes: if the address-size and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is decremented by 4. If both attributes are 16, the 16-bit SP register (stack pointer) is decremented by 2.

Nguồn: http://www.intel.com/Assets/PDF/manual/253667.pdf

pg. 4-320 Tập 2B

Sửa

Chỉ muốn chỉ ra cũng là một chi thú vị là phần trên ngăn xếp trong cuốn hướng dẫn, nó sẽ giải thích cách tạo ra một phân khúc chồng thêm.

http://www.intel.com/Assets/PDF/manual/253665.pdf

Chương 6.2

+0

Rất nhiều thông tin, nhưng tiếc là vẫn còn trên những gì tôi có thể nắm bắt với kiến ​​thức hiện tại của tôi. –

+0

@Tim - Có thể hiểu được. Có lẽ vẫn đáng đọc. –

+0

Đợi đã, đợi đã. Mỗi vị trí bộ nhớ rộng 32 bit, vì vậy nếu bạn đẩy một giá trị, nó sẽ giảm dung lượng theo 4 byte, vì 4 * 8 là 32 bit và nếu nó giảm xuống 2, thì sẽ thử và tạo một giá trị không đổi đọc, imploding vũ trụ? Đúng không? Nếu vậy, bạn có được điểm, rằng PDF là tuyệt vời (thứ hai). –

0

Con trỏ ngăn xếp phải (vì một số lý do tối ưu hóa) 4B căn chỉnh -> nó phải chia hết cho bốn (và, do đó, có 2 bit cuối cùng bằng không).

+0

Trong khi điều này không có ý nghĩa, câu trả lời của Yully giải thích nó từ dưới lên. Thanks anyway :) –

8

Nó sẽ làm cho con trỏ ngăn xếp không thể thực hiện công việc của mình trong một số trường hợp. ví dụ, cho phép nói rằng bạn đã có một chức năng mà đẩy một byte vào ngăn xếp và sau đó gọi một chức năng khác. Cuộc gọi sẽ kết thúc cố gắng viết một địa chỉ trả về không chính xác vào ngăn xếp, dẫn đến lỗi.

+0

Hoàn hảo, cảm ơn bạn :) –

0

những gì bạn muốn làm là sử dụng các mã xoay bit để xoay qua từng vị trí bộ nhớ 32 bit, đặt 8 bit tại một thời điểm vào thanh ghi cho đến khi bạn quay trở lại vị trí bit bắt đầu. bây giờ bạn nên có 4 số lượng 8 bit xếp hàng cạnh nhau trong thanh ghi 32 bit của bạn. bây giờ đẩy nó vào ngăn xếp và bạn đã hoàn tất.

+0

Xin lỗi, điều đó không có ý nghĩa với tôi. –

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