1. Khái quát ngôn ngữ máy.
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à sản phẩm cuối cùng của trình biên dịch, là một tập các chỉ thị được CPU máy tính trực tiếp thực thi.
Mỗi chỉ thị yêu cầu một chức năng xác định dến CPU, ví dụ: 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ớ.
Một chuỗi các chỉ thị này tạo thành một chương trình, và được CPU thực thi khi người dùng yêu cầu.
Nhiệm vụ của lập trình viên hiện đại là sử dụng ngôn ngữ lập trình để mô tả hướng dẫn của mình cho máy tính. ( ví dụ với ngôn ngữ C++ thì tài nguyên này là các file .h và .cpp ) Trình biên dịch sẽ input các dữ liệu này và output ra mã máy nhị phân để máy tính có thể hiểu được.
Mã máy nhị phân là phương thức 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, nói cách khác chính là ngôn ngữ lập trình nguyên thủy phụ thuộc vào phần cứng ( rất may là trình biên dịch đã giúp chúng ta làm điều này, không thì có lẽ tôi không có thời gian để ngồi đây, tìm hiểu và trình bày bài viết này : [[ ) .
Ngoài trình biên dịch còn có trình hợp dịch, trình liên kết. Nhưng để đơn giản chúng ta sẽ không nhắc tới nó ở đây.
2. Chương trình.
Chương trình máy tính thực chất là một chuỗi những chỉ thị đã được dịch sang mã máy, được thực thi bởi CPU.
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 hiện đồng thời nhiều chỉ thị. ( chúng ta sẽ đi sâu vào khái niệm về luồng - thread ở một bài viết khác )
3. Hợp ngữ.
Hợp ngữ ( hay assembly ) thường được viết là asm là bất kỳ ngôn ngữ lập trình cấp thấp nào có sự gần gũi mạnh nhất giữa ngôn ngữ của nó với tập lệnh mã máy của kiến trúc, nó liên quan chặt chẽ đến cụ thể kiến trúc phần cứng máy tính mà nó hướng tới.
Ví dụ: trên vi xử lý Zilog Z80, để giảm giá trị của thanh ghi B của vi xử lý,
hợp ngữ được viết như sau:
DEC B
thay vì
00000101
Trình hợp dịch cần biên dịch hợp ngữ thành mã đối tượng ( Object code ), Object code chứa các mã thực thi ( opcodes ) và có các biểu danh ( Symbolic name ) ứng với các vùng nhớ cùng các thực thể khác. Hầu hết các trình hợp dịch đều hỗ trợ macro nhằm giảm bớt công sức cho lập trình viên, bằng việc thay thế một nhóm lệnh bằng một định danh ngắn gọn.
4. Ví dụ.
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
Ví dụ về kiến trúc MIPS là một điển hình cho ngôn ngữ máy với chỉ thị dài 32 bits.
Mỗi chỉ thị được tạo bởi những vùng toán tử, dài nhất là 6 bits.
Chỉ thị J-type và I-type đặc trưng hoàn toàn bởi toán tử.
Chỉ thị R-type có thêm hàm để quyết định toán tử chính xác hơn.
Trên là những vùng được sử dụng trong loại này.
rs, rt và rd là những toán hạng thanh ghi;
shamt chỉ lượng dịch chuyển,
[ op | rs | rt | rd |shamt| funct]
0 1 2 6 0 32 decimal
000000 00001 00010 00110 00000 100000 binary
Trên đây là chỉ thị yêu cầu cộng giá trị thanh ghi 1 và 2, sau đó lưu vào thanh ghi 6.
[ op | rs | rt | address/immediate]
35 3 8 68 decimal
100011 00011 01000 00000 00001 000100 binary
Trên đây là chỉ thị yêu cầu 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 | target address ]
2 1024 decimal
000010 00000 00000 00000 10000 000000 binary
Trên đây là chỉ thị yêu cầu nhảy đến địa chỉ 1024.