2013-06-24 26 views
7

Gần đây tôi đã tham gia khóa học Logic kỹ thuật số và đã học tất cả về AND, OR và các loại logic khác. Một điều chúng tôi đã không đề cập đến, đó là điều hoàn toàn cần thiết để lập trình, là các tuyên bố if và nó khiến tôi khá tò mò về cách chúng hoạt động. Dự đoán tốt nhất của tôi là nó chỉ đơn giản là một bộ ghép kênh 2: 1, và khi bạn thêm nhiều hơn else thì nó sẽ là 4: 1 và 8: 1 nhưng điều đó có vẻ quá phức tạp đối với một khái niệm đơn giản như vậy.Tuyên bố "if" ở cấp độ của bóng bán dẫn là gì?

Bất kỳ ai cũng biết câu lệnh if thực sự dịch là gì?

+0

Câu hỏi hay! câu trả lời phức tạp mặc dù. Bạn cần phải nhìn thấy nó xảy ra để hiểu nó hoàn toàn, tôi khuyên bạn nên viết một ví dụ đơn giản, biên dịch nó, gắn nó với một trình gỡ rối, và bước qua nó, một hướng dẫn tại một thời điểm. – Wug

+0

@wug thats một ý tưởng tuyệt vời, cảm ơn. – Nealon

Trả lời

1

Bạn quên rằng các chương trình được thực hiện dưới dạng hướng dẫn riêng lẻ và hướng dẫn riêng lẻ (ít nhất trong trường hợp đơn giản nhất) thực thi tuần tự.

Vì vậy, đối if (a + 4 > 5) một lệnh sẽ được tải a vào một thanh ghi, hướng dẫn khác sẽ thêm 4, hướng dẫn khác sẽ so sánh tổng để 5. Sau đó, một lệnh sẽ kiểm tra "mã điều kiện" từ so sánh và thực hiện lệnh sau ngay lập tức (thực thi "if body") hoặc "nhảy" tới vị trí trong bộ nhớ một vài (hoặc vài chục) lệnh (bỏ qua " if body ").

Có logic kỹ thuật số trong đó, nhưng ở cấp độ thấp hơn, quyết định cách thực hiện từng lệnh riêng lẻ.

+0

cũng thats không có nơi gần như là thú vị ... darn. Cảm ơn mặc dù – Nealon

+0

@Nealon - Có những máy tính nhận được nhiều "gần gũi hơn với silicone". Tôi đã làm việc trên một nơi mà việc lựa chọn lệnh tiếp theo được điều khiển bởi một mảng logic lập trình - về bản chất là một mảng AND/OR lớn. Đặt trong các điều kiện và nhận ra địa chỉ hướng dẫn tiếp theo, và sự lựa chọn có thể nằm trong khoảng 10-20 "mục tiêu chi nhánh" khác nhau, nếu điều đó có ý nghĩa. –

+0

vâng, chúng tôi cũng học về PLA trong lớp đó. Điều đó thật thú vị, nhưng tôi thực sự hy vọng nó thú vị hơn. Đó là cơ bản (và tôi biết tôi có thể hạ thấp nó xuống) một loạt các câu lệnh 'goto', đúng không? – Nealon

1

Tuyên bố thích hợp if chuyển thành thứ gì đó cao hơn một chút so với logic bán dẫn. Các câu lệnh if thường được thực hiện dưới dạng các nhánh có điều kiện (giả sử không tối ưu), hoặc tăng bộ đếm chương trình theo số tiền mặc định hoặc đặt giá trị đó vào giá trị được chỉ định trong nhánh dựa trên điều kiện được đánh giá là đúng hay sai (thường là 1 hoặc 0).

0

if là một hoạt động điều khiển luồng trong ngôn ngữ lập trình, không phải là khái niệm thể hiện trong logic kỹ thuật số. Nếu lớp học của bạn bao gồm các máy móc liên quan đến hướng dẫn lắp ráp như jump (Tôi không chắc chắn tôi đã bao giờ học được rằng), đó là những gì một tuyên bố if được thực hiện.

-1

Như những người khác ở trên đã nêu, có các trình so sánh logic cuối cùng đưa ra các quyết định này. Có rất nhiều công cụ so sánh khác nhau tùy thuộc vào nhu cầu thiết kế (điện, diện tích, xoay, đồng hồ hay không, vv). Các bộ so sánh được tạo ra từ một số cổng CMOS NMOS/CMOS.

Nhìn trên trang wikipedia để so sánh và xem xét công cụ so sánh chốt động. Tôi không có đủ đại diện để đăng một không may.

Đây là ví dụ về bộ so sánh chốt động. Tùy thuộc vào việc triển khai có hoạt động cao hay thấp, hệ thống sẽ đồng hồ kiến ​​trúc ở đây để so sánh hai giá trị và câu lệnh đánh giá.

1

Đã lâu rồi tôi mới tham gia lớp kiến ​​trúc máy tính, vì vậy hãy tha thứ cho tôi nếu tôi hơi mơ hồ với câu trả lời này.

Tất cả các hướng dẫn mà máy tính của bạn thực thi xuất phát từ bộ nhớ hướng dẫn và tôi tin rằng có một số biểu thị địa chỉ của lệnh để thực thi.

hướng dẫn điển hình có nhiều phần, 1 cho mã lệnh và các phần thông thường cho tối đa 2 thanh ghi nguồn, thanh ghi đích và một số thứ khác mà tôi chưa phải suy nghĩ trong hơn 4 năm.

Dù sao, một trong các mã lệnh thường là một bước nhảy có điều kiện và nếu bạn có thể hiểu cách đường dẫn dữ liệu lưu trữ/truy xuất các giá trị trong ram thông thường thì sẽ không khó để mở rộng logic đó để sửa đổi địa chỉ hướng dẫn đến hoặc là một giá trị văn chương, hoặc giá trị được lưu trữ trong một thanh ghi đặc biệt, dựa vào việc khác giá trị giá trị văn chương/đăng ký bằng 0

enter image description here

1

Nếu báo cáo, và tất cả các báo cáo kiểm soát dòng chảy khác, là thực hiện ở cấp độ logic như nhảy có điều kiện.

Khi bạn sử dụng một câu lệnh if, như thế này:

int a = 1, b = 0 
if (a > b) 
{ 
    ... 

Rõ ràng, bất kỳ trình biên dịch thông minh sẽ tối ưu hóa này ra. Nếu chúng ta hướng dẫn cụ thể trình biên dịch của chúng tôi để được như câm càng tốt và tạo ra các hướng dẫn đúng nguyên văn, chúng tôi sẽ nhận được một cái gì đó như sau ra khỏi nó:

my_if_statement: 
    CMP eax, ebx # intrinsically works by subtracting ebx from eax 
         # eax and ebx are not changed, but the arithmetic flags are 

         # if it was greater, jump to greater label 
    JG my_if_statement_was_true 

         # if it wasn't greater, we get here 
my_if_statement_was_false: 
         # do something 
         # we're now done, so jump to the end of the statement 
    J  my_if_statement_end 

my_if_statement_was_true: 
         # do something else 
         # now we're done with the if statement 
my_if_statement_end: 
         # program continues 

Đây là lắp ráp hướng dẫn, mỗi trong số đó dịch (khoảng) trực tiếp đến mã máy mã opcodes. Bộ vi xử lý thực hiện một loạt các công cụ bổ sung để hỗ trợ quá trình tải và tìm nạp hướng dẫn, có liên quan ở đây. Có một thanh ghi đặc biệt được gọi là bộ đếm chương trình (được gọi là đăng ký PC), theo dõi vị trí của mã opcode tiếp theo mà bộ vi xử lý sẽ thực hiện.

  1. Đầu tiên, lệnh CMP trừ toán hạng thứ hai khỏi toán hạng nhất và loại bỏ kết quả. Tuy nhiên, thanh ghi FLAGS được cập nhật với kết quả của phép toán số học.
  2. Sau đó, lệnh JG sẽ kiểm tra xem cờ GREATER trong thanh ghi FLAGS có được đặt hay không. Vì nó nằm trong ví dụ của chúng ta (gọi lại là 1> 0), nó thực hiện một bước nhảy.
  3. Lệnh nhảy sửa đổi bộ đếm chương trình (PC), là thanh ghi điều khiển nơi CPU sẽ đọc lệnh tiếp theo từ đó.
  4. CPU sau đó cố gắng đọc hướng dẫn tiếp theo. Vì chúng ta đã nhảy, lệnh tiếp theo không phải là lệnh ngay lập tức theo lệnh được xử lý trước đó.

Đó là tổng quan về quy trình. Nếu bạn muốn giải thích sâu hơn, tôi khuyên bạn nên viết một chương trình C đơn giản với câu lệnh if, biên dịch nó, tháo rời nó (sử dụng linux objdump hoặc tương đương), và có thể đính kèm một trình gỡ rối vào nó và chạy nó.

linux objdump manual

Để hiển thị các lệnh kế tiếp để được thực thi trong gdb, sử dụng display/i $pc

1

Nếu bạn chỉ quan tâm đến việc thực hiện nếu tình trạng đó, nó đơn giản,

có lẽ bạn đã đọc kỹ thuật số thiết kế bởi Morris Mano, có một mạch đơn giản được đưa ra để so sánh hai đăng ký, bằng cách này, logic là đơn giản nếu bạn đưa ra một suy nghĩ về nó.

a>b OR a<b OR a==b all these 3 instructions can be implemented easily 
    by just comparing the two registers 

Bây giờ nếu bạn đang quan tâm về cách câu lệnh if, rằng làm thế nào thực sự nó được thực hiện trong CPU sau đó nó đi qua các chu kỳ 3 bước của Fetch, Decode và Execute.

Sau đó, thanh ghi được so sánh như đã nói trước đó.

Hy vọng nó sẽ giúp .. :)

+0

Đây chỉ là một câu hỏi tối tăm, và nó đã được trả lời một lúc trước, cảm ơn bạn mặc dù. – Nealon

Các vấn đề liên quan