Có đáng để học hợp ngữ không? [đóng cửa]


92

Có còn đáng giá để học ASM không?

Tôi biết một chút về nó, nhưng tôi chưa thực sự sử dụng nó hoặc học nó đúng cách vì mọi thứ tôi học để làm trong trình hợp dịch tôi có thể làm trong 1/10 thời gian với một số ngôn ngữ như C hoặc C ++. Vì vậy, tôi thực sự có nên tìm hiểu và sử dụng ASM? Nó sẽ giúp tôi bất kỳ tốt về chuyên môn? Nó sẽ làm tăng sự tháo vát của tôi? Trong ngắn hạn, nó sẽ làm cho tôi trở thành một lập trình viên tốt hơn?

Lưu ý: Tôi đang nói về lắp ráp cấp thấp như FASM hoặc NASM chứ không phải thứ gì đó giống như HLA (Trình lắp ráp cấp cao).


2
Lưu ý, hợp ngữ gắn liền với một bộ xử lý / bộ điều khiển.
rmflow

7
Ý bạn là nó không đa nền tảng? !!
ApprenticeHacker


2
Ok, vậy là có một hợp ngữ khác nhau cho mỗi bộ xử lý ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

3
Một hợp ngữ khác nhau cho mỗi họ bộ xử lý. Mã 386 chạy trên bất kỳ bộ xử lý x86 nào sau này bao gồm các sản phẩm của Intel và AMD - nhưng một số bộ tính năng là phần mở rộng độc quyền. Các ngôn ngữ là như nhau cho các hướng dẫn thêm nhưng nhị phân kết quả sẽ không được cầm tay.
spff

Câu trả lời:


107

Tôi học được từ cuốn sách của Kip Irvine . Nếu bạn bỏ qua những lời chỉ trích (công bằng) về các thư viện (không liên quan) của anh ấy, tôi có thể giới thiệu nó như một lời giới thiệu tốt về chính ngôn ngữ - mặc dù đối với những thứ thực sự thú vị, bạn phải tìm kiếm những kẻ ám ảnh trên mạng.

Tôi nghĩ sẽ hữu ích khi hiểu những gì xảy ra ở các cấp thấp hơn. Khi bạn nghiên cứu trình hợp dịch, bạn sẽ tìm hiểu về đường dẫn cpu, dự đoán rẽ nhánh, căn chỉnh bộ nhớ cache, SIMD, sắp xếp lại lệnh, v.v. Kiến thức về những điều này sẽ giúp bạn viết mã cấp cao tốt hơn.

Hơn nữa, sự khôn ngoan thông thường là không cố gắng tối ưu hóa bằng tay hầu hết thời gian mà hãy để trình biên dịch lo lắng về điều đó. Khi bạn nhìn thấy một số ví dụ về những thứ xoắn mà trình biên dịch tạo ra, bạn sẽ hiểu rõ hơn tại sao sự khôn ngoan thông thường lại tồn tại.

Ví dụ: Các LFSR chạy nhanh với lệnh xoay-mang-mang, đối với những trường hợp cụ thể như thế này, việc viết phiên bản trình hợp dịch cũng dễ dàng như việc phát hiện xem trình biên dịch có đủ thông minh để tìm ra nó hay không. Đôi khi bạn chỉ biết một cái gì đó mà trình biên dịch không.

Nó cũng giúp bạn hiểu thêm về các vấn đề bảo mật - ghi hoặc thực thi, ghi đè ngăn xếp, v.v.

Một số vấn đề đồng thời chỉ trở nên rõ ràng khi bạn nhận thức được những gì đang xảy ra ở cấp độ mỗi lệnh.

Đôi khi nó có thể hữu ích khi gỡ lỗi nếu bạn không có mã nguồn hoàn chỉnh.

Có giá trị tò mò. Các chức năng ảo được thực hiện như thế nào? Bạn đã bao giờ cố gắng viết các chương trình DirectX hoặc COM trong trình hợp dịch chưa? Làm thế nào để các cấu trúc lớn được trả về, hàm gọi có cung cấp không gian cho chúng hay ngược lại?

Sau đó, có các ngôn ngữ lắp ráp đặc biệt cho phần cứng đồ họa, mặc dù các ngôn ngữ shader đã đạt cấp độ cao cách đây vài năm, bất cứ thứ gì cho phép bạn suy nghĩ về một vấn đề theo cách khác đều tốt.


7
Câu trả lời được viết tốt +1. Học và sử dụng là hai việc khác nhau, học nó là một ý kiến ​​hay, khi nào / nếu sử dụng nó đi kèm với kinh nghiệm.
old_timer

Để đưa ra một ví dụ, Linus Torvalds sử dụng trình tháo gỡ để gỡ lỗi mã của anh ấy, vì vậy tôi nghĩ anh ấy có kiến ​​thức tốt về lắp ráp x86.
Ivanzinho 19/09/19

52

Tôi thấy rất thú vị khi có rất nhiều người nói rằng có, bạn cần / nên học lắp ráp. Đối với tôi câu hỏi là bạn cần biết bao nhiêu lắp ráp? Tôi không nghĩ rằng bạn phải biết hợp ngữ như một ngôn ngữ lập trình, đó là tôi không tin rằng tất cả mọi người đều có thể viết một chương trình trong hợp ngữ, nhưng mặt khác, có thể đọc và hiểu nó thực sự là gì. nghĩa là (có thể yêu cầu nhiều kiến ​​thức hơn về kiến ​​trúc so với trình hợp dịch) là đủ.

Tôi chắc chắn không thể viết hợp ngữ (tức là viết bất kỳ đoạn mã không quan trọng nào trong lắp ráp), nhưng tôi có thể đọc nó và điều đó cùng với kiến ​​thức về kiến ​​trúc phần cứng thực tế và các quy ước gọi đang được sử dụng là đủ để phân tích hiệu suất và xác định đoạn mã C ++ nào là nguồn của assembly đó.


4
Ý bạn là tôi chỉ nên học các lệnh push, pop, mov và gọi cơ bản ?
ApprenticeHacker

10
Tôi đồng ý, nhu cầu biết lắp ráp phụ thuộc rất nhiều vào ngành lập trình bạn đang làm việc. Web / máy tính để bàn / cơ sở dữ liệu? Quên trình lắp ráp. Trò chơi máy tính và đồ họa? Nó có thể hơi hữu ích. Phát triển hệ điều hành hay hệ thống nhúng thời gian thực? Nó là phải. Và như thế.
Lundin

1
Bạn đang trình bày sai các câu trả lời khác - không ai nói rằng bạn cần / nên học cách lắp ráp; chỉ là nó hữu ích hoặc đáng giá, theo câu hỏi. Tuy nhiên, câu trả lời của bạn vẫn có liên quan.
Luc Danton,

1
@burningprodigy: Tôi tin rằng bạn nên có một số kiến ​​thức cơ bản về cách các lệnh trong trình hợp dịch mà bạn sử dụng (tức là thứ tự của các đối số là gì và những thứ tương tự) và một số hiểu biết rất cơ bản về một số lệnh, tải trọng hoặc một cửa hàng là. Sau đó, nếu bạn cần xem xét một số bộ phận lắp ráp, bạn có thể sử dụng tài liệu tham khảo để hiểu từng hướng dẫn và khi làm như vậy bạn sẽ bắt đầu học những điều cơ bản mà bạn cần.
David Rodríguez - dribeas

1
Tôi đồng ý. Đặc biệt là chỉ biết lắp ráp sẽ giúp bạn hiểu được ít nhất về việc đánh giá hiệu quả trên các CPU hiện đại. Nếu đó là mục tiêu, một chút kiến ​​thức cơ bản về lắp ráp với một phần kiến ​​thức cơ bản về kiến ​​trúc máy tính sẽ hữu ích hơn. Hầu hết những lần tôi cần lắp ráp là xem qua bãi chứa các chương trình được tối ưu hóa, hoặc cho vui (tức là công cụ bảo mật, viết một hạt nhân nhỏ, ..). Nhưng tôi không thể nhớ lần cuối cùng tôi thay đổi một số quyết định thiết kế vì kiến ​​thức lắp ráp.
Voo

27

Có - lý do chính để học lắp ráp cho các nhà phát triển C và C ++ là nó giúp hiểu những gì đang xảy ra dưới lớp mã C và C ++. Không phải là bạn sẽ thực sự viết mã trong assembly, nhưng bạn sẽ có thể nhìn vào quá trình tháo gỡ mã để đánh giá hiệu quả của nó và bạn sẽ hiểu các tính năng C và C ++ khác nhau hoạt động tốt hơn nhiều như thế nào.


23

Thật đáng giá khi học nhiều ngôn ngữ khác nhau, từ nhiều mô hình khác nhau. Việc học Java, C ++, C # và Python không được tính, vì chúng đều là các bản sao của cùng một mô hình.

Vì assembly là gốc (tốt, gần với root) của tất cả các ngôn ngữ, tôi cho rằng việc học assembly là điều đáng giá.

Sau đó, một lần nữa, việc học một ngôn ngữ lập trình hàm, lập trình logic, ngôn ngữ kịch bản, ngôn ngữ dựa trên toán học là điều đáng giá. Bạn chỉ có rất nhiều thời gian, vì vậy bạn phải chọn và lựa chọn.


Và sau đó, khi bạn cuối cùng đã học được tất cả chúng và nghĩ rằng bạn có một cái nhìn thoáng qua về những gì đang xảy ra, bạn phát hiện ra J .
Micha Wiedenmann

4

Biết ASM cũng rất hữu ích khi gỡ lỗi, vì đôi khi tất cả những gì bạn có là "ASM kết xuất lỗi".


2

Bạn có sử dụng nó trong những gì bạn định làm không? nó sẽ hỗ trợ bạn theo bất kỳ cách nào trong những gì bạn hiện đang làm hoặc dự định làm? đó là hai câu hỏi bạn nên hỏi chính mình, câu trả lời cho những câu hỏi đó là câu trả lời cho câu hỏi của bạn.

Theo nghĩa tổng quát hơn, vâng, theo quan điểm của tôi, tôi muốn nói rằng asm rất đáng để học hỏi (một cái gì đó như x86 hoặc arm), nó phục vụ bạn tốt như thế nào phụ thuộc vào những gì bạn lập trình và cách bạn gỡ lỗi nó.


2

Tùy thuộc vào cấp độ lập trình mà bạn muốn đạt đến. Nếu bạn cần làm việc với trình gỡ lỗi thì CÓ. Nếu bạn cần biết cách thức hoạt động của trình biên dịch thì CÓ. Bất kỳ trình lắp ráp / gỡ lỗi nào đều phụ thuộc vào CPU, vì vậy có rất nhiều công việc, chỉ cần kiểm tra họ x86 lớn và cũ như thế nào.


Bạn có thể có nghĩa là bạn phụ thuộc gia đình CPU?
Romeno
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.