Tại sao DOS đặt thanh ghi SP thành 0xFFFE sau khi tải tệp .COM?


10

Trên trang wikpedia về các tệp .COM https://en.wikipedia.org/wiki/COM_file nó đọc:

Các tệp .COM trong DOS đặt tất cả các thanh ghi phân đoạn x86 về cùng một giá trị và thanh ghi SP (con trỏ ngăn xếp) thành 0xFFFE, do đó ngăn xếp bắt đầu ở đầu phân đoạn bộ nhớ và hoạt động từ đó.

Nhưng điều này thực sự đặt ngăn xếp để bắt đầu một từ bên dưới đầu phân khúc. Khi đẩy một giá trị trên ngăn xếp, CPU sẽ giảm SP xuống 0xFFFC và lưu trữ giá trị ở đó, do đó làm lãng phí từ trên cùng của phân đoạn. Lý do nào khiến DOS không đặt SP thành 0 thay vào đó?


6
DOS lưu trữ một con trỏ tới một int 20hlệnh ở đó để bạn có thể thoát khỏi chương trình của mình bằng cách phát retlệnh.
fuz

Câu trả lời:


16

Điều này là để tương thích với CP / M.

Trong CP / M, bạn có thể chỉ cần quay lại từ chương trình của mình bằng cách sử dụng retvà chương trình của bạn sẽ thoát hoàn toàn. Điều này đã đạt được bằng cách có một 0x0000ở đầu ngăn xếp và có một int 20hhướng dẫn tại địa chỉ 0x0000. Mặc dù int 20hlà cách chính thức để thoát khỏi chương trình của DOS, tùy chọn thoát khỏi chương trình sử dụng call 0được giữ từ CP / M và phạm vi ngoài cùng cũng rethoạt động tương tự kể từ khi nó quay trở lại 0.

Để có 0x0000từ đó ở đầu ngăn xếp, rõ ràng bạn cần bắt đầu ngăn xếp có thể sử dụng 2 byte xuống dưới. Đó là lý do SPban đầu 0xFFFE, chỉ vào 0x0000từ đó lần lượt chỉ vào int 20hhướng dẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.