2011-08-02 23 views
5

Tôi đang bối rối về một vấn đề lắp ráp đơn giản khi nghiên cứu một số mã nguồn os đơn giản.Có thể sử dụng thanh ghi/hướng dẫn 32 bit ở chế độ thực không?

Trong trang web này: http://wiki.osdev.org/Babystep7 đoạn mã sau là để chuyển từ chế độ thực sang chế độ bảo vệ

mov eax, cr0 
or al,1 
mov cr0, eax 

tôi biết làm thế nào để chuyển đổi từ chế độ thực sang chế độ bảo vệ.
Nhưng câu hỏi của tôi là vì chương trình vẫn đang ở chế độ thực, làm thế nào nó có thể sử dụng thanh ghi 32 bit hoặc hướng dẫn?

Có thể sử dụng thanh ghi/hướng dẫn 32 bit ở chế độ thực không?

+1

Tôi nghĩ bạn cũng cần xóa trình tìm nạp trước (thường với jmp đến vị trí bộ nhớ tiếp theo). –

Trả lời

4

Khi bộ xử lý hoạt động ở chế độ thực (vì nó ngay lập tức sau khi khởi động), nó mặc định là mã 16 bit. Tuy nhiên, điều này không không có nghĩa là bạn không thể sử dụng hướng dẫn 32 bit.

Có tiền tố "ghi đè kích thước toán hạng" (66h) thay đổi chế độ mặc định cho một lệnh. Khi tiền tố này được sử dụng với lệnh được thực hiện ở chế độ thực 16 bit, nó sẽ chuyển lệnh sang 32-bit. Ngược lại, khi tiền tố này được sử dụng với lệnh được thực hiện trong chế độ được bảo vệ 32 bit, nó sẽ chuyển lệnh thành 16 bit. (Tiền tố tương tự, 67h, hoạt động để ghi đè kích thước địa chỉ.)

Sử dụng tiền tố này, cho phép bạn sử dụng thanh ghi 32 bit ở chế độ thực 16 bit. Trình biên dịch của bạn gần như chắc chắn sẽ tự động phát ra tiền tố này khi bạn thử và sử dụng các toán hạng 32 bit với một lệnh khi lắp ráp mã 16 bit.

Thật không may, không có tiền tố ghi đè như vậy cho các hướng dẫn 64 bit, vì vậy chúng không thể được sử dụng ở chế độ thực. Bạn cần phải chuyển sang "chế độ dài" để cho phép những điều này.

+0

cảm ơn bạn, điều này giải quyết vấn đề của tôi – mike820324

+0

Bạn có thể sử dụng thanh ghi 64 bit ở chế độ thực không? –

4

Theo tôi hiểu, chế độ thực không ảnh hưởng đến các lệnh bạn có thể chạy trên CPU, nhưng nó ảnh hưởng đến cách các lệnh tham chiếu bộ nhớ CPU được diễn giải.

Vì vậy, có, bạn có thể sử dụng eax, nhưng bạn sẽ không thể nhận được ô bộ nhớ [eax].

Xem phần liên quan trong Intel's Manual.

+0

Tôi tin rằng "... nhưng bạn sẽ không thể nhận được ô nhớ [eax]." là không đúng sự thật. Sự hiểu biết của tôi là ở chế độ thực, nếu giá trị của eax nhỏ hơn hoặc bằng 0x0000FFFF, thì [eax] là một truy cập hoàn toàn hợp lệ. Giá trị lớn hơn của eax sẽ tạo ra lỗi bảo vệ khi bạn cố gắng truy cập [eax] (mặc dù đáng chú ý [ax] không cần tạo ra lỗi bảo vệ nếu [eax] sẽ). – Orby

0

Theo như tôi biết, ở chế độ thực, bạn không thể sử dụng thanh ghi 32 bit. Trong thanh ghi điều khiển 32 bit CR0, chế độ thực và chế độ được bảo vệ được xác định bằng cách xem bit đầu tiên của CR0 (PE) .Trong mã này, bạn thay đổi PE ở dòng cuối cùng (mov cr0, eax). Tôi đoán, sau dòng này, bạn không thể sử dụng tài liệu tham khảo đăng ký 32 bit nữa.

+1

Điều này không đúng, bạn có thể sử dụng tiền tố 0x66 để truy cập thanh ghi 32 bit ở chế độ 16 bit/thực. –

0

Để đơn giản giải quyết các toán hạng và tiền tố kích thước lệnh hoạt động rất tốt. Ứng dụng chế độ bảo vệ 16 bit (initally real) mà tôi từng viết cho Windows (3.1 và sau đó là 9x) có thể cấp phát> 64K vùng bộ nhớ bằng cách sử dụng API bộ nhớ Windows và câu hỏi là cách sử dụng nó. Trong mọi trường hợp sử dụng con trỏ (xa) thunking và các tiền tố đề cập đến ứng dụng của tôi đã sử dụng tốt các khu vực 40MB mặc dù nó chạy ở chế độ 16 bit.

Nếu bạn thử một cái gì đó tương tự hãy nhớ rằng tiền tố kích thước lệnh cho phép tập lệnh 32 bit không tương thích với 16-bit. 16-bit thường không quan tâm nếu bạn đang ở chế độ thực hoặc được bảo vệ trừ khi bạn đang làm số học phân đoạn. Vì vậy, bạn cần phải mã tay (ít nhất là tôi đã làm) các hoạt động 32-bit sử dụng phát ra bởi vì trình biên dịch của bạn có thể sẽ không tạo ra chúng mà không hét lên giết người đẫm máu.

0

Có tồn tại chế độ thực 32 bit, nó được gọi là unreal mode. Quay lại trong những lần nó được sử dụng để truy cập vào toàn bộ không gian địa chỉ mà không gặp rắc rối khi sử dụng bộ chọn và toàn bộ chế độ được bảo vệ.

0

Bạn có thể sử dụng LoadAll opcode 0F07h cho phép bạn truy cập 32 bit ở chế độ thực 16 bit.

+0

Mã opcode này gần như không có giấy tờ và trên hầu hết các CPU hiện đại, ngữ nghĩa mã hóa của nó đã bị thay thế bởi lệnh 'sysret'. – minmaxavg

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