Tôi đang viết chức năng chế độ thực, nên là hàm bình thường với các khung xếp chồng và vì vậy, nhưng nên sử dụng% sp thay vì% esp. Có cách nào để làm điều đó không?Làm thế nào để yêu cầu GCC tạo mã 16 bit cho chế độ thực
Trả lời
Theo như tôi biết, GCC không hỗ trợ tạo mã cho x86 16 bit. Đối với các bộ tải khởi động kế thừa và các mục đích tương tự, bạn nên viết một sơ đồ nhỏ trong ngôn ngữ assembly để đặt cpu ở chế độ 32 bit và truyền thực thi sang mã 32 bit. Đối với các mục đích khác, bạn thực sự không nên viết mã 16 bit.
Bạn vui lòng giải thích nhiều hơn nữa. Điều gì về tùy chọn -m16? –
GCC không tạo mã 8086. Chỉ thị GNU AS .code16gcc
có thể được sử dụng để lắp ráp đầu ra của GCC để chạy ở chế độ 16 bit, đặt asm(".code16gcc")
vào đầu nguồn C của bạn, chương trình của bạn sẽ bị giới hạn ở 64Kibyte.
Tài liệu tại: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –
Sử dụng .code16gcc (Tôi vẫn không chắc chắn ai có thể gọi nó là tính năng ổn định) sẽ tạo mã chạy 16 bit chế độ thực, tuy nhiên nó sử dụng tiền tố hướng dẫn chỉ khả dụng trên 386+. Điều này có nghĩa là nếu bạn đang nhắm mục tiêu 8086/8088 (phần cứng hoặc trình giả lập thực) thì mã sẽ có khả năng không hoạt động đúng cách. Nếu bạn có ý định bootstrap vào chế độ bảo vệ 32 bit thì hãy viết một sơ đồ lắp ráp 16 bit nhỏ để thiết lập mọi thứ, đi vào chế độ được bảo vệ và sau đó gọi tới một hàm 32 bit "C" là khởi đầu chương trình của bạn. –
Tất nhiên, bạn có thể mã hóa bộ mã 16 bit bằng tay trong GCC như lắp ráp nội tuyến sử dụng lệnh __asm__. –
GCC 5.2.0 (và các phiên bản trước đó có thể) hỗ trợ tạo mã 16 bit với cờ -m16
. Tuy nhiên, mã sẽ gần như chắc chắn dựa vào các tính năng xử lý 32 bit (chẳng hạn như các thanh ghi rộng 32 bit), vì vậy bạn nên kiểm tra cẩn thận cụm được tạo.
Từ man
trang:
Tùy chọn -m16 cũng giống như -m32, ngoại trừ rằng nó sẽ tạo ra các ".code16gcc" chỉ thị lắp ráp vào đầu sản lượng lắp ráp sao cho nhị phân có thể chạy ở chế độ 16 bit.
Hệ điều hành nào được cho là chạy dưới? GCC không hỗ trợ MS-DOS. –