Hợp ngữ - Assembly có thật sự cần đến nó không?

Chào các bác,

Thật ra mình vừa học môn kiến trúc máy tính. Trong tài liệu có nói:
Levels of Program code có 3 loại. 1. ngôn ngữ bật cao, 2. Hợp ngữ, 3. Ngôn ngữ máy.
http://images.slideplayer.com/19/5845717/slides/slide_12.jpg

Vậy sao mình không bỏ qua Assemply, đi một vèo từ ngôn ngữ cấp cao đến ngôn ngữ máy lun khỏi phải vừa thông vừa biên mất thời gian?

Mình cảm ơn! :slight_smile:

1 Like

Tất nhiên là có thể bỏ qua Assembly được. Nhưng khuyên là nên học qua chút chút.
Vì dù sao biết Assembly thì vẫn có lợi hơn chút. Hiểu rõ hơn chút cách máy tính hoạt động như thế nào và nhiều cái hay ho nữa.

3 Likes

Chắc tại vì nó khó và mất rất nhiều thời gian.
Chả lẽ lại viết toàn bộ compiler của C bằng 0 với 1 (dù C so với hầu hết các ngôn ngữ khác cũng là khá thấp rồi).
Trên thực tế thì những ngôn ngữ bậc cao hơn đều được viết từ những ngôn ngữ bậc thấp hơn chứ chả ai rảnh mà viết từ mã máy cho tốn cả thời gian lẫn công sức.
vd: Python được viết bằng C, C compilers lại được viết bằng Assembly, B,…

1 Like

Ngôn ngữ máy thì bây giờ học làm gì? Ngồi viết 1 cái app 30 năm chẳng xong.
Còn vụ assembly thì bỏ qua cũng ok, tuy nhiên nếu tìm hiểu về crack thì nên học ^^

Mình nghĩ nếu bạn muốn biết cách máy tính hay vi xử lý hoạt động thế nào, thì tốt nhất nên tìm hiểu về Assembly. Nó là những câu lệnh tác động trực tiếp lên các thanh ghi, do đó khi học cũng khá khó, bởi mỗi nhà sản xuất có những quy chuẩn khác nhau. Còn ngôn ngữ máy thì thua rồi, ngồi mà code nó chắc mấy năm mới xong cái App.

Cho mình hỏi assembly mỗi cpu mỗi khác nhau à, mình mới đang học về assembly trong 8086 @huegengar

1 Like

Mỗi kiến trúc CPU thì cũng có một ngôn ngữ máy riêng bạn ạ, do đó cũng có hợp ngữ riêng (theo mình hiểu thì thường khác nhau ở một số lệnh và thanh ghi thôi). 8086 hình như dùng kiến trúc x86 của thằng Intel thì phải. Mà bạn chỉ cần biết thật rõ Assembly của 1 dòng CPU (hay MCU) cơ bản là ổn rồi, chủ yếu để biết phần cứng nó làm việc như thế nào. Khi hiểu rồi thì học Assembly của các dòng khác nhanh lắm. Chúc bạn sớm thành Pro.

Ấy các bác có chút hiểu sai câu hỏi của mình rồi!
Ý mình là sao không từ ngôn ngữ cấp cao dùng compiler biên dịch xuống mã máy luôn mà phải trung gian qua thằng assemply.? Chứ ý mình không phải là không học assemply :smile:

Không biết các compiler của C/C++, java, C#,… có biên dịch thẳng xuống ngôn ngữ máy luôn không hay qua assemply. Nếu phải qua assemply thì tại sao? để khỏi mất thời gian.

Cảm ơn các bác. Chắc có vài bạn cũng thắc mắc há :blush:

1 Like

Mình nghĩ chắc là do để debug cho dễ ._.
Dù sao thì Assembly cũng dễ đọc cũng như dễ debug hơn machine code.

3 Likes

Bên trên mình nói rồi đó, không biết đã trả lời được câu hỏi của bạn chưa. :confused:

Hình như bạn có nhầm lẫn gì đó nhỉ.

Nếu bạn dùng c/c++ thì sau khi biên dịch sẽ thành Mã máy (biên dịch ở đâu thì ra Mã máy tương đương ở đó, nên khi code nền tảng nào thì theo nền tảng đó, muốn đa nền thì phải code riêng cho mỗi nền tảng).

Java, C# sau khi biên dịch sẽ thành bytecode, khi chạy thì Java/.Net Framework sẽ thông dịch đống bytecode đó (đúng ra thì bytecode sẽ được JIT compile sang Mã máy; làm thế để có thể lập trình đa nền tảng một cách dễ dàng). https://en.wikipedia.org/wiki/Just-in-time_compilation

ASM là một ngôn ngữ lập trình thể hiện Mã máy một cách ngắn gọn hơn Mã máy bình thuờng (thật ra đối với mình thì ASM chính là mã máy, chỉ là viết gọn lại thôi, biên dịch thì ra Mã máy; mỗi nền tảng thì có ASM riêng biệt, như ASM của Intel, ASM của MIPS, v.v.)

Tấm hình mà bạn đăng thì đâu có nói gì về biên dịch đâu nhỉ?

5 Likes

Hãy tìm hiểu về Assembly nếu muốn crack, dịch ngược mã nguồn, … :smiley:

Quá trình đầy đủ là nhận code .c -> bung lụa (macro) .h đưa vào .c -> kiểm tra cú pháp -> dịch ra IM code -> dịch ra .asm -> thảy cho assembler. Rồi assembler dịch ra hết thảy tiếp cho linker. Tùy HĐH mà sau bước này sẽ biến hóa.

1 Like

câu trả lời của bạn thật sự hay đó:) chắc bạn thật sự là 1 người chuyên nghiệp

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?