2008-08-20 36 views
5

Đây là câu hỏi hệ thống cấp thấp.Trộn mã 32 bit và 16 bit với nasm

Tôi cần kết hợp mã 32 bit và 16 bit vì tôi đang cố gắng quay lại chế độ thực từ chế độ được bảo vệ. Như một chút thông tin cơ bản, mã của tôi đang làm điều này ngay sau khi GRUB khởi động nên tôi không có bất kỳ hệ điều hành pesky nào để cho tôi biết những gì tôi có thể và không thể làm được.

Dù sao, tôi sử dụng [BITS 32] và [BITS 16] với bộ phận của mình để nói rõ loại hoạt động nào nên sử dụng, nhưng khi tôi kiểm tra mã của tôi, nó giống như một số hoạt động thực thi mã mà tôi đã viết. Có vẻ như người lắp ráp đang gắn bó vào các chi tiết bổ sung 0x660x67 gây nhầm lẫn cho boch.

Vì vậy, làm cách nào để tôi thu hút thành công khi lắp ráp mã nơi tôi kết hợp mã 32 bit và 16 bit trong cùng một tệp? Có loại lừa nào không?

Trả lời

0

Bạn không đùa về mức độ thấp này!

Bạn đã kiểm tra các opcodes/toán hạng đã tạo để đảm bảo rằng nasm đang tôn trọng chỉ thị BITS của bạn một cách chính xác? Ngoài ra kiểm tra để đảm bảo rằng các mục tiêu nhảy là chính xác - có thể nasm đang sử dụng sai lệch.

Nếu nó không phải là một lỗi trong cơn co thắt, có thể có một lỗi trong bochs. Tôi không thể tưởng tượng rằng mọi người chuyển trở lại chế độ 16 bit từ chế độ 32 bit một cách thường xuyên nữa.

3

0x66 và 0x67 là các opcodes được sử dụng để chỉ ra rằng opcode sau đây nên được hiểu là bit không mặc định. Cụ thể hơn, (và theo số this link),

"Khi NASM ở chế độ BITS 16, hướng dẫn sử dụng dữ liệu 32 bit có tiền tố 0x66 byte và các tham chiếu đến địa chỉ 32 bit có tiền tố 0x67. Trong chế độ BITS 32, ngược lại là đúng: các lệnh 32 bit không yêu cầu tiền tố, trong khi các lệnh sử dụng dữ liệu 16 bit cần 0x66 và các lệnh làm việc trên các địa chỉ 16 bit cần 0x67. "

Điều này cho thấy rằng bo mạch bị lỗi.

0

Nếu bạn đang ở chế độ thực, kích thước mặc định của bạn hoàn toàn là 16 bit, vì vậy bạn nên sử dụng chế độ BITS 16. Bằng cách này, nếu bạn cần kích thước toán hạng 32 bit, bạn thêm tiền tố 0x66 và đối với kích thước địa chỉ 32 bit, bạn thêm tiền tố 0x67.

Nhìn vào hướng dẫn Intel IA-32 phát triển phần mềm của, Tập 3, Chương 16 (TRỘN 16-bit và 32-BIT MÃ; số chương có thể thay đổi theo phiên bản của cuốn sách):

Chế độ địa chỉ thực, chế độ ảo 8086 và SMM là các chế độ 16 bit gốc.

Chỉ thị BITS 32 sẽ chỉ gây nhầm lẫn cho trình kết hợp nếu bạn sử dụng nó ngoài Chế độ được bảo vệ hoặc Chế độ dài.

6

Vấn đề hóa ra là tôi không thiết lập bảng mô tả chính xác. Tôi đã có một chút lộn sai vì vậy thay vì đi đến chế độ 16-bit, tôi đã đi đến chế độ 32-bit (với các phân đoạn đã xảy ra để có một giới hạn của một meg).

Cảm ơn bạn đã đề xuất!

Terry

+1

Gợi ý: chấp nhận câu trả lời của riêng bạn khi điều này xảy ra. – Joshua