2008-10-22 47 views
12

Tôi đang làm việc trên một dự án hệ thống nhúng và đã chạy vào một vấn đề của trình biên dịch được lập trình nhúng trong IDE Paradigm C++. Tôi muốn có thể tự động hóa tòa nhà.Tìm trình biên dịch 16 bit x86

Bộ xử lý là AMD186ES. Tôi không làm việc với hệ điều hành - chỉ là công cụ thanh lọc. Tôi cần tạo mã máy 8086 chế độ thực 8086 từ C++.

Googling của tôi cho biết G + + có thể tạo mã như vậy.

Câu hỏi của tôi là:

Có thể định cấu hình g ++ để tạo mã máy này không?

Có trình biên dịch C++ nào khác có thể làm điều đó không?

+1

thấy [Có một trình biên dịch C nhắm mục tiêu 8086?] (Http://stackoverflow.com/q/4493035/309483) –

Trả lời

3

Tôi hiện đang sử dụng gnu as (một phần của binutils và lắp ráp sử dụng cho gcc) và tôi đã thành công được lắp ráp lắp ráp mã 16bit như sau:

as <file> 
ld --oformat binary -Ttext 0x0 -e start <file> 

với các tập tin lắp ráp của tôi bắt đầu với:

.code16 
.globl start 
.text 
start: 

kể từ nhị phân đơn giản của nó bỏ qua dòng,

.globl start 
start: 

đơn giản sẽ mang lại một cảnh báo, mặc dù mã nhị phân phẳng cần có điểm nhập cảnh.


điều gì đó tôi đã học được một cách khó khăn;

-Ttext 0x0 

là rất quan trọng, nếu không thì phân khúc .text được đẩy bên ngoài của 16bit giải quyết nhiều (đừng hỏi tôi tại sao)

Tôi cá nhân vẫn đang học lắp ráp, vì vậy đây chỉ là cách của tôi, không nhất thiết phải là cách tốt nhất.


EDIT: Nếu bạn đang viết mã khởi động, bạn nên thay đổi

-Ttext 0x0 

để

-Ttext 0x7c00 

này sẽ bù đắp các địa chỉ bộ nhớ của bạn bằng cách 0x7c00 từ mã khởi động thường được nạp tại 0x7c00 bởi BIOS.

+0

Thú vị. Liệu/có thể tạo ra các tập tin elf, tập tin a.out, hay chúng bị tước xuống một nhị phân không có hệ điều hành? –

+0

@paulNathan 'ld --oformat nhị phân -Text 0x0 -e bắt đầu ' tách nó xuống thành nhị phân không có os; ** Tuy nhiên **, địa chỉ bộ nhớ cơ sở này tại '0x0000' nếu bạn đang viết mã khởi động, thay đổi' -Text 0x0000' thành '-Textext 0x7c00' vì đây là nơi mã khởi động được nạp vào bộ nhớ. – Hawken

+0

Tôi đã khai thác câu trả lời này là * câu trả lời *, vì tôi nghĩ rằng bất kỳ cửa hàng nào quan tâm đến công cụ này đều có thể tìm ra đường dẫn 'C++ -> asm' với gcc khá dễ dàng. –

10

Đặt cược tốt nhất của bạn có lẽ là OpenWatcom, bao gồm trình biên dịch C++. Quay lại đầu những năm 90, tôi tin rằng đây là trình biên dịch C/C++ tốt nhất xung quanh. Nó đã được mở nguồn từ vài năm trước.

+0

IIRC, Watcom spits ra weird.objs.Nếu đó không phải là sự thật của OpenWatcom, nó có lẽ là sự lựa chọn tốt nhất của bạn do cho tất cả các điều khiển nó cung cấp cho bạn trên generati mã trên – JimR

+0

@JimR: đó là định dạng OMF, không phải là chúng tôi mệt mỏi. – albert

+0

@JimR: Vâng, tôi nghĩ MS> các công cụ 16 bit chỉ đơn thuần là sử dụng COFF/** ar ** cho các tệp '.obj' và' .lib'; các công cụ DOS-family khác dường như thường sử dụng OMF (Borland, Watcom, Digital Mars, MS cho mã 16 bit, ...), hoặc đặt tên cho các tệp khác, như '.o' và' .a' (GNU toolchain, và có lẽ bất kỳ người nào khác đến từ * nix-land). Dự án NT dường như đã chọn công nghệ * nix này (các đối tượng COFF và lưu trữ ** ar **) khi chúng phát triển NT từ các máy chủ * nix, nhưng vẫn giữ các phần mở rộng tệp DOS truyền thống. – SamB

7

Nhà cung cấp chip của bạn (AMD, tôi đoán) có bất kỳ gợi ý nào cho trình biên dịch cho chip không?

Nếu không, bạn có thể sử dụng một số 16-bit trình biên dịch DOS - nhưng bạn sẽ phải một số vấn đề lớn tiềm năng:

  1. nhận được một thư viện cho các trình biên dịch mà không phụ thuộc vào BIOS hoặc MS-DOS
  2. gỡ lỗi
  3. liên kết cho các hệ thống nhúng thường có hỗ trợ cụ thể cho việc định vị mã trong các vùng bộ nhớ cụ thể. Đó không phải là thường được bao gồm trong trình biên dịch cho DOS, nhưng bạn có thể tìm thấy một số loại linker/locator mà sẽ làm các trick cho bạn.

Một vài trình biên dịch mà vẫn được hỗ trợ và tạo mã 16-bit là:

7

This google search cho thấy một loạt các liên kết để cài đặt gcc lên như một trình biên dịch chéo. Để làm cho nó nhắm mục tiêu cái gì đó khác hơn là một nhị phân ELF chuẩn, bạn có thể đóng đầu ra. This link thảo luận về việc loại trừ các thư viện chuẩn và tùy chỉnh định dạng đầu ra. Bạn có thể phải làm một số không quan trọng để làm cho nó hoạt động.

Cách thay thế openwatcom.org có phiên bản mã nguồn mở của trình biên dịch Watcom C, cũng có thể làm được những gì bạn muốn.

+1

liên kết tuyệt vời (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html) có vẻ như một cái gì đó tôi sẽ viết. "inc% upvote' – Hawken

1

Không chắc chắn nhưng tôi nghĩ phiên bản cũ của borland C++ đã có thể thực hiện điều đó. bạn có thể tải xuống phiên bản 5.5 t: here chúc may mắn

+0

Vấn đề là OP" không hoạt động với hệ điều hành - chỉ là nội dung từ xa "và tôi không chắc chắn nếu Borland C hoặc Turbo C có thể phát mã mã trần không dành cho MSDOS hay không –

+0

Có, Borit C và C++ phát ra mã có thể sử dụng trên thanh 8086 và 80186. Mô hình được cấp phép và cải thiện các trình biên dịch Borland và gói này với hỗ trợ các loại bao gồm thư viện và Định vị mô hình (yêu cầu bản đồ đầu ra liên kết thành hình ảnh hex có thể tải). –

+0

5.5 chỉ tạo mã 32 bit ☹ – mirabilos

0

Đã lâu rồi tôi chưa xem xét công cụ Paradigm (chúng vẫn còn ở đó không?) - bạn có chắc là chúng không có dòng lệnh không tương đương cho trình biên dịch?Nhớ lại của tôi là chúng được xây dựng trên đầu trang của chuỗi công cụ biên dịch của Borland ... Vậy có lẽ một bản sao cũ của trình biên dịch Borland có thể thực hiện thủ thuật?

- Ah, nhìn xa hơn một chút, tôi thấy rằng Paradigm vẫn còn xung quanh (www.devtools.com) bán các công cụ X86. (Phải là một con bò tiền mặt!)

Sản phẩm chuyên nghiệp của họ bao gồm tập lệnh ... Tùy thuộc vào số lượng công việc bạn dự định làm, nó chỉ có thể đáng để cắn viên đạn và mua ... Đầy đủ

Chúc may mắn.

+0

Tôi đã được đưa ra phiên bản "lite" với bảng nhúng của mình. Bằng cách nào đó Paradigm đã nhúng trình biên dịch vào tệp thực thi IDE. –

4

Có một bản vá cho GCC 4.3: New back end ia16: 16-bit Intel x86

here's an update for it. Lưu ý rằng nó có thể không hoạt động rất tốt, ví dụ, bài cập nhật cho biết: "Constructors và destructors bây giờ được hỗ trợ, nhưng vì lý do nào đó chúng chỉ hoạt động trên cấu hình elks."

Docker này chứa có một xây dựng của nó: https://registry.hub.docker.com/u/ysangkok/ia16-gcc-rask

tôi không quản lý để làm cho hệ điều hành DOS binary nào:. How do I assemble GAS assembly and link it with the Open Watcom C library?

+0

Nice - giải pháp hoàn chỉnh hơn nhiều so với câu trả lời được chấp nhận! –

3

Gần đây nhất theo năm 2014 là Dev86

+0

Huh! Hấp dẫn. Có một upvote! –

+0

Nhưng 8086 có quá cũ không? Hỗ trợ cho 80186, 80286 hoặc cao hơn là tốt hơn. Họ có một số hướng dẫn hữu ích hơn –

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