Như tôi đã hiểu, mã C được biên dịch thành mã máy (lắp ráp) trên máy của ai đó và nó trở thành tệp exe có thể chạy trên nhiều bộ xử lý (máy) khác nhau. Nhưng kể từ khi bộ vi xử lý khác nhau có mã lắp ráp duy nhất của riêng mình như thế nào có thể mã này chạy? Không exe biên dịch chỉ có thể chạy trên một loại bộ vi xử lý?Mã C có thể chạy trên các bộ vi xử lý khác nhau như thế nào?
Trả lời
Khi bạn biên dịch chương trình thành mã máy, bạn phải chọn bộ chỉ dẫn mã máy, có thể là chế độ để chạy máy (nếu có) và định dạng mã được lưu trữ.
Tất cả các lựa chọn đó giới hạn nền tảng đích mà mã có thể được thực thi.
Các hướng dẫn thiết lập rộng rãi phụ thuộc vào loại CPU: x86 ("IBM tương thích"), PowerPC, ARM, MIPS, DEC Alpha, Motorola 68k, ... Trong mỗi gia đình CPU, có rất nhiều các tính năng phụ và các thế hệ để lựa chọn (ví dụ cho x86, có i386, SSE, AVX, ...). CPU mới hơn có thể thực thi mã giới hạn cho các thế hệ cũ hơn, do đó có thể có một tập con chung.
Chế độ bộ xử lý trên x86 tùy thuộc vào môi trường: chế độ thực cho các chương trình MS-DOS và bất cứ thứ gì bạn chạy khi khởi động, chế độ được bảo vệ, các chế độ địa chỉ khác nhau có thể có sẵn trong một số trường hợp (chế độ không thực) ...
Định dạng nhị phân cần phải được hệ điều hành nhận dạng, hoặc thường là bằng cơ chế tải bao giờ bạn có: PE cho Windows, ELF cho Linux hiện đại, a.out trong những ngày cũ, ... hệ thống có thể cung cấp bộ nạp cho nhiều định dạng nhị phân.
Đây là cấp cơ bản nhất của thông số nền tảng bạn chọn khi biên dịch và chương trình của bạn sẽ chỉ chạy trên nền tảng đồng ý về lựa chọn này. Tuy nhiên, có nhiều hạn chế thực tế hơn đối với các chương trình trong thế giới thực, chẳng hạn như giao diện hệ điều hành và tính khả dụng của các thư viện khung, cũng cần phải khớp. Ví dụ, trong khi nó không khó để đọc và chạy Windows PE nhị phân trong Linux, mã chứa trong đó không có ý nghĩa trên Linux bởi vì nó sử dụng Windows phần mềm cụ thể ngắt. Tuy nhiên, bằng cách chặn và dịch những người đó, hoàn toàn có thể chạy những tệp nhị phân đó trên Linux sau tất cả.
Ngoài ra, (cụ thể) định dạng tệp PE chứa một trường rõ ràng ** nêu rõ ** CPU là gì cho: "' Máy' CPU mà tệp này dành cho. Các ID CPU sau được xác định: .. . "(https://msdn.microsoft.com/en-us/library/ms809762.aspx). – usr2564301
_ "giao diện hệ điều hành và tính sẵn có của thư viện khung, cũng cần phải khớp" _ Tôi nghĩ đó là điều quan trọng cần xem xét ở đây (cho OP): Mặc dù hầu hết các máy tính đều sử dụng CPU x86 và (rộng rãi) nói cùng một ngôn ngữ, nó thường là hệ điều hành là yếu tố quyết định trong tính di động của các chương trình được biên dịch. Cửa sổ exe không thể chạy trên OSX, hoặc linux mà không có loại giả lập hoặc phiên dịch/thời gian chạy ở giữa (giống như Java được biên dịch để chạy trên JVM, không trực tiếp trên phần cứng) –
@EliasVanOotegem: Có. Ví dụ, Wine chặn các cuộc gọi hệ thống Windows và cung cấp và triển khai thích hợp trên Linux, và gửi các thư viện Windows lõi (được cài đặt cho Linux), để bạn có thể chạy nhiều chương trình Windows trên Linux. (Tôi tưởng tượng nó có thể làm tương tự trên MacOS và BSD?) –
- 1. Chạy mã Python trong các bộ vi xử lý khác nhau
- 2. Có thể tính điểm nổi khác nhau trên các bộ vi xử lý khác nhau không? (+ chuyển đôi giữa C# và C)
- 3. Các ngắt được xử lý như thế nào trên SMP?
- 4. Bộ vi xử lý Intel và AMD có cùng bộ xử lý không?
- 5. OpenMP xử lý các vòng lồng nhau như thế nào?
- 6. ngModel - Cách xử lý hành vi khác nhau của nó trong các trình duyệt khác nhau?
- 7. Cách xử lý các thực thể thuộc tính khác nhau cho các thực thể khác nhau
- 8. Docker có thể chạy distro với các hạt nhân khác nhau như thế nào?
- 9. Các biến cục bộ được xử lý như thế nào khi được tham chiếu trong phạm vi khác?
- 10. Trình biên dịch C/C++ xử lý việc nhập kiểu giữa các kiểu với các phạm vi giá trị khác nhau như thế nào?
- 11. Angularjs xử lý việc quản lý bộ nhớ bằng ngView như thế nào?
- 12. Các ngắt bị xử lý bởi các máy xử lý kép như thế nào?
- 13. Danh sách và bộ xử lý hoạt động khác nhau
- 14. Máy tính xử lý ascii/text & images/color khác nhau như thế nào?
- 15. Mã C# để xử lý các lớp khác nhau với cùng tên phương thức
- 16. Độ tin cậy bộ vi xử lý
- 17. Bạn xử lý mã lỗi LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED như thế nào?
- 18. Mã máy thực tế trông như thế nào ở các điểm khác nhau?
- 19. Làm thế nào bạn có thể tìm thấy số bộ xử lý mà một chuỗi đang chạy?
- 20. Tôi có thể xử lý các phụ thuộc mẫu trong Bộ công cụ mẫu như thế nào?
- 21. Đếm bộ vi xử lý sử dụng C++ trong Windows
- 22. Các phân đoạn khác nhau như heap, stack, text liên quan đến bộ nhớ vật lý như thế nào?
- 23. Làm thế nào tôi có thể thấy đầu ra của bộ tiền xử lý Visual C++?
- 24. Làm thế nào để bộ tiền xử lý C thực thi mã trong khi biên dịch?
- 25. CPUID trên bộ vi xử lý Intel i7
- 26. Lý do của các khoảng thời gian khác nhau của các khối mã thực thi như thế nào?
- 27. JSPM xử lý các tệp CSS như thế nào?
- 28. Chạy trình mô phỏng Android trên máy tính với bộ vi xử lý AMD
- 29. các tham chiếu đối tượng C# được thể hiện như thế nào trong bộ nhớ/thời gian chạy (trong CLR)?
- 30. Cách chạy mã sau khi tất cả các sự kiện khác đã được xử lý
Nhiều mô hình bộ vi xử lý khác nhau có thể là một phần của cùng một "gia đình" và chia sẻ cùng một ngôn ngữ máy. –
Nó giống như cách mà cùng một loại xăng có thể được sử dụng trong nhiều, nhưng không phải tất cả, xe hơi, mặc dù mỗi chiếc xe đều có động cơ riêng. –
Nhưng không thể tệp exe có thể chạy trên tất cả các máy cửa sổ, ngay cả khi chúng có bộ xử lý hoàn toàn khác nhau. – Melkor