Ngôn ngữ máy (còn được gọi là máy ngữ hay mã máy; tiếng Anh là machine language hay machine code) là một tập các chỉ thị được CPU của máy tính trực tiếp thực thi. Mỗi chỉ thị thực hiện một chức năng xác định, ví dụ như tải dữ liệu, nhảy hay tính toán số nguyên trên một đơn vị dữ liệu của thanh ghi CPU hay bộ nhớ. Tất cả các chương trình được thực thi trực tiếp bởi CPU đều là các chuỗi các chỉ thị này.
Mã máy nhị phân ( khác với mã hợp ngữ ) hoàn toàn có thể được xem như thể phương pháp màn biểu diễn thấp nhất của một chương trình đã biên dịch hay hợp dịch, hay là ngôn ngữ lập trình nguyên thủy nhờ vào vào phần cứng ( ngôn ngữ lập trình thế hệ tiên phong ). Mặc dù tất cả chúng ta trọn vẹn hoàn toàn có thể viết chương trình trực tiếp bằng mã nhị phân, việc này rất khó khăn vất vả và dễ gây ra những lỗi nghiêm trọng vì ta cần phải quản trị từng bit đơn lẻ và thống kê giám sát những địa chỉ và hằng số học một cách bằng tay thủ công. Do đó, ngoại trừ những thao tác cần tối ưu và gỡ lỗi chuyên biệt, tất cả chúng ta rất hiếm khi làm điều này .Hiện nay, phần đông tổng thể những chương trình máy tính trong thực tiễn đều được viết bằng những ngôn ngữ bậc cao hay ( đôi lúc ) hợp ngữ, và sau đó được dịch thành mã máy thực thi bằng những công cụ phụ trợ như trình biên dịch, trình hợp dịch hay trình link. Ngoài ra, những chương trình được viết bằng ngôn ngữ thông dịch thì được dịch sang mã máy nhờ trình thông dịch tương ứng ( hoàn toàn có thể xem như thể trình thực thi hay trình giải quyết và xử lý ). Các trình thông dịch này thường gồm có những mã máy thực thi trực tiếp ( sinh ra từ mã nguồn hợp ngữ hay những ngôn ngữ bậc cao ) .
Các thông tư mã máy[sửa|sửa mã nguồn]
Mọi vi xử lý hay họ vi xử lý đều có những tập chỉ thị mã máy riêng biệt. Các chỉ thị này là các mẫu bit được thiết kế tương ứng với những lệnh khác nhau của máy tính. Do đó, những tập chỉ thị này là riêng biệt của một lớp vi xử lý thuộc cùng một kiến trúc máy tính. Những thiết kế vi xử lý kế thừa thường bao gồm các chỉ thị của vi xử lý tiền nhiệm cùng với các chỉ thị mới. Đôi khi, các thiết kế kế thừa lại loại bỏ hay thay đổi chức năng một số mã chỉ thị (vì chúng cần dùng cho mục đích mới), gây ảnh hưởng đến sự đồng bộ mã nguồn ở một mức độ nhất định. Thậm chí, các vi xử lý đồng bộ cận hoàn toàn cũng có những sự biến đổi hành vi đối với một số chỉ thị, nhưng điều này rất hiếm xảy ra. Các hệ thống còn có thể khác nhau ở một số thành phần khác như phương thức sắp xếp bộ nhớ, hệ điều hành hay thiết bị ngoại vi. Vì các chương trình hay phụ thuộc vào các yếu tố này, các hệ thống khác nhau khó có thể chạy cùng một mã máy, ngay cả khi chúng sử dụng cùng một loại vi xử lý.
Bạn đang đọc: Ngôn ngữ máy – Wikipedia tiếng Việt
Một tập chỉ thị có thể có độ dài chỉ thị thống nhất hay biến động. Cách các bit được sắp xếp thay đổi rất lớn giữa các kiến trúc khác nhau hay các loại chỉ thị khác nhau. Hầu hết các chỉ thị có một hay nhiều vùng mã vận hành để phân biệt các chỉ thị cơ sở (như tính toán hay nhảy) và các chỉ thị thực (như cộng hay so sánh), và các vùng khác biểu diễn loại toán hạng, phương thức biểu diễn địa chỉ, các chỉ số địa chỉ hay các giá trị thực (các toán hạng hằng được chứa trong chỉ thị như vậy được gọi là giá trị tức thời).
Không phải tổng thể những máy tính hay thông tư đơn lẻ đều có toán hạng hiện ( rõ ràng ). Một máy tính thanh chứa có sự tích hợp giữa toán hạng trái và tác dụng đo lường và thống kê lưu trong một thanh chứa ẩn so với hầu hết những thông tư đại số. Một số kiến trúc khác ( như 8086 hay x86 ) có phiên bản sử dụng thanh chứa của những thông tư thông dụng, và thanh chứa được xem như thể một trong những thanh ghi tổng quát nhất của thông tư dài. Trong khi đó, một máy tính ngăn xếp lại lưu hầu hết những toán hạng trong một ngăn xếp ẩn. Những thông tư chuyên biệt cũng thường thiếu toán tử hiện ( ví dụ, vi giải quyết và xử lý ID trong kiến trúc x86 ghi giá trị vào bốn thanh ghi khu vực ẩn ). Sự độc lạ giữa toán tử hiện và ẩn được cho phép sử dụng nhiều hơn hằng số có khoanh vùng phạm vi rộng, ‘ uốn nắn ‘ những thanh ghi liên tục ( lưu giá trị hằng số khác đè lên giá trị đã có của thanh ghi ) và rất nhiều ưu điểm tiêu biểu vượt trội khác .
Chương trình máy tính thực ra chỉ là một chuỗi những thông tư viết bằng mã máy được thực thi bởi CPU. Trong khi 1 số ít vi giải quyết và xử lý đơn thuần thực thi lần lượt những thông tư, vi giải quyết và xử lý đa luồng có năng lực thực thi hàng loạt nhiều thông tư .Mạch chạy của chương trình chịu ảnh hưởng tác động của những thông tư ” nhảy ” đặc biệt quan trọng có năng lực biến hóa tiến trình đến một thông tư khác với thông tư có thứ tự sau đó. Những bước nhảy điều kiện kèm theo được thực thi hay không là tùy thuộc vào những trạng thái nhất định .
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. Ví 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 B
.
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ó công dụ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ố ít Kiến trúc máy tính, ngôn ngữ máy được setup 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 những quy mô máy tính khác nhau, với những mạch giải quyết và xử lý tài 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 những quy mô máy tính khác nhau thuận tiện hơn rất nhiều. Họ máy tính và vi giải quyết và xử lý IBM System / 360 là một ví dụ nổi bật. Mặc dù dòng giải quyết và xử lý tài liệu có độ lớn khác nhau, từ 8 bits đến lớn hơn 16 bits, nhưng tổng thể 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 ) để setup giả lập được cho phép một máy tính sao chép kiến trúc của một máy tính trọn vẹn khác. Nhờ đó, dòng System / 360 hoàn toàn 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 người tiêu dù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 tàng 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ó những bộ nhớ riêng không liên quan gì đến nhau và những đường tín hiệu cho mã ( thông tư ) và tài liệu. Ngày nay, phần nhiều vi giải quyết và xử lý được setup như là những đường tín hiệu để cải tổ hiệu năng ( thật ra là kiến trúc Modified Harvard ), nhờ đó chúng hoàn toàn có thể tương hỗ những thao tác như tải chương trình từ ổ cứng giống như tài liệu và thực thi nó. Kiến trúc Harvard trái ngược trọn vẹn so với kiến trúc Von Neumann : tài liệu và mã được lưu vào cùng bộ nhớ, và vi giải quyết và xử lý đọc chúng giúp máy tính thực thi những 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 triển khai United States Copyright Office không hề khẳng định chắc chắn một ứng dụng đã mã hóa có phải là mẫu sản phẩm gốc của một tác giả hay không. Tuy nhiên, tổ chức triển khai này lại được cho phép ĐK bản quyền những 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 những phân tử DNA của lần lượt từng nguyên tử. ”
Source: https://tbdn.com.vn
Category: 1000 Câu Hỏi Vì Sao