Tại sao chúng ta cần ngôn ngữ lắp ráp?
Chà, thực sự chỉ có một ngôn ngữ mà chúng ta sẽ cần , đó là "ngôn ngữ máy" hoặc "mã máy". Nó trông như thế này:
0010000100100011
Đây là ngôn ngữ duy nhất máy tính của bạn có thể nói trực tiếp. Đó là ngôn ngữ mà CPU nói (và về mặt kỹ thuật, các loại CPU khác nhau nói các phiên bản khác nhau). Nó cũng hút để nhìn và cố gắng hiểu.
May mắn thay, mỗi phần của nhị phân tương ứng với một ý nghĩa cụ thể. Nó được chia thành một số phần:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Các giá trị này tương ứng với:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
Vì vậy, thao tác này sẽ thêm các số trong các thanh ghi 1 và 2 và đưa giá trị đó vào thanh ghi 3. Nếu bạn thực sự đặt các giá trị này vào CPU và bảo nó "đi", nó sẽ thêm hai số cho bạn. Hoạt động "trừ" có thể là 0011 hoặc một cái gì đó, thay vì 0010 ở đây. Bất cứ giá trị nào cũng sẽ khiến CPU thực hiện phép trừ.
Vì vậy, một chương trình có thể trông như thế này (đừng cố hiểu nó, vì tôi đã tạo ra phiên bản mã máy đặc biệt này để giải thích mọi thứ):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
Có hút để đọc? Chắc chắn rồi. Nhưng chúng ta cần nó cho CPU . Chà, nếu mỗi mã máy tương ứng với một hành động cụ thể, hãy tạo một tốc ký "tiếng Anh" đơn giản, và sau đó khi chúng ta hiểu chương trình đang làm gì, hãy chuyển đổi nó thành mã máy nhị phân thực và đưa nó vào CPU để chạy.
Vì vậy, hướng dẫn ban đầu của chúng tôi từ trên có thể trông giống như:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
Lưu ý rằng phiên bản tiếng Anh này có ánh xạ chính xác tới mã máy . Vì vậy, khi chúng tôi viết một dòng "tiếng Anh" này, chúng tôi thực sự chỉ viết mã máy thân thiện hơn và dễ hiểu hơn.
Vâng, đây là ngôn ngữ lắp ráp. Đó là lý do tại sao nó tồn tại và tại sao nó được tạo ra ban đầu.
Để hiểu lý do tại sao chúng ta cần nó ngay bây giờ, hãy đọc các câu trả lời ở trên, nhưng chìa khóa cần hiểu là đây: Các ngôn ngữ cấp cao không có một đại diện duy nhất là mã máy. Ví dụ: trong C, hoặc Python hoặc bất cứ điều gì:
z = x + y
Điều này nghe giống như sự bổ sung của chúng tôi từ phía trên, giả sử x
là ở thanh ghi 1, y
là ở thanh ghi 2 và z
nên kết thúc ở thanh ghi 3. Nhưng còn dòng này thì sao?
z = x * 2 + (y / 6) * p + q - r
Hãy thử biểu diễn dòng đó trong 16 bit nhị phân và báo cho CPU "đi". Bạn không thể. Mã máy không có hướng dẫn hoạt động đơn lẻ để thực hiện phép cộng, phép trừ và bất cứ điều gì khác với 4 hoặc 5 biến cùng một lúc. Vì vậy, nó phải được chuyển đổi thành một chuỗi mã máy đầu tiên. Đây là những gì bạn làm khi bạn "biên dịch" hoặc "diễn giải" một ngôn ngữ cấp cao.
Chà, chúng ta có các chương trình để làm điều đó, vậy tại sao bây giờ chúng ta cần lắp ráp? Vâng nói rằng chương trình của bạn đang chạy chậm hơn bạn mong đợi, và bạn muốn biết tại sao. Nhìn vào "đầu ra" ngôn ngữ máy của dòng này, nó có thể trông giống như:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Chỉ cần thực hiện một dòng Python đó. Vì vậy, bạn thực sự muốn gỡ lỗi đó?!?!?! NO . Thay vào đó, bạn yêu cầu trình biên dịch của bạn vui lòng cung cấp cho bạn đầu ra ở dạng bạn thực sự có thể hiểu dễ dàng, đó là phiên bản ngôn ngữ lắp ráp tương ứng chính xác với mã máy đó. Sau đó, bạn có thể tìm ra nếu trình biên dịch của bạn đang làm điều gì đó ngớ ngẩn và cố gắng sửa nó.
(Lưu ý thêm về lời khuyên của @ Raphael: Bạn thực sự có thể xây dựng CPU hoạt động với những thứ không phải là mã nhị phân, như mã ba (cơ sở 3) hoặc mã thập phân, hoặc thậm chí ASCII. Mặc dù vậy, chúng tôi thực sự đã mắc kẹt với nhị phân.)