Làm thế nào để so sánh số nguyên làm việc trong nội bộ?


18

Ví dụ: khi so sánh hai số nguyên như sau trong một ngôn ngữ giống như C:

if (3 > 2) {
    // do something
}

Làm thế nào để đánh giá liệu 3 lớn hơn 2 (đúng) hay không (sai) được thực hiện trong nội bộ?


19
Câu trả lời hiện tại là ổn đối với trường hợp khi so sánh là về biểu thức biến, nhưng thiếu từ chối trách nhiệm rằng nhiều trình biên dịch hiện đại sẽ xem xét đoạn mã của bạn, phát hiện ra rằng biểu thức sẽ luôn đúng (vì nghĩa đen) và chỉ cần bỏ qua ifhoàn toàn , đi thẳng vào mã hóa do something.
SJuan76

3
Bản sao có thể có của Máy tính làm việc như thế nào?

3
@Snowman Tôi không đồng ý. Bất kỳ yêu cầu lập trình "làm việc này" có thể được cô đọng cho câu hỏi đó, nhưng điều đó không làm cho chúng trùng lặp.
dùng1643723

1
@ user1643723 Nó hoạt động khi chức năng được đề cập là một opcode cụ thể.
chrylis -on đình công-

1
@ user1643723 Câu hỏi là hỏi về cách máy tính thực hiện một thao tác cơ bản và câu trả lời trên cùng thảo luận về cổng logic và bảng logic. Hai chủ đề được bao quát rộng rãi trong câu trả lời hàng đầu của mục tiêu dupe, cũng trả lời câu hỏi của bạn.

Câu trả lời:


61

Tất cả các cách xuống lỗ thỏ, eh? OK tôi sẽ thử.

Bước 1. Từ C sang ngôn ngữ máy

Trình biên dịch C biến đổi so sánh của bạn với opcodes được lưu trữ trong ngôn ngữ máy . Ngôn ngữ máy là một chuỗi các số mà CPU diễn giải theo hướng dẫn. Trong trường hợp này sẽ có hai opcodes: "trừ khi mang" và "nhảy nếu mang". Nói cách khác, 2 được trừ từ 3 trong một lệnh và lệnh tiếp theo sẽ kiểm tra xem nó có bị tràn không. Những điều này sẽ được đi trước bởi hai hướng dẫn để tải các số 2 và 3 vào các vị trí có thể so sánh chúng.

MOV AX, 3    ; Store 3 in register AX
MOV BX, 2    ; Store 2 in register BX
SUB AX, BX   ; Subtract BX from AX
JC  Label    ; If the previous operation overflowed, continue processing at memory location "Label"

Mỗi ở trên có một đại diện nhị phân; ví dụ, mã cho SUB2Dhex hoặc 00101101ở dạng nhị phân.

Bước 2. Mã hóa thành ALU

Opcodes số học thích ADD, SUB, MUL, và DIVthực hiện các toán số nguyên cơ bản sử dụng một ALU hoặc số học Đơn vị logic được xây dựng vào CPU. Số được lưu trữ trong sổ đăng ký bởi một số opcodes; các opcodes khác hướng dẫn chip gọi ALU để làm toán trên bất cứ thứ gì được lưu trữ trong các thanh ghi tại thời điểm đó.

Lưu ý: Tại thời điểm này, chúng tôi vượt xa mọi thứ mà bất kỳ kỹ sư phần mềm nào cũng lo lắng nếu làm việc với 3GL như C.

Bước 3. ALU, nửa bộ cộng và bộ cộng đầy đủ

Bạn có biết rằng tất cả các phép toán mà bạn biết có thể được giảm xuống thành một loạt các phép toán NOR không? Và đó chính xác là cách ALU hoạt động.

ALU chỉ biết cách làm việc với các số nhị phân và chỉ có thể thực hiện các hoạt động logic như OR, NOT, AND và XOR. Việc thực hiện phép cộng và phép trừ nhị phân được thực hiện bằng một loạt các phép toán logic được sắp xếp theo một cách nhất định, trong một hệ thống con được gọi là bộ cộng . Các hệ thống con này bao gồm một mạng "nửa cộng" hoạt động trên hai bit và xác định tổng bit đơn của chúng và cờ mang bit đơn. Bằng cách kết hợp những thứ này lại với nhau, ALU có thể thực hiện các thao tác trên các số có bit 8, 16, 32, v.v.

Một nửa Adder

Còn phép trừ thì sao? Phép trừ chỉ là một hình thức bổ sung khác:

A - B = A + (-B)

ALU tính -Bbằng cách lấy bổ sung của hai số B. Khi nó được chuyển đổi thành âm, việc gửi giá trị cho bộ cộng sẽ dẫn đến một phép toán trừ.

Bước 4: Bước cuối cùng: Bóng bán dẫn trên chip

Các hoạt động của các bộ cộng được thực hiện bằng cách sử dụng kết hợp các thành phần điện tương tác để tạo ra "cổng logic", chẳng hạn như các bộ phận được tìm thấy trong logic transitor-transitor hoặc TTL, hoặc trong CMOS . Nhấn vào đây để xem một vài ví dụ để xem làm thế nào chúng được nối dây.

Trên một con chip, tất nhiên, các "mạch" này được thực hiện trong hàng triệu bit vật liệu dẫn điện và không dẫn điện nhỏ, nhưng nguyên tắc này giống như khi chúng là các thành phần có kích thước đầy đủ trên một chiếc bánh mì. Xem video này cho bạn thấy tất cả các bóng bán dẫn trên một vi mạch thông qua ống kính của kính hiển vi điện tử.

Một số lưu ý bổ sung:

  1. Mã bạn đã viết thực sự sẽ được trình biên dịch tiền mã hóa và không được thực thi trong thời gian chạy, bởi vì nó chỉ bao gồm các hằng số.

  2. Một số trình biên dịch không biên dịch thành mã máy mà giới thiệu một lớp khác, chẳng hạn như mã byte trung gian Java hoặc ngôn ngữ trung gian .NET. Nhưng cuối cùng tất cả được thực hiện thông qua ngôn ngữ máy.

  3. Một số phép toán không thực sự được tính toán; chúng được tra cứu trong các bảng lớn trên một đơn vị đồng xử lý số học hoặc chứa kết hợp tra cứu và tính toán hoặc nội suy. Một ví dụ sẽ là hàm để tính căn bậc hai . Mỗi CPU PC hiện đại đều có bộ xử lý điểm nổi được tích hợp trong mỗi lõi CPU.


3
FWIW, tham chiếu đến TTL có thể gây nhầm lẫn vì hầu như không có bộ xử lý hiện đại nào sử dụng tín hiệu TTL, hầu hết sử dụng FET CMOS và điện áp thấp hơn thay vì 5v BJT.
whatsisname

2
CMOS chắc chắn sẽ là một tài liệu tham khảo tốt hơn so với TTL, như @whatsisname gợi ý, bởi vì không chỉ chính xác hơn những gì diễn ra trong các bộ xử lý hiện đại, nó còn đơn giản hơn nhiều về mặt khái niệm.
Jules

3
@JackAidley đó là ý nghĩa của phần này: "Nói cách khác, 2 được trừ từ 3 trong một hướng dẫn và hướng dẫn tiếp theo sẽ kiểm tra xem nó có bị tràn không."
KutuluMike

1
Nitpicking: Tôi cho rằng CMPsẽ được sử dụng, không phải SUB- nhưng sau đó một lần nữa ít nhiều là " SUBtrong đó kết quả bị bỏ qua và chỉ các cờ được đặt"
Hagen von Eitzen

5
Định nghĩa của bạn về một nửa và bộ cộng đầy đủ là không chính xác. Một nửa cộng có hai đầu vào 1 bit và trả về tổng và mang. Một bộ cộng đầy đủ có một đầu vào mang theo bổ sung nhưng vẫn chỉ là một bit. Có nhiều cách để tạo một bộ cộng N-bit, đơn giản nhất là một bộ cộng mang gợn, chỉ là một chuỗi của bộ cộng N đầy đủ. Trong thực tế đối với Ns lớn hơn, điều này có độ trễ khá tệ nên các thiết kế phức tạp hơn được sử dụng trong các thiết kế CPU hiện đại.
Voo
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.