Khác biệt giữa bản sửa đổi của “Ngôn ngữ máy”

Nội dung được xóa Nội dung được thêm vào
Không có tóm lược sửa đổi
Dòng 1:
'''Ngôn ngữ máy''' (còn được gọi '''máy ngữ''' hay '''mã máy'''; [[tiếng Anh]] là ''machine language'' hay ''machine code'') là một loạitập [[ngôn ngữ lập trình]] trong đó, mọicác [[chỉChỉ thị (máy tính)|chỉ thị]] đều được biểu diễn bằng các con số [[hệ nhị phân|nhị phânCPU]] 0của máy 1.tính Đâytrực tiếp [[ngônthực ngữthi. lậpMỗi trình]]chỉ thếthị hệthực đầuhiện tiên. Tuy khó đọcmột chức khónăng sửxác dụngđịnh, nhưng ngôndụ ngữnhư máytải dữ ngônliệu, ngữnhảy duyhay nhấttính toán bộsố [[CPU|vinguyên xử lí]] có thể nhận biết và thực hiệntrên một cáchđơn trựcvị tiếpdữ (tứcliệu khôngcủa cầnthanh dịchghi sangCPU bấthay bộ ngôn ngữ nào khác)nhớ. LợiTất điểm chính củacả các [[phần mềm|chương trình]] viết bằng ngôn ngữ máy là có thể được thực thi mộttrực cáchtiếp nhanhbởi chóng (nhờ [[CPU|vi xửđều lí]] các thể xử líchuỗi các [[chỉ thị (máy tính)|chỉ thị]] viết bằng ngôn ngữ máy một cách trực tiếp), dù vậy, nó lại không [[độc lập nền]] (''platform-independent'') – tức khi đem qua một máy có loại [[CPU|vi xử lí]] khác, [[phần mềm|chương trình]] có thể không thực thi được, do [[CPU|vi xử lí]] khác loại có thể có các [[tập lệnh]] khácnày.
 
Mã máy nhị phân (khác với mã hợp ngữ) có thể được xem như là phương thức biểu diễn thấp nhất của một chương trình đã biên dịch hay hợp dịch, hay là [[ngôn ngữ lập trình]] nguyên thủy phụ thuộc vào phần cứng (ngôn ngữ lập trình thế hệ đầu tiên). Mặc dù chúng ta hoàn toàn có thể viết chương trình trực tiếp bằng mã nhị phân, việc này rất khó khăn và dễ gây ra những lỗi nghiêm trọng vì ta cần phải quản lí từng [[bit]] đơn lẻ và tính toán các địa chỉ và hằng số học một cách thủ công. Do đó, ngoại trừ những thao tác cần tối ưu và gỡ lỗi chuyên biệt, chúng ta rất hiếm khi làm điều này.
 
Hiện nay, hầu như tất cả các chương trình máy tính trong thực tế đều được viết bằng các ngôn ngữ bậc cao hay (đôi khi) hợp ngữ, và sau đó được dịch thành mã máy thực thi bằng các công cụ phụ trợ như trình biên dịch, trình hợp dịch hay trình liên kết. Ngoài ra, các chương trình được viết bằng ngôn ngữ [[Thông dịch (máy tính)|thông dịch]] thì được dịch sang mã máy nhờ trình thông dịch tương ứng (có thể xem như là trình thực thi hay trình xử lí). Các trình thông dịch này thường bao gồm các mã máy thực thi trực tiếp (sinh ra từ mã nguồn hợp ngữ hay các ngôn ngữ bậc cao).
 
== Các chỉ thị mã máy ==
Mọi [[vi xử lý]] hay họ vi xử lí đều có những tập chỉ thị mã máy riêng biệt. Các chỉ thị này là các mẫu bit được thiết kế tương ứng với những lệnh khác nhau của máy tính. Do đó, những tập chỉ thị này là riêng biệt của một lớp vi xử lí thuộc cùng một kiến trúc máy tính. Những thiết kế vi xử lí kế thừa thường bao gồm các chỉ thị của vi xử lí tiền nhiệm cùng với các chỉ thị mới. Đôi khi, các thiết kế kế thừa loại bỏ hay thay đổi chức năng một số mã chỉ thị (vì chúng cần dùng cho mục đích mới), gây ảnh hưởng đến sự đồng bộ mã nguồn ở một mức độ nhất định. Thậm chí, các vi xử lí đồng bộ cận hoàn toàn cũng có những hành vi bị thay đổi đối với một số chỉ thị, nhưng điều này rất hiếm xảy ra. Các hệ thống còn có thể khác nhau ở một số thành phần khác như phương thức sắp xếp bộ nhớ, hệ điều hành hay thiết bị ngoại vi. Vì các chương trình hay phụ thuộc vào các yếu tố này, các hệ thống khác nhau khó có thể chạy cùng một mã máy, ngay cả khi chúng sử dụng cùng một loại vi xử lí.
 
Một tập chỉ thị có thể có độ dài chỉ thị thống nhất hay biến động. Cách các bit được sắp xếp thay đổi rất lớn giữa các kiến trúc khác nhau hay các loại chỉ thị khác nhau. Hầu hết các chỉ thị có một hay nhiều vùng để phân biệt các chỉ thị cơ sở (như tính toán hay nhảy) và các chỉ thỉ thực (như cộng hay so sánh), và các vùng khác biểu diễn loại toán hạng, phương thức biểu diễn địa chỉ, các chỉ số địa chỉ hay các giá trị thực (như toán hạng hằng được chứa trong chỉ thị như vậy được gọi là ''giá trị tức thời).''
 
Not all machines or individual instructions have explicit operands. An accumulator machine has a combined left operand and result in an implicit accumulator for most arithmetic instructions. Other architectures (such as 8086 and the x86-family) have accumulator versions of common instructions, with the accumulator regarded as one of the general registers by longer instructions. A stack machine has most or all of its operands on an implicit stack. Special purpose instructions also often lack explicit operands (CPUID in the x86 architecture writes values into four implicit destination registers, for instance). This distinction between explicit and implicit operands is important in machine code generators, especially in the register allocation and live range tracking parts. A good code optimizer can track implicit as well as explicit operands which may allow more frequent constant propagation, constant folding of registers (a register assigned the result of a constant expression freed up by replacing it by that constant) and other code enhancements.
 
== Chương trình ==