Tại sao chúng ta cần ngôn ngữ lắp ráp?


27

Chúng tôi chủ yếu viết chương trình bằng ngôn ngữ cấp cao. Vì vậy, trong khi học tôi đã gặp ngôn ngữ lắp ráp. Vì vậy, một trình biên dịch chuyển đổi ngôn ngữ lắp ráp thành ngôn ngữ máy và trình biên dịch thực hiện tương tự với ngôn ngữ cấp cao. Tôi thấy ngôn ngữ lắp ráp có các hướng dẫn như di chuyển r1 r3, di chuyển 5, v.v. Và nó khá khó để nghiên cứu. Vậy tại sao ngôn ngữ lắp ráp được tạo ra? Hay nó là ngôn ngữ xuất hiện đầu tiên ngay cả trước ngôn ngữ cấp cao? Tại sao tôi học về các nhà lắp ráp trong lớp kỹ thuật máy tính của tôi?


13
Trình biên dịch mã là mã máy có thể đọc được, đó là lý do tại sao.
Andrej Bauer

4
Bởi vì điều quan trọng là phải biết mọi thứ hoạt động như thế nào khi chúng ta gần với phần cứng. Khi chúng ta viết lắp ráp, chúng ta hiểu phần cứng máy tính hoạt động như thế nào và hoạt động ở mức độ thấp. Cách tốt nhất cho điều đó là ngôn ngữ lắp ráp vì ngôn ngữ máy là tẻ nhạt và không thể đọc được như lắp ráp. Bạn có thực sự thích sử dụng một hộp ma thuật và không bao giờ nhìn vào bên trong?
Spencer Wieczorek

Câu trả lời:


32

"Vậy tại sao ngôn ngữ lắp ráp được tạo ra?"

Ngôn ngữ hội được tạo ra như một cách viết tắt chính xác cho mã hóa cấp độ máy, do đó bạn sẽ không phải đếm 0 và 1 cả ngày. Nó hoạt động giống như mã cấp độ máy: với các hướng dẫn và toán hạng.

"Cái nào đến trước?"

Wikipedia có một bài viết hay về Lịch sử Ngôn ngữ Lập trình

"Tại sao tôi học về các nhà lắp ráp trong lớp kỹ sư máy tính của tôi?"

Mặc dù đó là sự thật, nhưng có lẽ bạn sẽ không thấy mình viết ứng dụng của khách hàng tiếp theo trong quá trình lắp ráp, vẫn còn nhiều thứ để kiếm được từ việc học lắp ráp.

Ngày nay, ngôn ngữ lắp ráp được sử dụng chủ yếu để thao tác phần cứng trực tiếp, truy cập vào các hướng dẫn của bộ xử lý chuyên dụng hoặc để giải quyết các vấn đề hiệu suất quan trọng. Sử dụng điển hình là trình điều khiển thiết bị, hệ thống nhúng cấp thấp và hệ thống thời gian thực.

Ngôn ngữ hội gần với bộ xử lý như bạn có thể có được như một lập trình viên, vì vậy một thuật toán được thiết kế tốt sẽ rất tuyệt - lắp ráp rất tốt để tối ưu hóa tốc độ. Đó là tất cả về hiệu suất và hiệu quả. Ngôn ngữ hội cho phép bạn kiểm soát hoàn toàn các tài nguyên của hệ thống. Giống như một dây chuyền lắp ráp, bạn viết mã để đẩy các giá trị đơn vào các thanh ghi, xử lý trực tiếp các địa chỉ bộ nhớ để lấy các giá trị hoặc con trỏ. (nguồn: codeproject.com )


29

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ử xlà ở thanh ghi 1, ylà ở thanh ghi 2 và znê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.)


2
Về nguyên tắc, không có gì ngăn cản chúng ta xây dựng CPU hoạt động với ngôn ngữ lắp ráp trực tiếp. ASCII chỉ là một mã hóa không hiệu quả cho mục đích này, đó là tất cả.
Raphael

Cảm ơn đã bổ sung. Tôi đồng ý, nhưng bỏ qua điều đó vì mục đích hiểu mục đích của lắp ráp. Tôi sẽ thêm một ghi chú.
Chris Cooper

15

Vậy tại sao ngôn ngữ lắp ráp được tạo ra? hay đó là thứ xuất hiện đầu tiên ngay cả trước ngôn ngữ cấp cao?

Đúng, lắp ráp là một trong những ngôn ngữ lập trình đầu tiên sử dụng văn bản làm đầu vào, trái ngược với dây hàn, sử dụng bảng cắm và / hoặc công tắc lật. Mỗi ngôn ngữ lắp ráp được tạo cho chỉ một bộ xử lý hoặc họ bộ xử lý khi các hướng dẫn được ánh xạ trực tiếp tới các mã được chạy bởi bộ xử lý.

Tại sao tôi học về các nhà lắp ráp trong lớp kỹ thuật máy tính của tôi?

Nếu bạn cần lập trình trình điều khiển thiết bị hoặc viết trình biên dịch thì hiểu cách thức bộ xử lý hoạt động là vô giá, nếu không cần thiết. Cách tốt nhất để hiểu điều này là viết một số mã trong lắp ráp.

Nếu bạn xem cách trình biên dịch viết mã, thông thường sẽ thấy các tùy chọn để gọi các quy ước mà không biết lắp ráp có thể không thể hiểu được.

Nếu bạn phải giải quyết một lỗi và đầu vào duy nhất bạn có là kết xuất lõi , thì bạn chắc chắn cần biết lắp ráp để hiểu đầu ra là mã lắp ráp và nếu may mắn được tăng cường bằng các câu lệnh cấp cao hơn của ngôn ngữ cấp cao.


14

Hãy để tôi thêm một khía cạnh ít thực tế. Đây có lẽ không phải là một lý do lịch sử mà là một lý do cho bạn, ngày hôm nay.

Hội (so với các ngôn ngữ cấp cao) là trần trụi . Nó không che giấu bất cứ điều gì (được thực hiện trong phần mềm), và nó đơn giản theo nghĩa là nó có một tập hợp hoạt động tương đối nhỏ, cố định.

Điều này có thể hữu ích cho phân tích thuật toán chính xác. Ngữ nghĩa và luồng điều khiển đơn giản đến mức đếm tất cả các hoạt động (hoặc số lượng dự kiến) có thể được thực hiện bằng cách chú thích biểu đồ luồng điều khiển với số lần chuyển tiếp (xác suất). Knuth thực hiện điều này trong các cuốn sách TAoCP của mình có hiệu quả tuyệt vời, chứng minh một số phân tích thuật toán khắt khe nhất.

Giai thoại: đồng nghiệp của tôi đã học cách đọc Mã byte Java cho mục đích này chính xác.


4

Có câu trả lời ở đây:

Tất cả những câu trả lời này chỉ ra:

  • Tối ưu hóa tốc độ / bộ nhớ
  • Hiểu cách thức hoạt động của máy
  • Vì vậy, lập trình viên Noob trở thành chuyên gia
  • Nếu bạn biết lắp ráp, bạn biết cách viết trình biên dịch cho ngôn ngữ Lvl cao của bạn
  • v.v.

1
Bạn có chia sẻ tất cả những quan điểm này? Kinh nghiệm của bạn là gì? (Trong đó, mục "Vậy Noob Các lập trình viên trở thành chuyên gia" có vẻ lỗi thời bởi nhiều thập kỷ đối với tôi.)
Raphael

woah woah bạn không cần phải cảm động về chủ đề này. Tôi chỉ liên kết câu trả lời cho câu hỏi trùng lặp của anh ấy. Và "Vì vậy, các lập trình viên Noob trở thành chuyên gia" đã được bình chọn cao nhất tại đây . Đi tranh luận với anh ta không phải tôi =)
compski

1
Tôi không cảm động, tôi đang cố gắng giúp bạn trả lời đúng (hiện tại thì không, vì bạn chỉ liên kết với một vài tài nguyên, không ai trong số đó trả lời đầy đủ câu hỏi). Bao gồm những suy nghĩ của riêng bạn theo cách so sánh là bước đầu tiên cho kết thúc đó. (Lưu ý rằng bằng cách liên quan đến ý kiến ​​theo cách loại trừ, bạn gán giá trị cho chúng; nói cách khác, bạn phải có thể tranh luận lý do tại sao bạn coi trọng ý kiến ​​đủ để (đăng lại) là một câu trả lời.)
Raphael

Kinh nghiệm của tôi là tôi thực sự ghét và phải vật lộn với việc học ngôn ngữ lắp ráp sau khi chỉ quen với một số ngôn ngữ lập trình cấp cao. Và tôi biết những người lập trình viên giỏi hoặc biết trước C ++ / C có thể lập trình trong ASM khá tốt. Tôi không nghĩ rằng ý kiến ​​của tôi đủ giá trị để được đăng trong câu trả lời của tôi vì vậy đó là lý do tại sao ...
compski

Liên kết đầu tiên của bạn bị hỏng.
Hola Soy Edu Feliz Navidad

1

Lắp ráp = mã máy
Một số người tiếp tục hiểu về cách ngôn ngữ lắp ráp khác với mã số mà CPU hiểu.
Điều này (trong khi sự thật) hoàn toàn bỏ lỡ điểm.
Theo như dịch thuật, ngôn ngữ lắp ráp và số (nhị phân, hex bất cứ thứ gì) là một và cùng một thứ.

Grok nó hoặc thả nó
Nếu bạn lắp ráp bạn biết cách một máy tính thực sự hoạt động.
lắp ráp Grokking liên quan đến:

Nếu bạn lắp ráp, bạn sẽ có một bức tranh gần như hoàn chỉnh về cách CPU kết nối với bàn phím của bạn hoạt động.
Bạn cần sử dụng kiến ​​thức này giống như một bác sĩ phẫu thuật não sử dụng dao mổ của mình.

Không cần trừu tượng hôi thối
trừ khi bạn lắp ráp (và do đó CPU trên bàn vận hành), bạn sẽ không bao giờ thoát khỏi sự trừu tượng của máy RAM (hoặc thần cấm máy Turing là nỗi kinh hoàng ).

L33t Hax0r
Hội 5k1llz cũng giúp bạn hiểu cách 133thax0r quản lý để đánh bại các kế hoạch bảo vệ. (Q: tại sao ASLR không hoạt động ? mov rax,fs:[28h]phá vỡ nó ).

0,1%
Không phải là kiến ​​thức về lắp ráp mới là vấn đề, mà là kiến ​​thức về cỗ máy mà bạn làm việc về vấn đề đó.
Nếu bạn muốn biết máy, bạn phải hiểu nó và điều đó có nghĩa là nói ngôn ngữ của máy.

Nếu bạn không thì bạn bị mắc kẹt với sự trừu tượng.
Đó là khoa học và điều đó tốt, nhưng đó không bao giờ là bức tranh hoàn chỉnh.

Nó giống như học cách nói Xhosa
Trừ khi bạn nhắm đến cấp độ guru, tốt nhất hãy gắn bó với những gì bạn biết, những nhấp chuột đó sẽ làm phức tạp cuộc sống của bạn .

Bởi vì nó vui


1
Việc sử dụng từ
Grok

-1

Để tự mình hẹn hò, lần đầu tiên tôi học RPG II bằng cách sử dụng Hệ thống 32 của IBM và sau đó học APL trên chiếc 370. Tôi hoàn toàn có kích thước và tốc độ. Thần chú của tôi nhỏ hơn và nhanh hơn. Hội là ngôn ngữ nhỏ gọn nhất và nhanh nhất hiện có. Tôi sẽ làm các chương trình thử nghiệm ở cả C và hội. Trong đó các chương trình C sẽ yêu cầu 100 Kb, một chương trình hội tương đương thường sẽ ít hơn 5 Kb. Khi nghiên cứu đầu ra của trình biên dịch C, tôi sẽ tìm thấy mã sẽ kiểm tra và kiểm tra lại các tham số tạo ra các kiểm tra có điều kiện cho các lỗi có thể xảy ra thường hiếm gặp và khá không cần thiết, tất cả đều mất thời gian, nhưng sự phình to bộ nhớ lớn nhất đã vượt qua tất cả mọi thứ đến và từ ngăn xếp.

Trong môi trường lập trình ngày nay, viết mã cung cấp thêm một mức độ bảo mật và bảo vệ. Có thể đọc thông tin trực tiếp từ một phần cứng không thể truy cập được bằng các ngôn ngữ cấp cao, cho phép bạn mã hóa với hội theo cách mà một chương trình chỉ có thể được sử dụng trên máy cụ thể đó. Ví dụ: mã hóa khóa người dùng bằng địa chỉ MAC của giao diện mạng và sau đó đỗ khóa đó vào một khu vực chưa đăng ký cụ thể của ổ cứng, sau đó đánh dấu khu vực đó là xấu để các tệp khác không thể ghi đè lên nó. Tất nhiên bạn mất ngành, nhưng đó là gì? 2048 hoặc 4096 byte trong số hàng tỷ hoặc hàng nghìn tỷ?


1
"Không thể truy cập vào các ngôn ngữ cấp cao" thậm chí có nghĩa là gì?
David Richerby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.