Hợp ngữ – Wikipedia tiếng Việt

Hợp ngữMotorola 6800 Assembly Language.pngDanh sách Hợp ngữ Motorola MC6800, cho thấy hợp ngữ thời đầu và hình thức tích hợpMẫu hìnhBắt buộc, Phi cấu trúcXuất hiện lần đầu1949; 72 năm trước( )

Trong lập trình máy tính, Hợp ngữ (hay assembly[1]) thường được viết tắt là asm là bất kỳ ngôn ngữ lập trình cấp thấp nào có sự tương ứng rất mạnh giữa các tập lệnh trong ngôn ngữ và tập lệnh mã máy của kiến trúc.[2] Bởi vì hợp ngữ phụ thuộc vào tập lệnh mã máy, mỗi trình biên dịch có hợp ngữ riêng được thiết kế cho chính xác một kiến trúc máy tính cụ thể. Hợp ngữ cũng có thể được gọi là mã máy tượng trưng (symbolic machine code).[3][4]

Mã hợp ngữ được chuyển đổi thành mã máy thực thi bằng một chương trình được gọi là assembler. Quá trình chuyển đổi được gọi là assembling. Hợp ngữ thường có một câu lệnh trên một lệnh máy (1:1), nhưng các comment và các câu lệnh là chỉ thị trình biên dịch,[5] macros,[1][6] và các nhãn chương trình và địa chỉ bộ nhớ cũng được hỗ trợ

Mỗi một hợp ngữ là dành riêng cho một kiến trúc máy tính đơn cử và đôi lúc cho một hệ điều hành quản lý. [ 7 ] Tuy nhiên, 1 số ít hợp ngữ không cung ứng cú pháp riêng cho lời gọi hệ quản lý và điều hành, và hầu hết những hợp ngữ hoàn toàn có thể được sử dụng thông dụng với bất kể hệ điều hành quản lý nào, vì ngôn từ này cung ứng quyền truy vấn vào tổng thể những năng lực thực sự của bộ giải quyết và xử lý, theo đó tổng thể những chính sách gọi mạng lưới hệ thống đều dừng lại. Trái ngược với hợp ngữ, hầu hết những ngôn từ lập trình bậc cao thường có năng lực di động trên nhiều kiến trúc nhưng nhu yếu thông dịch hoặc biên dịch, một việc làm phức tạp hơn nhiều so với assembling .Hợp ngữ đã từng được dùng thoáng rộng trong toàn bộ những góc nhìn lập trình, nhưng ngày này nó có xu thế chỉ được dùng trong 1 số ít lãnh vực hẹp, hầu hết để tiếp xúc trực tiếp với phần cứng hoặc giải quyết và xử lý những yếu tố tương quan đến vận tốc cao điển hình như những trình tinh chỉnh và điều khiển thiết bị, những mạng lưới hệ thống nhúng cấp thấp và những ứng dụng thời hạn thực .
Cách dùng những thuật nhớ ( mnemonics ) thân thiện để viết chương trình đã thay thế sửa chữa cách lập trình trực tiếp lên máy tính bằng mã máy dạng số ( numeric machine code ) – từng vận dụng cho những máy tính tiên phong – vốn rất mệt nhọc, dễ gây lỗi và tốn nhiều thời giờ .Hợp ngữ dùng một thuật nhớ ( mnemonic ) để biểu lộ từng lệnh máy hoặc opcode cấp thấp, thường là mỗi thanh ghi kiến trúc, bit cờ … Nhiều thao tác nhu yếu một hoặc nhiều toán hạng để tạo thành một lệnh hoàn hảo. Hầu hết những trình hợp dịch cho phép những hằng số, thanh ghi và nhãn được đặt tên cho những vị trí chương trình và bộ nhớ và hoàn toàn có thể thống kê giám sát những biểu thức cho toán hạng. Do đó, những lập trình viên được giải phóng khỏi những giám sát lặp đi lặp lại tẻ nhạt và những chương trình biên dịch chương trình dễ đọc hơn nhiều so với mã máy. Tùy thuộc vào kiến trúc, những yếu tố này cũng hoàn toàn có thể được phối hợp cho những tập lệnh đơn cử hoặc chính sách địa chỉ bằng cách sử dụng offset hoặc tài liệu khác cũng như địa chỉ cố định và thắt chặt. Nhiều trình hợp dịch phân phối những chính sách bổ trợ để tạo điều kiện kèm theo tăng trưởng chương trình, trấn áp quy trình lắp ráp và tương hỗ gỡ lỗi .

  • Một trình họp dịch macro bao gồm một tập lệnh macro sao cho văn bản hợp ngữ (parameterized) được tham số hóa) có thể được biểu thị bằng một tên và tên đó có thể được sử dụng để chèn văn bản mở rộng vào mã khác.
  • Trình hợp dịch đa nền tảng là một trình hợp dịch có thể hoạt động được trên hệ thống máy tính hoặc hệ điều hành (hệ thống chủ) thuộc loại khác với hệ thống mà mã kết quả sẽ chạy (hệ thống đích). Trình hợp dịch chéo tạo điều kiện phát triển các chương trình cho các hệ thống không có tài nguyên để hỗ trợ phát triển phần mềm, chẳng hạn như hệ thống nhúng hoặc vi điều khiển. Trong trường hợp này, mã đối tượng kết quả phải được chuyển đến hệ thống đích, thông qua bộ nhớ chỉ đọc (ROM, EPROM, v.v.), một lập trình viên (khi bộ nhớ chỉ đọc được tích hợp trong thiết bị, như trong vi điều khiển) hoặc liên kết dữ liệu bằng cách sử dụng bản sao chính xác từng bit của mã đối tượng hoặc biểu diễn dựa trên văn bản của mã đó (chẳng hạn như Motorola S-record hoặc Intel HEX).
  • Trình hợp dịch bâc cao là một chương trình cung cấp các tóm tắt ngôn ngữ thường được liên kết với các ngôn ngữ bậc cao, chẳng hạn như các cấu trúc điều khiển nâng cao (IF/THEN/ELSE, DO CASE…) và các loại dữ liệu trừu tượng cấp cao, bao gồm cấu trúc/bản ghi, unions, lớp, và sets.
  • Một vi hợp dịch là một chương trình giúp chuẩn bị một chương trình vi mô, được gọi là phần sụn, để kiểm soát hoạt động ở mức độ thấp của máy tính.
  • Trình hợp dịch meta là một thuật ngữ được sử dụng trong một số vòng tròn cho “chương trình chấp nhận mô tả cú pháp và ngữ nghĩa của hợp ngữ và tạo trình biên dịch cho ngôn ngữ đó.”[8]
  • Assembly time là bước tính toán nơi trình biên dịch được chạy.

Các khái niệm[sửa|sửa mã nguồn]

Trình hợp dịch ( Assembler )[sửa|sửa mã nguồn]

Thông thường, một trình hợp dịch tân tiến tạo ra mã đối tượng người tiêu dùng ( object code ) bằng cách phiên dịch những lệnh hợp ngữ thành mã thực thi ( opcodes ) và nghiên cứu và phân tích những biểu danh ( symbolic names ) ứng với những vùng nhớ cùng những thực thể khác. [ 9 ] Việc dùng những biểu danh để tham chiếu là một tính năng then chốt của những trình hợp dịch, nó tiết kiệm chi phí một khối lượng lớn việc làm giám sát và sửa đổi thủ công bằng tay sau mỗi lần nâng cấp cải tiến ứng dụng. Hầu hết những trình hợp dịch đều tương hỗ macro nhằm mục đích giúp cho việc sửa chữa thay thế một nhóm lệnh bằng một định danh ngắn gọn. Trong quy trình dịch, nhóm lệnh tương ứng sẽ được chèn trực tiếp vào vị trí macro thay vì một lời gọi hàm ( subroutine ) .Một số trình hợp dịch cũng hoàn toàn có thể triển khai 1 số ít loại tối ưu hóa đơn cử theo tập lệnh. Một ví dụ đơn cử về điều này hoàn toàn có thể là trình hợp dịch x86 phổ cập từ những nhà sản xuất khác nhau. Hầu hết trong số chúng hoàn toàn có thể thực thi sửa chữa thay thế lệnh nhảy ( nhảy dài thay thế sửa chữa bằng nhảy ngắn hoặc tương đối ) trong bất kể số lần vượt qua, theo nhu yếu. Những trình hợp dịch khác thậm chí còn hoàn toàn có thể thực thi sắp xếp lại đơn thuần hoặc chèn những lệnh, ví dụ điển hình như 1 số ít trình hợp dịch cho kiến trúc RISC hoàn toàn có thể giúp tối ưu hóa lịch trình tập lệnh hài hòa và hợp lý để khai thác kênh chuyền tài liệu ( pipeline ) của CPU một cách hiệu suất cao nhất hoàn toàn có thể .Giống như những ngôn từ lập trình bắt đầu như Fortran, Algol, Cobol và Lisp, những trình hợp dịch đã có sẵn từ những năm 1950 và những thế hệ giao diện máy tính dựa trên văn bản tiên phong. Tuy nhiên, những trình hợp dịch Open tiên phong vì chúng đơn thuần hơn nhiều so với trình biên dịch cho những ngôn từ bậc cao. Điều này là do mỗi mnemonic cùng với những chính sách địa chỉ và toán hạng của một lệnh dịch trực tiếp thành những màn biểu diễn số của lệnh đó, mà không có nhiều toàn cảnh hoặc nghiên cứu và phân tích. Cũng đã có một số ít lớp dịch giả và trình tạo mã bán tự động hóa có những thuộc tính tương tự như cả hợp ngữ và ngôn từ bậc cao, với Speedcode có lẽ rằng là một trong những ví dụ được biết đến nhiều hơn .

Có thể có một số trình biên dịch với cú pháp khác nhau cho một cấu trúc CPU hoặc tập lệnh cụ thể. Chẳng hạn, một lệnh để thêm dữ liệu bộ nhớ vào một thanh ghi trong bộ xử lý họ x86 có thể là add eax,[ebx], trong cú pháp gốc của Intel, trong khi điều này sẽ được viết là addl (%ebx),%eax trong cú pháp của AT&T được dùng trong GNU Assembler. Mặc dù xuất hiện khác nhau, các hình thức cú pháp khác nhau thường tạo ra cùng một mã máy. Xem bên dưới. Một trình biên dịch đơn cũng có thể có các chế độ khác nhau để hỗ trợ các biến thể trong các hình thức cú pháp cũng như các diễn giải ngữ nghĩa chính xác của chúng (như cú pháp FASM, cú pháp TASM, chế độ lý tưởng, v.v., trong trường hợp đặc biệt của lập trình hợp ngữ x86).

Các trình hợp dịch nói chung dễ tạo hơn so với những chương trình dịch cho ngôn từ cấp cao. Những trình hợp ngữ tiên phong Open từ những thập niên 1950, trong buổi đầu sơ khai của máy tính đã tạo ra một bước ngoặt lớn so với những lập trình viên vốn rất căng thẳng mệt mỏi vì việc lập trình bằng ngôn từ máy. Các trình hợp dịch tân tiến thời nay, đặc biệt quan trọng cho những dòng chip RISC như MIPS, Sun SPARC và HP PA-RISC, thường tối ưu việc sắp xếp và đồng nhất những thông tư lệnh ( instruction scheduling ) để tận dụng những kênh chuyền tài liệu ( pipeline ) của CPU một cách hiệu suất cao .
Có hai loại trình hợp dịch dựa trên số lần truyền qua nguồn thiết yếu ( số lần trình biên dịch đọc nguồn ) để tạo tệp đối tượng người dùng .

  • Trình hợp dịch một lần đi qua mã nguồn một lần. Bất kỳ ký hiệu nào được sử dụng trước khi được xác định sẽ yêu cầu “errata” ở cuối mã đối tượng (hoặc, ít nhất, không sớm hơn điểm mà biểu tượng được xác định) báo cho trình liên kết hoặc trình tải “quay lại” và ghi đè lên giữ chỗ đã được để lại nơi sử dụng biểu tượng chưa xác định.
  • Trình hợp dịch nhiều lần tạo một bảng có tất cả các ký hiệu và giá trị của chúng trong các lượt đầu tiên, sau đó sử dụng bảng trong các lần truyền sau để tạo mã.

Trong cả hai trường hợp, trình biên dịch phải có năng lực xác lập size của mỗi lệnh trên những đường chuyền bắt đầu để tính địa chỉ của những ký hiệu tiếp theo. Điều này có nghĩa là nếu size của một hoạt động giải trí đề cập đến một toán hạng được xác lập sau phụ thuộc vào vào loại hoặc khoảng cách của toán hạng, trình biên dịch sẽ đưa ra ước tính bi quan khi lần tiên phong gặp thao tác và nếu cần, hãy đệm nó bằng một hoặc nhiều lệnh ” no-operation ” trong một lần vượt qua hoặc errata. Trong một trình biên dịch với tối ưu hóa lỗ nhìn trộm, những địa chỉ hoàn toàn có thể được thống kê giám sát lại giữa những lần chuyển để cho phép sửa chữa thay thế mã bi quan bằng mã được kiểm soát và điều chỉnh theo khoảng cách đúng mực từ tiềm năng .Lý do bắt đầu cho việc sử dụng bộ hợp dịch một lần là vận tốc hợp dịch – thường thì lần thứ hai sẽ nhu yếu tua lại và đọc lại nguồn chương trình trên băng hoặc đọc lại một chuỗi bìa đục lỗ. Các máy tính sau này có bộ nhớ lớn hơn nhiều ( đặc biệt quan trọng là tàng trữ đĩa ), có khoảng trống để triển khai toàn bộ những giải quyết và xử lý thiết yếu mà không cần đọc lại. Ưu điểm của trình hợp dịch nhiều lượt là việc không có errata làm cho quy trình link ( hoặc tải chương trình nếu trình biên dịch trực tiếp tạo mã thực thi ) nhanh hơn. r. [ 10 ]

Ví dụ: trong đoạn mã sau, trình hợp dịch một lần có thể xác định địa chỉ của BKWD tham chiếu ngược khi hợp dịch câu lệnh S2, nhưng không thể xác định địa chỉ của FWD tham chiếu chuyển tiếp khi hợp dịch câu lệnh nhánh S1; thật vậy, FWD có thể không được xác định. Trình hợp dịch hai lần sẽ xác định cả hai địa chỉ trong lần 1, vì vậy chúng sẽ được biết khi tạo mã trong lần 2.

S1   B    FWD

FWD   EQU *

BKWD  EQU *

S2    B   BKWD

Trình hợp dịch bậc cao[sửa|sửa mã nguồn]

Nhiều trình hợp dịch bậc cao còn hỗ trợ khả năng ngôn ngữ trừu tượng như:

Tham khảo phần Thiết kế ngôn từ bên dưới để rõ hơn .
Một chương trình viết bằng hợp ngữ gồm có một chuỗi những lệnh ( instructions ) dễ nhớ tương ứng với một luồng những thông tư khả thi ( executable ) mà khi được dịch bằng một trình hợp dịch, chúng có năng lực nạp được vào bộ nhớ đồng thời thực thi được. Ví dụ, bộ vi giải quyết và xử lý x86 / IA-32 hoàn toàn có thể triển khai được thông tư nhị phân sau ( bộc lộ ở dạng ngôn ngữ máy ) :

  • 10110000 01100001 (thập lục phân: 0xb061)

Lệnh trên tương tự với một thông tư hợp ngữ dễ nhớ hơn sau :

  • mov al, 061h

Chỉ thị lệnh trên có nghĩa là : gán giá trị thập lục phân 61 ( 97 dạng thập phân ) cho thanh ghi trong bộ vi giải quyết và xử lý có tên là ” al “. Thuật từ ” mov ” là mã thực thi ( operation code / opcode ), được người thiết kế tập lệnh đặt tên thay thế sửa chữa cho từ ” move “, những đối / tham số của lệnh theo sau và ngăn cách với opcode bởi một dấu phảy “, ” .Trình hợp dịch triển khai quy đổi hợp ngữ sang ngôn từ máy và trình phân dịch ( disassembler ) thực thi quy trình trên ngược lại. Không giống những ngôn từ bậc cao, những thông tư hợp ngữ cơ bản thường có mối liên hệ tương ứng 1-1 với những thông tư ngôn từ máy. Tuy nhiên trong 1 số ít trường hợp, một trình hợp dịch hoàn toàn có thể bổ trợ những lệnh giả ( pseudo-instructions ) vào tập lệnh ngôn từ máy nhằm mục đích phân phối những công dụng được dùng liên tục. Hầu hết những trình hợp dịch đa công dụng đều phân phối thêm một tập macro phong phú và đa dạng để nhà phân phối thiết bị và lập trình viên hoàn toàn có thể tạo những mã lệnh và những dãy tài liệu phức tạp .Mỗi kiến trúc máy tính đều có ngôn từ máy riêng và do đó cũng có hợp ngữ riêng, chúng phân biệt với nhau bằng số lượng và kiểu của những lệnh mà chúng tương hỗ. Chúng cũng hoàn toàn có thể khác nhau về số lượng và kích cỡ của những thanh ghi cũng như cách biểu lộ những kiểu tài liệu trong bộ tàng trữ ( bộ nhớ ). Hầu hết những máy tính tác dụng chung đều có năng lực thực thi cùng công dụng nhưng cách mà chúng thực thi thì khác nhau, điều đó phản ánh sự khác nhau giữa những hợp ngữ tương ứng với mỗi kiểu máy tính .

Ngôn ngữ máy ( Machine language )[sửa|sửa mã nguồn]

Ngôn ngữ máy được kiến thiết xây dựng từ những thông tư và những lệnh rời rạc, tùy vào mỗi kiến trúc giải quyết và xử lý mà tập lệnh được xác lập bởi những đặc trưng riêng :

  • Các thanh ghi dùng cho tính toán số học
  • Cách bố trí bộ nhớ và tính địa chỉ
  • Cách điều khiển rẽ nhánh
  • Các kiểu đánh địa chỉ đặc thù dùng để giải các toán hạng

Nhiều lệnh phức tạp được tạo dựng bằng cách tích hợp nhiều thông tư đơn thuần với nhau, những thông tư này tuân theo nguyên tắc máy tính Von Neumann, tức là thực thi tuần tự và rẽ nhánh theo lệnh phân luồng. Một số lệnh nổi bật xuất hiện trong hầu hết những tập lệnh gồm có :

  • Lệnh gán
    • Gán cho một thanh ghi (một vùng nhớ tạm thời trong CPU) một giá trị hằng số xác định
    • Chuyển dữ liệu từ một vùng nhớ sang một thanh ghi hoặc ngược lại. Thao tác này dùng để chuẩn bị dữ liệu cho một tính toán sau đó hoặc để lưu kết quả của một tính toán trước đó.
    • Đọc /ghi dữ liệu từ/vào các thiết bị phần cứng
  • Lệnh cho tính toán
    • Cộng, trừ, nhân hoặc chia các giá trị chứa trong các thanh ghi và lưu kết quả vào một thanh ghi
    • Thực hiện các phép thao tác bit “và”/”hoặc” (AND/OR) trên một cặp thanh ghi, hoặc phép phủ định bit trên một thanh ghi
    • So sánh nhỏ hơn/lớn hơn/ bằng nhau giữa hai giá trị lưu trong hai thanh ghi
  • Lệnh điều khiển rẽ nhánh
    • Nhảy tới một vị trí trong chương trình và thực thi các lệnh ở đó
    • Nhảy tới một vị trí khác nếu một điều kiện nhất định được thỏa mãn
    • Nhảy tới một vị trí nhưng lưu lại vị trí của lệnh tiếp theo để làm điểm nhảy trở về (thường là một lời gọi hàm)

Một số máy tính gồm có những thông tư lệnh phức tạp trong tập lệnh của chúng. Một lệnh phức tạp thường triển khai những tác vụ cần nhiều thông tư lệnh trên nhiều máy khác nhau, chúng thực thi trong nhiều bước, điều khiển và tinh chỉnh nhiều đơn vị chức năng tính năng. Danh sách minh họa một số ít lệnh phức tạp :

  • Lưu lại nhiều thanh ghi trên ngăn xếp chỉ một lần
  • Di chuyển các khối vùng nhớ lớn
  • Các phép toán dấu phảy động phức tạp (sine, cosine, square root, etc.)
  • Các lệnh ALU liên kết với một toán hạng từ bộ nhớ thay vì với một thanh ghi

Một kiểu lệnh phức tạp được dùng phổ cập thời nay là những phép toán SIMD hay những lệnh vector ( vector instruction ) có năng lực thực thi cùng một phép toán số học trên nhiều phần của tài liệu trong cùng một thời gian. Các lệnh SIMD ( single instruction multile data ) được cho phép triển khai song song nhiều thuật toán tương quan đến giải quyết và xử lý âm thanh, hình ảnh và video một cách thuận tiện. Nhiều tập lệnh thực thi SIMD tích hợp trong CPU đã được thương mại kinh doanh hóa dưới những tên thương hiệu như MMX và SSE, SSE2, SSE3, SSE4 ( Intel ), 3DN ow ! ( AMD ), AltiVec ( IBM ), tm3260 và tm5250 ( Nexperia – Philips ) …
Chỉ thị lệnh trong hợp ngữ nói chung là đơn thuần, không giống như trong ngôn từ bậc cao. Mỗi thông tư lệnh nổi bật thường gồm có một mã lệnh ( operation / opcode hay đơn thuần là instruction ) theo với một hoặc nhiều toán hạng ( operands ), hoặc không có toán hạng nào. Hầu hết những thông tư lệnh đều tìm hiểu thêm tới một giá trị đơn hoặc cặp giá trị. Mỗi thông tư lệnh thường được mã hóa tương ứng trực tiếp với một thông tư ngôn ngữ máy khả thi đơn lẻ. Những thành phần thường thì có trong hầu hết những hợp ngữ gồm có :

  • Các định nghĩa dữ liệu (Data definitions). Các chỉ thị phụ cho phép lập trình viên dành riêng một vùng nhớ cho các câu lệnh ngôn ngữ máy tham khảo tới. Vùng nhớ này thường được khởi tạo bằng các ký tự, chuỗi và các kiểu dữ liệu cơ sở khác
  • Nhãn (Labels). Các định nghĩa dữ liệu được tham chiếu tới bằng cách sử dụng các định danh (nhãn hoặc ký hiệu) do lập trình viên chỉ định. Chúng có thể là các hằng số, các biến hay các thành phần của cấu trúc. Nhãn cũng có thể được gán cho các vùng mã thực thi như địa chỉ bắt đầu của một thủ tục hoặc đích nhảy tới của lệng GOTO. Hầu hết các trình hợp dịch đều có khả năng quản lý các nhãn một cách linh hoạt, giúp cho lập trình viên thao tác trên nhiều không gian tên khác nhau, tự động tính độ lệch địa chỉ trong các cấu trúc dữ liệu và tham chiếu tới các nhãn chứa giá trị định trước hay kết quả của một tính toán.
  • Chú dẫn (Comments). Giống như nhiều ngôn ngữ máy tính khác, hợp ngữ cũng hỗ trợ việc thêm các chú dẫn vào trong mã nguồn, chúng sẽ được trình hợp dịch bỏ qua trong quá trình biên dịch
  • Tập lệnh bó (Macros). Hầu hết các trình hợp dịch đều nhúng ngôn ngữ macro vào tập lệnh chính. Lập trình viên dùng macro để tránh phải lặp lại những đoạn mã tương tự, trong quá trình tiền biên dịch tùy vào các đối số của macro mà các lệnh trong thân macro sẽ được sửa đổi và chèn vào vị trí gọi macro. Ngoài ra macro cũng được nhà sản xuất thiết bị dùng để đóng gói các phép tính đặc biệt ví dụ như:
    • Các bộ vi xử lý 8 bit thường dùng macro để tăng hoặc giảm một giá trị 16 bit lưu trong hai byte liên tục, đây là phép toán thường phải thực hiện trong ba hoặc bốn chỉ thị lệnh đơn lẻ. (bộ vi xử lý MOS Technology 6502)
    • Nhà sản xuất cũng hỗ trợ các macro để dùng cho các giao tiếp hệ thống như các thao tác vào/ra (I/O) hay các yêu cầu cấp thấp từ hệ điều hành. Trong các máy tính lớn của IBM, các thư viện macro khổng lồ cung cấp các phương thức truy xuất và các dịch vụ hệ thống khác

Những tính năng trên được mượn từ những phong cách thiết kế ngôn từ bậc cao nên đã đơn giản hóa những yếu tố trong lập trình và bảo dưỡng mã nguồn cấp thấp. Mã nguồn hợp ngữ thô cũng hoàn toàn có thể tạo ra bằng những trình biên dịch ngôn từ bậc cao ( compiler ) hoặc bằng những trình phân dịch mã máy ( disassembler ), nhưng chúng thường không có chú dẫn cũng như những định danh dễ hiểu nên rất khó đọc .Ngoài những đặc tính cơ bản ở trên, tuy nhiên vài hợp ngữ cũng có những tính năng ngoại lệ như :

  • Nhiều trình hợp dịch bao gồm các ngôn ngữ macro rất phức tạp, cho phép phối hợp với các phần tử của ngôn ngữ bậc cao như các biến tượng trưng, các lệnh điều kiện, các thao tác chuỗi và các phép tính số học. Do đó một macro có thể thay thế một lượng lớn các lệnh hợp ngữ hoặc các định nghĩa dữ liệu dựa trên các tham số của nó. Nó có thể dùng để sinh ra các cấu trúc kiểu bản ghi hay các vòng lặp “mở” (unrolled) hoặc dựa trên các tham số phức tạp nó có thể giải quyết trọn vẹn một thuật giải.

Trong quá khứ[sửa|sửa mã nguồn]

Về mặt lịch sử dân tộc, đã từng có một số lượng lớn những chương trình đã được viết trọn vẹn bằng hợp ngữ. Trước khi Open ngôn từ C vào những năm 1970 và đầu thập niên 1980, những hệ quản lý độc quyền phần nhiều được viết bằng hợp ngữ. Nhiều ứng dụng thương mại cũng được viết bằng hợp ngữ, gồm có một khối lượng lớn những ứng dụng cho máy tính lớn của IBM được những tập đoàn lớn lớn viết. Cuối cùng thì ngôn từ COBOL và FORTRAN đã thay thế sửa chữa hợp ngữ mặc dầu còn nhiều tổ chức triển khai vẫn giữ lại những kiến trúc ứng dụng kiểu hợp ngữ trong suốt thập niên 1980. Hầu hết những máy vi tính ( micro-computer ) buổi đầu đa phần quản lý và vận hành bằng hợp ngữ, gồm có những hệ quản lý và điều hành và những ứng dụng lớn. Lý do là bởi những mạng lưới hệ thống này bị hạn chế về tài nguyên, thiết bị, bộ nhớ và kiến trúc hiển thị cũng như những dịch vụ mạng lưới hệ thống dễ lỗi. Lý do quan trọng hơn, có lẽ rằng là sự thiếu vắng những trình biên dịch bậc cao tiên tiến và phát triển vốn thích hợp cho những mạng lưới hệ thống vi tính. Các ứng dụng lớn viết bằng hợp ngữ nổi bật như hệ điều hành quản lý CP / M và MS-DOS, bảng tính spreadsheet và Lotus-123 trong những máy IBM-PC đời đầu, và nhiều những game show phổ cập cho máy Commodore 64. Thậm chí tới những năm 1990, nhiều những game show video vui chơi vẫn được viết bằng hợp ngữ, gồm có những game show cho máy Mega Drive / Genesis và Super Nintendo Entertainment System .Ngoài ra còn một dạng ” ứng dụng ” không được khuyến khích đó là virus máy tính. Trong những những năm ‘ 80 và đầu những năm ‘ 90 hầu hết virus máy tính được viết bằng hợp ngữ, nguyên do là sự giảm thiểu size của virus cũng như năng lực can thiệp sâu vào mạng lưới hệ thống của hợp ngữ .
Đã từng có nhiều tranh luận về tiện lợi và hiệu năng của hợp ngữ so với những ngôn từ bậc cao, tuy thời nay người ta ít chú ý quan tâm tới điều đó nữa. Hợp ngữ vẫn đóng vai trò quan trọng trong 1 số ít nhu yếu thiết yếu. Nói chung, những trình biên dịch tân tiến thời nay đều có năng lực biên dịch những ngôn từ bậc cao thành mã mà hoàn toàn có thể thực thi nhanh tối thiểu bằng hợp ngữ. Độ phức tạp của những bộ vi giải quyết và xử lý tân tiến được cho phép tối ưu mã một cách hiệu suất cao, hơn thế nữa, phần nhiều thời hạn hoạt động giải trí của CPU rơi vào trạng thái rỗi bởi nó phải đợi tác dụng từ cá những thống kê giám sát ” thắt cổ chai ” như những thao tác I / O và truy xuất bộ nhớ. Vì thế vận tốc thực thi mã thô ( raw code ) trở thành yếu tố ít quan trọng so với hầu hết lập trình viên, sự Open những ngôn từ thông dịch ( interpreted language ) ngày càng nhiều là một dẫn chứng cho điều này .Ngày nay có 1 số ít ít trường hợp mà những chuyên viên thực sự muốn dùng hợp ngữ cho việc làm của họ là :

  • Khi các thiết bị hoạt động độc lập mà không cần tài nguyên hay các thư viện liên kết với ngôn ngữ bậc cao. Đây có lẽ là trường hợp phổ biến nhất
  • Khi cần giao tiếp trực tiếp với phần cứng như trình điều khiển thiết bị, hoặc khi muốn dùng các chỉ thị vi xử lý mà trình biên dịch không tận dụng được
  • Khi cần tối ưu khắt khe như các thuật toán có dùng vòng lặp tiêu tốn nhiều năng lực xử lý
  • Khi một hệ thống cần phải viết mã thủ công để tận dụng nguồn tài nguyên hạn hẹp. Ngày nay điều đó có vẻ không phổ biến nữa do giá cả CPU giảm đồng thời hiệu năng hoạt động CPU đã cải thiện đáng kể.
  • Khi các ngôn ngữ bậc cao không thể áp dụng được trên một CPU mới hoặc CPU chuyên dụng.

Ngày nay lập trình viên hoàn toàn có thể chọn một ngôn từ cấp thấp như C để viết những ứng dụng cần hiệu năng cao, tuy điều đó không thuận tiện bởi một ứng dụng viết bằng C sẽ không hiểu quả hơn ứng dụng viết bằng hợp ngữ. Ngoài ra, hợp ngữ vẫn còn được giảng dạy trong hầu hết những chương trình Khoa học máy tính, những khái niệm nền tảng vẫn có ý nghĩa quan trọng. Chẳng hạn như số học nhị phân, cấp phép bộ nhớ, giải quyết và xử lý ngăn xếp, mã hóa tập ký tự, giải quyết và xử lý ngắt và phong cách thiết kế trình dịch vẫn được nghiên cứu và điều tra một cách chi tiết cụ thể và mạng lưới hệ thống bất kể phần cứng máy tính hoạt động giải trí như thế nào. Cách hoạt động giải trí của máy tính được xác lập bởi tập lệnh cơ sở của nó, vì thế để hiểu những khái niệm cơ sở đó cách tốt nhất là điều tra và nghiên cứu hợp ngữ của nó. May thay, phần đông những máy tính văn minh đều có những tập lệnh tương tự như nhau, do đó chỉ nắm được một hợp ngữ cũng có đủ để hiểu được những khái niệm cơ bản ở những hợp ngữ trên mạng lưới hệ thống khác .

Các ứng dụng nổi bật[sửa|sửa mã nguồn]

Hợp ngữ mã cấp thấp thường được dùng cho BIOS lưu trong ROM của một mạng lưới hệ thống để khởi tạo và kiểm tra phần cứng mạng lưới hệ thống trước khi khởi tạo hệ quản lý. Khi khởi tạo phần cứng hoàn thành xong, quyền điều khiển và tinh chỉnh mạng lưới hệ thống sẽ được chuyển qua cho những phần mã thự thi khác ( thường được viết bằng ngôn từ bậc cao ). Điều này cũng đúng cho hầu hết những trình khởi động ( boot loader ) .

Nhiều trình biên dịch chuyển đổi các ngôn ngữ bậc cao thành hợp ngữ trước khi biên dịch thực sự, điều này cho phép kiểm tra mã phục vụ mục đích gỡ rối và tối ưu. Các ngôn ngữ cấp thấp như C thường cung cấp các cú pháp đặc biệt cho phép nhúng trực tiếp hợp ngữ vào mã nguồn. Các chương trình tận dụng tính năng này như Nhân Linux có thể tạo ra các tầng trừu tượng để sử dụng trên nhiều kiến trúc phần cứng khác nhau.

Hợp ngữ cũng có giá trị trong kỹ thuật dịch ngược ( reverse engineering ). Các chương trình lớn vốn chỉ được phân phối dưới dạng mã máy, chúng thường thuận tiện dịch ngược thành hợp ngữ để kiểm tra nhưng rất khó dịch ngược ra mã ngôn từ bậc cao .

Liên kết ngoài[sửa|sửa mã nguồn]

5/5 - (1 vote)
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments