Ngôn ngữ máy

Bách khoa toàn thư mở Wikipedia
Bước tới: menu, tìm kiếm

Ngôn ngữ máy (còn được gọi máy ngữ hay mã máy; tiếng Anhmachine language hay machine code) là một loại ngôn ngữ lập trình trong đó, mọi chỉ thị đều được biểu diễn bằng các con số nhị phân 0 và 1. Đây là ngôn ngữ lập trình thế hệ đầu tiên. Tuy khó đọc và khó sử dụng, nhưng ngôn ngữ máy là ngôn ngữ duy nhất mà bộ vi xử lí có thể nhận biết và thực hiện một cách trực tiếp (tức không cần dịch sang bất kì ngôn ngữ nào khác). Lợi điểm chính của các chương trình viết bằng ngôn ngữ máy là có thể được thực thi một cách nhanh chóng (nhờ vi xử lí có thể xử lí các chỉ thị viết bằng ngôn ngữ máy một cách trực tiếp), dù vậy, nó lại không độc lập nền (platform-independent) – tức khi đem qua một máy có loại vi xử lí khác, chương trình có thể không thực thi được, do vi xử lí khác loại có thể có các tập lệnh khác.

Chương trình[sửa | sửa mã nguồn]

Chương trình máy tính thực chất chỉ là một chuỗi những chỉ thị viết bằng mã máy được thực thi bởi CPU. Trong khi một số vi xử lí đơn giản thực thi lần lượt các chỉ thị, vi xử lí đa luồng có khả năng thực thi đồng loạt nhiều chỉ thị.

Mạch chạy của chương trình chịu ảnh hưởng của những chỉ thị "nhảy" đặc biệt có khả năng thay đổi tiến trình đến một chỉ thị khác với chỉ thị có thứ tự sau đó. Những bước nhảy điều kiện được thực thi hay không là tùy thuộc vào các trạng thái nhất định.

Hợp ngữ[sửa | sửa mã nguồn]

Hợp ngữ, một phiên bản gần hơn với ngôn ngữ tự nhiên của ngôn ngữ máy, sử dụng những kí hiệu dễ nhớ để thể hiện các chỉ thị mã máy, thay vì sử dụng trực tiếp các chuỗi nhị phân. Thí dụ, trên vi xử lí Zilog Z80, mã nhị phân 00000101 , dùng để giảm giá trị của thanh ghi B của vi xử lí, được viết bằng hợp ngữ như sau DEC.

Thí dụ[sửa | sửa mã nguồn]

Kiến trúc MIPS là một ví dụ điển hình cho ngôn ngữ máy có chỉ thị dài 32 bits. Những chỉ thị này được tạo bởi những vùng toán tử, dài nhất là 6 bits. Chỉ thị loại J (J-type) và loại I (I-type) được đặc trưng hoàn toàn bởi toán tử. Chỉ thị loại R (R-type) thì có thêm vùng hàm để quyết định toán tử chính xác. Những vùng được sử dụng trong các loại này gồm:

   6      5     5     5     5      6 bits
[  op  |  rs |  rt |  rd |shamt| funct]  R-type
[  op  |  rs |  rt | address/immediate]  I-type
[  op  |        target address        ]  J-type

rs, rt, and rd là những toán hạng thanh ghi; shamp chỉ lượng dịch chuyển; và vùng địa chỉ hay tức thì chứa trực tiếp toán hạng.

Ví dụ, dưới đây là đoạn mã có chức năng cộng giá trị ở thanh ghi 1 và 2, sau đó lưu vào thanh ghi 6:

[  op  |  rs |  rt |  rd |shamt| funct]
    0     1     2     6     0     32     decimal
 000000 00001 00010 00110 00000 100000   binary

Ghi giá trị vào thanh ghi 8, giá trị này được lấy từ ô vùng nhớ có vị trí ở sau 68 ô so với vị trí được lưu trong thanh ghi 3:

[  op  |  rs |  rt | address/immediate]
   35     3     8           68           decimal
 100011 00011 01000 00000 00001 000100   binary

Nhảy đến địa chỉ 1024:

[  op  |        target address        ]
    2                 1024               decimal
 000010 00000 00000 00000 10000 000000   binary

Mối quan hệ giữa ngôn ngữ máy và vi mã[sửa | sửa mã nguồn]

Trong một số Kiến trúc máy tính, ngôn ngữ máy được cài đặt bởi một lớp chương trình cơ sở hơn ở dưới nó, gọi là vi chương trình (microprogram). Vi chương trình tạo một giao diện ngôn ngữ máy thống nhất giữa các mô hình máy tính khác nhau, với những mạch xử lí dữ liệu khác nhau, trong cùng một dòng hay họ. Điều này đã giúp việc chuyển chương trình mã máy qua các mô hình máy tính khác nhau dễ dàng hơn rất nhiều. Họ máy tính và vi xử lí IBM System/360 là một ví dụ điển hình. Mặc dù dòng xử lí dữ liệu có độ lớn khác nhau, từ 8 bits đến lớn hơn 16 bits, nhưng tất cả máy tính thuộc cùng một dòng đều sử dụng một kiến trúc máy tính thống nhất ở mức độ ngôn ngữ máy.

Ngoài ra, việc sử dụng vi mã (microcode) để cài đặt giả lập cho phép một máy tính sao chép kiến trúc của một máy tính hoàn toàn khác. Nhờ đó, dòng System/360 có thể chạy chương trình của những máy tính IBM đời cũ đến cả những họ máy tính đời mới, như giả lập IBM 1401/1440/1460 trên máy tính IBM S/360 mẫu 40.

Mối quan hệ giữa ngôn ngữ máy và mã đối tượng[sửa | sửa mã nguồn]

Ngôn ngữ máy hoàn toàn khác với mã đối tượng (bytecode), một loại mã được thực thi bởi Trình thông dịch, hay được biên dịch thành ngôn ngữ máy nhằm mục đích tối ưu tốc độ chương trình. Ngoài ra, ngôn ngữ máy và hợp ngữ thường được gọi là mã riêng (native code) khi nói về các thành phần phụ thuộc vào Hệ điều hành của một đặc điểm ngôn ngữ hay thư viện.

Phương thức lưu trữ trong bộ nhớ[sửa | sửa mã nguồn]

Kiến trúc Harvard là kiến trúc máy tính có các bộ nhớ riêng lẻ và các đường tín hiệu cho mã (chỉ thị) và dữ liệu. Ngày nay, phần lớn vi xử lý được cài đặt như là những đường tín hiệu để cải thiện hiệu năng (thật ra là kiến trúc Modified Harvard), nhờ đó chúng có thể hỗ trợ các thao tác như tải chương trình từ ổ cứng giống như dữ liệu và thực thi nó. Kiến trúc Harvard trái ngược hoàn toàn so với kiến trúc Von Neumann: dữ liệu và mã được lưu vào cùng bộ nhớ, và vi xử lý đọc chúng giúp máy tính thực thi các lệnh.

Nhìn dưới góc độ của một tiến trình, không gian chứa mã là một phần không gian địa chỉ của tiến trình lưu trữ các mã đang thực thi. Trong các hệ thống đa nhiệm, nơi này gồm có các đoạn mã của chương trình và (thường xuyên) các thư viện được chia sẻ. Trong môi trường đa luồng ,các luồng khác nhau của một tiến trình chia sẻ không gian chứa mã cùng với không gian chứa dữ liệu, nhờ đó giảm được phí tổn của việc chuyển ngữ cảnh khá nhiều so với việc chuyển tiến trình.

Khả năng đọc hiểu ngôn ngữ máy của con người[sửa | sửa mã nguồn]

Ngôn ngữ máy khó đọc đến mức tổ chức United States Copyright Office không thể khẳng định một phần mềm đã mã hóa có phải là sản phẩm gốc của một tác giả hay không. Tuy nhiên, tổ chức này lại cho phép đăng kí bản quyền các chương trình máy tính. Hofstadter từng so sánh mã máy với mã gen: "Nhìn vào một chương trình viết bằng mã máy không khác gì với việc nhìn vào các phân tử DNA của lần lượt từng nguyên tử."

Xem thêm[sửa | sửa mã nguồn]

Tham khảo[sửa | sửa mã nguồn]