Chính xác thì chúng ta đi từ bộ nhị phân / Hex đến bộ hướng dẫn lắp ráp như thế nào?


13

Vì vậy, gần đây tôi đã cố gắng học một số chương trình nhúng / lắp ráp một chút ở đây, cũng như cố gắng học ở cấp độ thấp nhất (cổng và như vậy).

Một điều làm tôi bối rối mặc dù .... là làm thế nào để chúng ta "có được" các bộ hướng dẫn. Tôi hiểu phần nào cách cổng / TTL và các công việc như vậy, nhưng tôi không thấy cách chúng tôi chuyển từ đó sang Mov, thêm, clr, v.v ...?

Đây có lẽ là một câu hỏi ngu ngốc .... nhưng ý tôi là tôi nghĩ lại bộ vi xử lý / bộ điều khiển đầu tiên và nghĩ .... chính xác thì họ đã thiết kế một bộ hướng dẫn và làm cho nó hoạt động như thế nào?

chỉnh sửa: Tôi đoán cho Clarity, giả vờ tôi đang nói về bộ vi xử lý đầu tiên, làm thế nào mà họ đi từ Binary để thực sự tạo ra một Tập lệnh?


2
Mỗi hướng dẫn có một giá trị, trình biên dịch chuyển đổi mã của bạn thành các hướng dẫn này, dựa trên cách mã của bạn được cấu trúc.
Ramhound

1
Tôi không chắc chắn nếu tôi hiểu câu hỏi của bạn một cách hoàn hảo, nhưng tôi nghĩ bạn có thể tìm thấy câu trả lời của bạn ở đây , ở đây hoặc ở đây .
e-MEE


3
Làm thế nào mà họ đi từ Binary để thực sự tạo ra một Tập lệnh? Trên thực tế, "họ" đã không - đó là cách khác, ít nhất là nói chung. (Các) nhà thiết kế CPU xác định các hoạt động mà CPU sẽ thực hiện, sau đó họ tạo tập lệnh từ đó và sau đó họ ánh xạ các hướng dẫn (mnemonics) sang opcodes (mã máy nhị phân). @Scott Whitlock cung cấp một câu trả lời tốt dưới đây, tôi chỉ muốn giải quyết phần cuối cùng của câu hỏi của bạn bởi vì giả định của bạn, ít nhất là theo kinh nghiệm của tôi, là lạc hậu.
Radian

1
Cuốn sách thực sự hay này: www1.idc.ac.il/tecs là những gì đã giải thích tất cả cho tôi, hầu hết các chương đều có sẵn trực tuyến miễn phí. Bạn thiết kế chip của riêng bạn (bằng ngôn ngữ mô tả phần cứng đơn giản) từ cổng nand, sau đó là trình biên dịch rồi trình biên dịch, sau đó viết os bằng ngôn ngữ bạn đã tạo! Công cụ tuyệt vời, và như một người không có bằng cấp khoa học, đó là thời gian dành cho tôi!
bplus

Câu trả lời:


18

Trái tim của CPU là ALU . Nó chịu trách nhiệm thực hiện một lệnh (như MOV) chỉ là một chuỗi các chữ số nhị phân được xác định trước và cũng lấy 0, 1 hoặc 2 toán hạng và thực hiện thao tác áp dụng trên chúng. Hướng dẫn đơn giản nhất có thể là NOP (không hoạt động) mà về cơ bản không có gì. Một hoạt động điển hình khác là THÊM (thêm hai giá trị).

ALU đọc và ghi dữ liệu từ và đến "các thanh ghi". Đây là những vị trí bộ nhớ nhỏ bên trong CPU. Một phần của hướng dẫn (2 đến 3 bit cho mỗi đầu vào tùy thuộc vào số lượng thanh ghi bạn có) cho biết thanh ghi nào sẽ được đọc từ đó. Có các đơn vị trong CPU bên ngoài ALU xử lý việc tải dữ liệu cần thiết (và hướng dẫn) từ bộ nhớ vào các thanh ghi và ghi kết quả từ các thanh ghi trở lại vào bộ nhớ. Vị trí để ghi kết quả cũng sẽ được mã hóa thành 2 hoặc 3 bit khác.

Việc lựa chọn "mã op", là số nhị phân đại diện cho một hoạt động, không phải là tùy ý. Các opcodes được chọn tốt làm giảm độ phức tạp của ALU. Mỗi bit hoặc nhóm bit có xu hướng kích hoạt và vô hiệu hóa cổng logic nhất định trong ALU. Ví dụ, một lệnh ADD sẽ phải kích hoạt giai đoạn đầu ra để chọn kết quả của logic thêm nội bộ. Tương tự, một lệnh MUL sẽ chọn kết quả của logic nhân. Tùy thuộc vào thiết kế, nhiều khả năng cả hai mạch cộng và nhân đều thực hiện hoạt động của chúng trên các toán hạng đầu vào và đó chỉ là lựa chọn đầu ra (được ghi vào các bit đầu ra của ALU) thay đổi.


1
Tôi đoán những gì tôi hỏi, là làm thế nào để họ chọn? Và làm thế nào để họ thực sự đi về việc giao nó?

1
@Sauron: Đọc lại đoạn thứ 3 một lần nữa và cố gắng hiểu các mạch số học và kỹ thuật số nhị phân. Tôi có thể biểu diễn một tập lệnh với 256 lệnh bằng một dòng 8 bit trong mạch kỹ thuật số. Điều đó có nghĩa là tôi cần 8 cổng io trên các thiết bị phần cứng của mình để chuyển mọi trạng thái có thể (2 trạng thái trên mỗi dòng ^ 8 dòng = 256 trạng thái có thể). Đơn vị xử lý sau đó có thể quyết định phải làm gì với tín hiệu đầu vào kỹ thuật số đó. Một mạch kỹ thuật số có nghĩa là bạn có hai trạng thái phần cứng: Hi và Lo, điện áp hoặc không có điện áp. Đó là nơi nhị phân đến từ. Đại diện nhị phân là một gần nhất với kim loại.
Falcon

3
@Sauron - tra cứu Bộ ghép kênh kỹ thuật số để xem cách một mạch kỹ thuật số có thể chọn từ một trong một số giá trị. Nếu bạn có một bus 8 bit, bạn chỉ cần song song 8 bộ ghép kênh kỹ thuật số nhị phân này.
Scott Whitlock

1
@Falcon Ok ....... Tôi nghĩ điều đó có ý nghĩa hơn. Tôi tiếp tục quên rằng cuối cùng tất cả đều chuyển sang tín hiệu nhị phân .... và thậm chí một lệnh như "Mov" vẫn được biểu diễn dưới dạng nhị phân.

1
@Sauron - Thực hiện một số nghiên cứu về CPU, nó sẽ giúp bạn hiểu, mã op là gì và cách chúng hoạt động. Tại sao một số mã op nhất định được chọn không quan trọng, thậm chí hỏi câu hỏi "tại sao", không có ý nghĩa lớn. Hiểu cách chúng được chọn có thể giúp bạn hiểu thêm về CPU và cấu trúc của nó.
Ramhound

9

Tôi sẽ lấy câu hỏi của bạn theo nghĩa đen và thảo luận chủ yếu là vi xử lý, không phải máy tính nói chung.

Tất cả các máy tính có một số loại mã máy. Một lệnh bao gồm một opcode và một hoặc nhiều toán hạng. Ví dụ: lệnh ADD cho Intel 4004 (bộ vi xử lý đầu tiên) được mã hóa thành 1000RRRR trong đó 1000 là opcode cho ADD và RRRR đại diện cho số đăng ký 0-15 (0000-1111 ở dạng nhị phân).

Tất cả các hướng dẫn khác tham chiếu một trong 16 thanh ghi 4 bit (như INC, ISZ, LD, SUB, XCHG) cũng sử dụng 4 bit thấp để mã hóa số thanh ghi và mã hóa khác nhau của 4 bit hàng đầu để chỉ định các opcode. Ví dụ: ADD, SUB, LD và XCHG sử dụng các mã 1000, 1001, 1010 và 1011 (tất cả ở dạng nhị phân) kết hợp với trường đăng ký. Vì vậy, bạn có thể thấy làm thế nào một mô hình được sử dụng để đơn giản hóa logic.

Các chương trình máy tính đầu tiên được viết bằng tay, mã hóa bằng tay 1 và 0 để tạo chương trình bằng ngôn ngữ máy. Điều này sau đó đã được lập trình thành ROM (Bộ nhớ chỉ đọc). Bây giờ các chương trình thường được ghi vào bộ nhớ Flash có thể xóa bằng điện, trong trường hợp vi điều khiển hoặc hết RAM, nếu vi xử lý. (Cái sau vẫn cần một số loại bộ nhớ chỉ đọc để khởi động.)

Ngôn ngữ máy trở nên tẻ nhạt rất nhanh, do đó, các chương trình trình biên dịch được phát triển lấy ngôn ngữ trình biên dịch mã hóa và dịch nó, thường là một dòng mã lắp ráp cho mỗi lệnh, thành mã máy. Vì vậy, thay vì 10000001, người ta sẽ viết THÊM R1.

Nhưng trình biên dịch đầu tiên phải được viết bằng mã máy. Sau đó, nó có thể được viết lại bằng mã trình biên dịch riêng và phiên bản ngôn ngữ máy được sử dụng để lắp ráp lần đầu tiên. Sau đó, chương trình có thể tự lắp ráp (cái này được gọi là bootstrapping).

Do bộ vi xử lý đầu tiên được phát triển rất lâu sau khi máy tính lớn và máy tính mini xuất hiện và 4004 không thực sự phù hợp để chạy trình biên dịch chương trình, Intel có thể đã viết một trình biên dịch chéo chạy trên một trong các máy tính lớn của mình và dịch mã lắp ráp cho 4004 thành hình ảnh nhị phân có thể được lập trình vào ROM.


4

Một máy tính ở mức rất thấp có thể được biểu diễn bằng đường dẫn dữ liệuđiều khiển . Googling những điều này với nhau có thể cung cấp cho bạn rất nhiều đọc vì nó là nền tảng trong kiến ​​trúc / thiết kế kỹ thuật số.

Tôi sẽ làm hết sức mình để tóm tắt:

Như đã đề cập ở đây, trung tâm chúng ta có ALU - điều cần biết về ALU (và các bộ phận khác của CPU) là nó có thể cấu hình lại cho các hoạt động khác nhau. Cụ thể hơn, chúng tôi có khả năng cấu hình lại đường dẫn dữ liệu , đó là cách các tham số được tìm nạp, thao tác cần thực hiện và nơi chúng được lưu trữ sau đó. Hãy tưởng tượng bạn có thể thao túng ba điều này - đây là sự kiểm soát của chúng tôi .

Vậy làm thế nào để chúng ta thực hiện điều này? Như đã đề cập một lần nữa, chúng ta có thể tận dụng logic kỹ thuật số cấp thấp và tạo bộ ghép kênh cho các đường dẫn khác nhau. Bộ ghép kênh được điều khiển bằng cách sử dụng một bộ bit cho đầu vào - những bit này được lấy từ đâu? Được mã hóa từ các hướng dẫn. Takeaway: Các hướng dẫn như Mov, add, v.v. chỉ là một tập hợp các bit cho CPU biết cách cấu hình datapath của nó cho một hoạt động cụ thể. Những gì bạn đang đọc (Mov, add) là dạng có thể đọc được của con người (ngôn ngữ lắp ráp) và chương trình của chúng tôi xác định một quy trình dữ liệu và thao tác.

Tôi xin lỗi nếu đây là sự đơn giản hóa các quy trình phức tạp hơn cho những người hiểu biết hơn trong lĩnh vực này. FYI, trao đổi ngăn xếp kỹ thuật điện sẽ là một nơi tuyệt vời để đặt câu hỏi này vì nó liên quan đến logic rất thấp.


3

nếu tôi hiểu câu hỏi của bạn, tôi không hiểu bin / hex hay lắp ráp có liên quan như thế nào.

Tôi giả sử phần cốt lõi của câu hỏi của bạn là làm thế nào để tôi nhận được từ các cổng cơ bản, VÀ, HOẶC, KHÔNG theo hướng dẫn như di chuyển, tải, lưu trữ, thêm, v.v.

Tôi có bộ hướng dẫn giảng dạy nhỏ của riêng mình, tôi đã tạo từ đầu có một số chi tiết nói về cách cộng và trừ công việc từ các cổng cơ bản và những thứ tương tự như vậy http://github.com/dwelch67/lsasim .

Tìm kiếm Quy tắc (một cái gì đó một cái gì đó) cuốn sách từ Petzold. Có thể bắt đầu con đường đến tiểu học nhưng đưa bạn từ từ không liên quan gì đến máy tính và thiết bị điện tử thành nhị phân, hex và vào các cổng cơ bản, v.v.

Bạn đang hỏi về cách bạn sẽ xây dựng một cái từ đầu ngày hôm nay, hoặc làm thế nào họ làm điều đó trở lại trong ngày? Hôm nay bạn sẽ bắt đầu với một định nghĩa của tập lệnh. bạn chỉ cần ngồi xuống và viết nó ra, bạn nghĩ về các loại hướng dẫn bạn phải có tải và lưu trữ và di chuyển và công cụ alu, và sau đó có bao nhiêu thanh ghi, các thanh ghi lớn như thế nào, điều này phần nào ảnh hưởng đến kích thước hướng dẫn, bạn nghĩ về kích thước chỉ dẫn ...

Hãy để tôi dừng lại và hỏi bạn làm thế nào để bạn viết một chương trình? Bắt đầu với một màn hình trống trên trình soạn thảo văn bản? Bạn có một số ý tưởng về nhiệm vụ mà bạn đang cố gắng giải quyết các biến bạn có thể cần, các hàm, ngôn ngữ lập trình, v.v. Và mỗi người là khác nhau, nhưng ở một mức độ nào đó, bạn làm một chút về điều này (nói hàm xác định và viết), một chút về điều đó (tạo các tệp tiêu đề với định nghĩa có thể tái sử dụng và enums và structs và Stuff), và một chút điều khác (chỉ cần mã, điền vào các hàm với các biến và mã). Và bạn xoay quanh các nhiệm vụ khác nhau, cuối cùng bạn cảm thấy bạn có sự cân bằng về kích thước mã, tốc độ, khả năng đọc, chất lượng, chức năng, v.v. Không khác gì với thiết kế phần cứng. các nhà thiết kế phần cứng cũng sử dụng các ngôn ngữ lập trình (vhdl, verilog) và trải qua quá trình tương tự,

Giống như đưa ra một chương trình phần mềm, bạn cân bằng giữa mong muốn, hiệu suất, kích thước, tính năng, v.v. Bạn có thể có một số quy tắc thiết kế bắt buộc bạn muốn hoặc là ông chủ của bạn đã làm cho bạn, v.v. thiết kế ban đầu khi triển khai bạn có thể phát hiện ra rằng bạn có một số sai lầm lớn và phải quay lại thiết kế ban đầu và thay đổi tập lệnh, thay đổi lớn hay nhỏ. Có thể có được một trình biên dịch và bộ xử lý mô phỏng để thấy bạn thực sự cần một vài hướng dẫn cụ thể giúp cải thiện đáng kể chất lượng của mã được biên dịch, hiệu năng, v.v.

Vì vậy, bạn đã phát minh ra một số bộ hướng dẫn từ đầu, bạn đã sử dụng một số kinh nghiệm về thiết kế phần cứng để nhóm các hướng dẫn tương tự với các mẫu bit tương tự để chúng có thể được giải mã dễ dàng hơn, không chỉ cho lập trình ngôn ngữ phần cứng mà còn tiết kiệm năng lượng và cổng và tất cả điều đó đồ tốt. Ngày nay bạn sẽ tạo ra một loại giả lập nào đó, tôi hiểu là ARM là phần mềm giả lập trước, sau đó các thiết kế phần cứng đến sau, không biết điều đó có đúng không nhưng vẫn gắn bó với câu chuyện đó. Điều này phụ thuộc vào nhóm, một số nhóm có thể chỉ là người phần cứng và muốn tham gia lập trình trong hdl, một số người như tôi có thể muốn làm một chút cả hai. Ngày nay, các trình giả lập ngôn ngữ phần cứng tốt đã có sẵn để bạn không phải xây dựng bất kỳ phần cứng nào bạn biên dịch và mô phỏng và thực hiện nhiều thao tác sửa lỗi với chương trình / gói mô phỏng phần cứng. nhóm phần mềm có thể phát triển các trình biên dịch và trình biên dịch cho tập lệnh và sử dụng các chương trình nguồn cấp dữ liệu ram và rom mô phỏng cho bộ xử lý mô phỏng và đưa nó qua các bước của nó. chúng tôi đã mô phỏng một khởi động linux đầy đủ trên một bộ xử lý mà tôi đã làm việc cách đây không lâu, mất nhiều giờ nhưng nó đã hoạt động (tìm thấy một lỗi bộ nhớ cache theo logic theo cách đó).

Vì vậy, bây giờ cho những gì tôi thực sự nghĩ rằng bạn đang yêu cầu. Làm thế nào để bạn nhận được từ các cổng cơ bản đến một bộ xử lý với một bộ hướng dẫn. Các cổng cơ bản VÀ, HOẶC, KHÔNG thực sự tương tự, chúng không có khái niệm về thời gian, bạn không thể thay đổi điện áp ngay lập tức trên đầu vào và khi bạn thay đổi điện áp đó, đầu ra bắt đầu thay đổi. cổng được làm bằng bóng bán dẫn và bóng bán dẫn là bộ khuếch đại, lấy đầu vào nhân nó với một số số và cho phép dòng điện đó chạy qua phía bên kia. Khi chúng ta sử dụng chúng làm cổng logic, chúng ta thực sự quá bão hòa chúng, điện áp đầu vào quá cao hoặc thấp đến mức bóng bán dẫn chỉ có thể điều khiển điện áp tối đa hoặc không có điện áp (dòng điện). về cơ bản các transitor được biến thành một công tắc. Câu chuyện dài, không có khái niệm về thời gian. Để có một tập lệnh, chúng ta phải có các hướng dẫn xảy ra để chúng ta phải trình tự chương trình, chúng ta phải có một khái niệm về bây giờ chúng ta đang ở trong hướng dẫn này, và trong thời gian tới chúng ta sẽ làm việc theo hướng dẫn đó. Giống như trò chơi biến bộ khuếch đại thành công tắc, bạn chơi các trò chơi tương tự bằng cách sử dụng các cổng logic cơ bản với đồng hồ. những chiếc đồng hồ đến từ các tinh thể ma thuật trong một cái hộp (không đáng để vào đó) tạo ra điện áp bật và tắt ở một tốc độ cố định. sử dụng điện áp đó trong các phương trình logic và bạn có thể bắt đầu sắp xếp các thứ. những chiếc đồng hồ đến từ các tinh thể ma thuật trong một cái hộp (không đáng để vào đó) tạo ra điện áp bật và tắt ở một tốc độ cố định. sử dụng điện áp đó trong các phương trình logic và bạn có thể bắt đầu sắp xếp các thứ. những chiếc đồng hồ đến từ các tinh thể ma thuật trong một cái hộp (không đáng để vào đó) tạo ra điện áp bật và tắt ở một tốc độ cố định. sử dụng điện áp đó trong các phương trình logic và bạn có thể bắt đầu sắp xếp các thứ.

rất rất ngắn gọn nghĩ về bảng sự thật này:

0 0 0
0 1 1
1 0 1
1 1 0

trong nhị phân:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

chỉ tập trung vào lsbit, một bộ cộng một bit, bảng chân lý ở trên mô tả một bộ cộng một bit. Nó cũng mô tả một cổng XOR. Một đầu vào là đúng hoặc khác nhưng không phải cả hai.

Để có được nhiều hơn một bit, bạn phải xem các bit mang và thực hiện và bạn cần một bộ cộng ba bit hai toán hạng và thực hiện với hai đầu ra, thực hiện và bit kết quả. Khi bạn có ba bộ cộng hai đầu vào đó, bạn có thể xếp tầng đó rộng như bạn muốn. Nhưng đây vẫn là tương tự, các cổng thay đổi ngay lập tức.

Cách bạn biến bộ cộng tương tự này thành một lệnh ADD, bạn có một số logic xem hướng dẫn đang ngồi làm đầu vào cho các cổng mà bạn đã sắp xếp. Một số bit trong hướng dẫn nói, đây là một lệnh add, một số bit nói rằng một toán hạng là như vậy và thanh ghi như vậy, có thể đăng ký 7, các bit khác có thể nói toán hạng khác là thanh ghi 4. và tùy thuộc vào kiến ​​trúc bạn có thể có một thanh ghi khác được định nghĩa trong hướng dẫn ghi kết quả vào thanh ghi 2. Bây giờ logic hơn sẽ thấy điều này khi tôi cần nội dung của thanh ghi 7 được chuyển đến một đầu vào của bộ cộng alu và đăng ký đầu vào 4 được chuyển đến bộ cộng và bạn định tuyến đầu ra của bộ cộng để đăng ký 2. Vì đồng hồ là một phần của logic này, có một khoảng thời gian từ đầu thời gian đồng hồ đến đầu thời gian đồng hồ tiếp theo nơi tất cả các tín hiệu tương tự lắng xuống và giải quyết phương trình logic mà chúng được nối dây. Không giống như khi bạn bật công tắc đèn, bạn thay đổi trạng thái đèn từ tắt sang bật. phải mất một khoảng thời gian để ánh sáng đó ấm lên và về cơ bản đạt được trạng thái ổn định. Không có nhiều khác biệt ở đây.

Có một số logic nói rằng những thứ như nếu khoảng thời gian này là giai đoạn thực hiện của một lệnh AND, thì giai đoạn đồng hồ tiếp theo tôi sẽ lưu kết quả vào thanh ghi đầu ra. đồng thời tôi sẽ tìm nạp lệnh tiếp theo, v.v. Vì vậy, đối với các bộ xử lý hiện đại, nơi thực thi alu thường chỉ là một khoảng thời gian vì logic tương tự có thể giải quyết các phương trình logic nhanh như vậy. Các bộ xử lý cũ hơn mà bạn phải đếm đến một số số khiến bộ cộng dây lên dây, chờ x số chu kỳ xung nhịp để logic bộ cộng giải quyết, sau đó lấy mẫu kết quả từ đầu ra, cung cấp các đầu vào khác nhau, chờ x số chu kỳ xung nhịp cho để giải quyết, lặp lại mãi mãi hoặc cho đến khi mất điện.

Ý tôi là gì bởi các phương trình logic? chỉ là, nếu bạn muốn bạn có thể nghĩ về nó theo các cổng AND, OR, KHÔNG. Đối với mỗi bit đầu vào của mạch cộng alu, có một phương trình, có thể là một phương trình rất dài bao gồm đồng hồ, bao gồm các flip flop (các bit bộ nhớ riêng lẻ / đơn) có chứa lệnh hiện tại (cộng với các phương trình cung cấp cho mỗi phương thức đó bit bộ nhớ) và trên và trên. Thực hiện một chức năng phần mềm duy nhất bạn đã viết, bằng ngôn ngữ bạn đã viết, giả sử đây là chức năng nhận đầu vào, thực hiện một tác vụ và sau đó kết thúc và trả về kết quả. Hãy nghĩ về tất cả các kết hợp đầu vào có thể và các đường dẫn thực thi khác nhau thông qua chức năng đó. Bạn có thể đã viết nó bằng một số ngôn ngữ cấp cao nhưng thậm chí bạn có thể viết lại ngôn ngữ đó để trở nên nguyên thủy và nguyên thủy hơn bằng cách sử dụng nhiều cấu trúc if-then-other lồng nhau. và đi xuống thấp hơn vào ngôn ngữ lắp ráp có lẽ. Không giống như các phương trình mà tôi đang nói đến, lập trình viên phần cứng không lập trình trong các phương trình dài hơi này nhiều hơn bạn có thể lập trình trong các cây if-then-gió dài bằng ngôn ngữ lắp ráp khi ngôn ngữ lập trình lựa chọn tiết kiệm rất nhiều điều đó. Giống như trình biên dịch bạn sử dụng biến mã nguồn nhỏ của bạn thành tập hợp dài dòng với rất nhiều if-then-elses, có một trình biên dịch lấy mã ngôn ngữ lập trình phần cứng và biến nó thành một phương trình logic.

Bây giờ quay trở lại cpu đầu tiên (mà ngày nay chúng ta sẽ xem xét một vi điều khiển nhưng sau đó nó là một cpu). Bạn đã làm tất cả những điều trên trên giấy và bạn không sử dụng các ngôn ngữ lập trình phần cứng mà bạn thực sự đã viết các phương trình logic, nhưng bạn thậm chí còn cẩn thận chọn các mẫu bit cho các hướng dẫn để làm cho số cổng và dây để kết nối các cổng đó đơn giản như thực tế. Trên giấy, bằng tay, bạn phải tạo cả một danh sách dài các cổng logic có dây và sau đó bạn phải vẽ các thành phần thực tế trên một phiên bản thổi lên của mặt nạ silicon. ngay cả ngày nay các con chip đã được thực hiện bằng cách sử dụng những gì tương tự như quá trình chụp ảnh hoặc màn hình lụa như quy trình layman, do đó bạn sẽ lấy những bản in màu xanh này nếu bạn muốn và thu nhỏ chúng sau đó áp dụng chúng cho các lớp silicon.

Ở đây một lần nữa vào ngày mọi người đã xử lý lắp ráp tốt hơn và cuối cùng bạn không chỉ có thể thực hiện một số chương trình lắp ráp mà còn có thể không có trình soạn thảo văn bản cũng như trình biên dịch mà bạn có thể phải viết chương trình đầu tiên bằng tay, sau đó bằng cách sử dụng một tài liệu tham khảo, bằng tay đã chuyển đổi nó thành mã máy, số và số không. Trên một số máy tính, bạn có thể phải tải ram bằng cách lật các công tắc, lật các bit địa chỉ, lật các bit dữ liệu cho đến khi chúng khớp với các số trên giấy của bạn, lật bit đồng hồ lên rồi bạn đã tải một vị trí bộ nhớ với một byte của một hướng dẫn của chương trình của bạn, lặp lại vài trăm lần nữa và hy vọng bạn không phạm sai lầm.

Theo cùng một cách mà trình biên dịch C đầu tiên có thể được viết bằng một số ngôn ngữ khác, sau đó nó trở thành tự lưu trữ bằng cách được viết lại bằng C và được biên dịch bởi trình biên dịch C đầu tiên sau đó một lần nữa. Sau đó, trình biên dịch C được sử dụng để phát minh các ngôn ngữ lập trình khác mà sau đó trở thành tự lưu trữ. Chúng tôi đã phát minh ra các hệ điều hành và trình soạn thảo văn bản tự xây dựng và đó là tất cả ma thuật đen để lại cho một vài người đằng sau bức màn ở góc để làm ...

vâng, rất dài, đó là một câu hỏi lớn cần nhiều năm nghiên cứu và kinh nghiệm để thực sự nắm bắt. Hãy nhìn vào lsasim của tôi, tôi không tự nhận mình là chuyên gia về bất cứ điều gì, nhưng đó là một tập lệnh, có cả một trình giả lập thực thi lệnh được viết bằng C và một triển khai khác của bộ xử lý được thực hiện bằng ngôn ngữ lập trình phần cứng có thể mô phỏng bằng các công cụ khác nhau. Cộng với một trình biên dịch thô và một số công cụ khác và như vậy. Có lẽ, bằng cách kiểm tra một số điều này, đặc biệt là mã ngôn ngữ lập trình phần cứng, nó có thể thu hẹp khoảng cách với những gì tôi cho rằng bạn đang hỏi. Nếu tôi không thu hẹp khoảng cách đó hoặc đã tạo ra một tiếp tuyến dài hơi xin vui lòng cho tôi biết tôi sẽ vui vẻ xóa câu trả lời này (giả sử tôi có thể không tham gia trao đổi với các lập trình viên nhiều).


Điều này thực sự không trả lời câu hỏi của tác giả, ít nhất nó không thêm bất cứ điều gì vào cuộc thảo luận, rằng câu trả lời được chấp nhận không bao gồm. Toán nhị phân của bạn không đúng 100% 1 + 1 là 0 với tỷ lệ tràn 1. Tùy thuộc vào kích thước của sổ đăng ký, nó sẽ là 2 hoặc 0.
Ramhound

@dwelch ĐỪNG! Tôi là fan hâm mộ trái tim chết của bạn nếu không có gì ít hơn. +1
AceofSpades

2

CPU hoạt động trên 0 và 1. Tất cả các hướng dẫn có một chuỗi các bit xác định chúng. Thsi là mã máy. Điều đó thật khó cho con người đọc và viết. Bước đầu tiên, chúng tôi đã nhóm các chuỗi 0 và 1 thành 4 bit và sử dụng 0 đến F để thể hiện chúng. Điều này làm giảm số lượng chúng tôi phải ghi nhớ, nhưng vẫn không dễ nhớ mã hex để được hướng dẫn.

Vì vậy, chúng tôi bắt đầu sử dụng lắp ráp có "từ" như MOV và ADD. Trình biên dịch sẽ thay thế các hướng dẫn bằng bộ 0 'và 1 chính xác để chuyển đổi "danh sách" lắp ráp thành mã máy.

Cuối cùng, chúng tôi đã phát triển các ngôn ngữ cấp "cao hơn" trong đó "hướng dẫn" có thể biểu thị toàn bộ chuỗi mã máy.


FYI, bát phân đã được sử dụng như một tốc ký nhị phân trước thập lục phân.
ocodo

Slomojo đã đúng, Octal, cơ sở 8 được sử dụng 3 bit, được sử dụng cùng với hex, cơ sở 16 sử dụng 4 bit. Octal có lợi thế ở chỗ mọi người đều biết những con số từ 0 đến 7 đại diện cho điều gì. Những người không sử dụng Hex thường bị bí ẩn bởi các "chữ số" A đến F.
Jim C

0

Gần đây tôi đã bắt gặp Q / A này và khoảng một năm trước khi tôi bắt đầu đi trên con đường này; Tôi sẽ thấy đây là một trang tham khảo và tài nguyên rất tốt liên quan đến các câu hỏi liên quan của riêng tôi.


Phần 1: -Preface-

Một chút về bản thân:

Vào giữa đến cuối thập niên 80 khi tôi còn học tiểu học, tôi sẽ tách các dàn âm thanh nổi, VCR và các thiết bị điện tử khác từ thập niên 50 đến thập niên 80 và nhìn vào bảng mạch và luôn muốn biết chúng đã làm thế nào hoạt động ... Làm thế nào mà họ thực sự thu được tín hiệu phát sóng, sản xuất âm thanh, video, làm điều này và v.v ... Tôi có thể nhận ra các bộ phận riêng lẻ ở đây và ở đó như resister, tụ điện, diode và bóng bán dẫn, nhưng không biết những gì họ đã làm hoặc làm thế nào họ hoạt động ở độ tuổi trẻ như vậy.

Trong suốt những năm qua, tôi luôn luôn xuất sắc về Toán học, Vật lý và Hóa học. Tôi hiểu toán ở mức độ cao và thậm chí có thể đọc một số mạch đơn giản hoặc cơ bản từ những ngày học cấp hai và cấp ba sau đó, nhưng tôi chưa bao giờ học về cổng logic và cách chúng được xây dựng ... Tuy nhiên tôi đã làm học Đại số Boolean ở trường trung học từ lớp Logic, Xác suất và Thống kê danh dự của tôi. Tất cả các lớp toán và khoa học của tôi là các lớp danh dự. Tôi đã không học giải tích cho đến học kỳ thứ hai tại một trường cao đẳng cộng đồng. Tôi đã kiểm tra Đại học Đại số và lấy Lượng giác làm khóa bồi dưỡng. Trình độ toán cao nhất của tôi từ lớp học là Giải tích II của một biến duy nhất.

Tôi đã chơi trò chơi điện tử từ khi tôi khoảng 3 hoặc 4 tuổi. Khi còn nhỏ, tôi đã có Atari, NES, Sega Genesis và PS1. Khi tôi già đi và vào tuổi thiếu niên và đầu những năm 20 tuổi, tôi đã mua được máy PS3 và SNES với các tựa game được lựa chọn ưa thích. Điều này cũng không giải thích cho việc chơi game trên PC đã lùi xa như Doom!

Tôi luôn là một game thủ yêu thích Console và PC và điều này không bao gồm các trò chơi pinball và arcade.

Tôi đã được tặng chiếc PC đầu tiên của mình khi tôi khoảng 12 tuổi vào Giáng sinh vào đầu những năm 90. Thời của DOS 6.0 và Win 3.11 hoặc OS / 2. Kể từ đó, tôi luôn quen thuộc với hệ điều hành "Windows" và tất cả các hệ thống tôi có là Kiến trúc Intel. Tôi đã có kinh nghiệm hạn chế với Apple hoặc Mac từ trường học hoặc đại học, nhưng tôi chưa bao giờ có đặc quyền làm việc trên các hệ thống Linux. Tôi có Cygwin và tôi đã thử học bash, nhưng tôi đã quá quen với cú pháp của Dos hoặc Command Prompt.

Vào đầu những năm 90, tôi sẽ nhận được một hoặc hai bản PC-World và sẽ nhập các đoạn mã vào QBasic mà tôi không biết rõ và sẽ cố gắng làm cho các chương trình đó hoạt động. Điều duy nhất thành công là một chương trình biến các phím bấm trên hàng phím nhà thành các âm thanh nhạc chuông khác nhau. Tôi không có nghĩa là nhạc chuông trên điện thoại di động. Ý tôi là tần số liên tục miễn là bạn giữ phím.

Tôi luôn luôn là niềm đam mê của tôi khi không chỉ muốn biết các thiết bị điện tử hoạt động như thế nào trong phạm vi kỹ thuật số và logic, để học cách lập trình máy tính, mà tôi luôn có mong muốn tạo ra video của riêng mình Trò chơi. Ngay cả vào đầu những năm 90, tôi đã muốn tạo ra các trò chơi Frogger và Tetris ...


Điều này trở thành động lực và mong muốn hàng đầu của tôi để giải quyết một trong những loại lập trình hoặc phát triển phần mềm khó nhất trong lĩnh vực Khoa học Máy tính và đó là Thiết kế Công cụ Trò chơi 3D. Có những lĩnh vực khác trong Khoa học máy tính cũng khó khăn như vậy, tuy nhiên, bất kỳ công cụ trò chơi tinh vi nào thường sẽ hoặc thường bao gồm hầu hết tất cả chúng vì các thành phần riêng lẻ hoặc công cụ phụ yêu cầu kỹ thuật và thuộc tính của chúng.

Tôi đã có một số nền tảng về lập trình từ những ngày học cấp ba nhưng điều này chỉ giới hạn ở Visual Basic khủng khiếp. Tôi bắt đầu học và học C / C ++ vào khoảng năm 2002 - 2003 cho đến vài năm sau khi tôi tốt nghiệp trường trung học năm 1999. Thậm chí cho đến ngày nay tôi không có bất kỳ kinh nghiệm nào về lớp đại học về Khoa học máy tính hoặc Kỹ thuật máy tính, nhưng thông qua cống hiến và quyết tâm, tôi đã học được mọi khái niệm khi nói đến máy tính, phần cứng, lập trình, thuật toán, v.v. và tôi vẫn tiếp tục học hỏi nhiều nhất có thể ...

Trong những ngày đầu học C / C ++, tôi đã truy cập internet nhưng internet sau đó mới ở giai đoạn đầu, các trang web như Amazon, Youtube, Facebook, v.v. thậm chí còn chưa tồn tại, nó vẫn còn là 56k quay số modem mà lên dòng điện thoại của bạn nếu bạn không có một dòng chuyên dụng thứ hai. Sẽ mất vài phút chỉ để một hình ảnh hiển thị trên màn hình, không bao giờ bận tâm phát lại video liên tục.

Vì vậy, khi nói đến nghiên cứu và học cách lập trình trong C ++, tài nguyên bị hạn chế và hầu hết là ở định dạng văn bản. Khi cố gắng giải quyết các dự án từ những ngày đầu hướng dẫn trên internet, nhiều dự án trong số đó chưa hoàn thành đầy đủ, các nhà văn là chuyên gia hoặc sinh viên đại học và họ đưa ra nhiều giả định rằng người đọc đã quen thuộc với nhiều khái niệm cần thiết như biên soạn , liên kết và gỡ lỗi và tích hợp thư viện.

Đối với một người không biết gì về những chủ đề đó, họ cảm thấy hụt hẫng vì họ không biết điều gì đã xảy ra, cũng như cách khắc phục và làm thế nào để nó hoạt động bình thường. Tôi đã mất nhiều giờ thử nghiệm và sai sót trong những ngày đó với nguồn lực rất hạn chế. Yêu cầu trợ giúp như bây giờ chúng tôi có thể với trang web này hoặc tìm kiếm các giải thích chi tiết mà bạn có thể tìm thấy trên cppreference không có sẵn! Nếu cá nhân bạn không biết ai, sẽ không có nhiều bạn có thể nhờ trợ giúp!

Khi thời gian trôi qua, tôi đã cải thiện một số kiến ​​thức của mình ở đây và ở đó, và cuối cùng internet đã cải thiện DSL, và bây giờ Internet tốc độ cao, các trang web trở nên tương tác hơn, video bắt đầu hiển thị, chất lượng video trở nên tốt hơn theo thời gian, các trang web như vậy khi Youtube bắt đầu xuất hiện và mọi thứ trở nên dễ dàng hơn một chút về phía nghiên cứu. Ngày càng có nhiều hướng dẫn trở nên có sẵn, một số là tốt và hữu ích khi những người khác dạy các thực hành xấu ...

Tôi cũng đã dành nhiều thời gian để tìm kiếm và có được các công cụ cần thiết để phát triển. Tôi đã phải học cú pháp ngôn ngữ, trình biên dịch và quá trình biên dịch, liên kết, xây dựng và gỡ lỗi. Sau đó, tôi đã phải tìm hiểu về các thư viện và API khác nhau hiện có và cách định cấu hình các dự án hoặc giải pháp của tôi để liên kết tất cả các phụ thuộc đó.

Trong những năm qua, tôi đã chứng kiến ​​ngôn ngữ C ++ phát triển, phát triển và thích nghi theo thời gian. Ban đầu, nó gần như giữ nguyên trong nhiều năm, nhưng trong 10 năm qua, nó đã thay đổi đáng kể trong khoảng thời gian ngắn này kể từ khi thành lập.

Tôi đề cập đến tất cả những điều này bởi vì C ++ là một trong những ngôn ngữ khó nhất để hoàn toàn làm chủ vì tính linh hoạt, sức mạnh, bộ tính năng phong phú và khả năng cho phép bạn tự bắn vào chân mình! Và ngay cả với tất cả sự cẩn thận của nó, nó là một trong những ngôn ngữ mạnh mẽ và được ưa thích nhất được sử dụng trong ngành công nghiệp hàng đầu như một tiêu chuẩn cho loại phát triển này bởi vì khi nó được thực hiện một cách chính xác, nó nhanh, ngắn gọn, đáng tin cậy và sử dụng in chân nhỏ nhất.

Kể từ đó, tôi đã được dạy về C / C ++ trong nhiều năm với ý định và tập trung vào việc học Lập trình đồ họa 3D và Thiết kế công cụ trò chơi. Tôi đã dành 100 đến 1.000 giờ để tìm kiếm, nghiên cứu và nhiều hơn nữa vào việc đọc, học và áp dụng kiến ​​thức đó vào việc thiết kế các sản phẩm và ứng dụng làm việc hữu ích. Tôi luôn có ý chí và mong muốn muốn học hỏi nhiều hơn để cải thiện bộ kỹ năng và nghề thủ công của mình.


Đây là giai đoạn đầu tiên, sau đó tôi đã bắt đầu đọc và làm việc với DirectX 9.c ban đầu, điều mà tôi đã thực hiện trong C / C ++ và thậm chí là C #. Sau đó, tôi chuyển sang DirectX 10 và Legacy OpenGL 1.0. Từ DirectX 11 và OpenGL 3.x - 4.x của họ và bây giờ tôi thậm chí đã thử dùng Vulkan.

Tôi đã xây dựng các công cụ trò chơi thành công làm việc thông qua các hướng dẫn trực tuyến khác nhau ở cả định dạng văn bản và video. Tôi đã tuyên bố rằng tôi có một nền tảng vững chắc về toán học nhưng nó chỉ giới hạn ở Giải tích I & II. Tôi đã phải tự học Vector Tính toán mà tôi có một số kiến ​​thức từ lớp Vật lý dựa trên Giải tích của tôi ở trường đại học, nhưng đối với Đại số tuyến tính với Biến đổi affine và Hình học phân tích, tôi phải tự học chúng khi các phương trình, hàm, phương pháp, thuật toán nhất định và khái niệm là cần thiết. Sau đó, tôi đã phải học cách dịch những mã đó thành mã hiệu quả, dễ đọc, đáng tin cậy, có thể sử dụng lại chung chung và không có lỗi, có thể đưa vào hàng trăm đến hàng ngàn giờ gỡ lỗi.

Đó là một hành trình kỳ diệu khi học các chủ đề và thuật toán bao gồm quản lý bộ nhớ, đếm tham chiếu, khởi động, đệ quy và nhiều hơn nữa được sử dụng trong nhiều nếu không phải là tất cả các thành phần của một công cụ trò chơi nơi chúng rộng lớn. Tôi có thể liệt kê tất cả chúng ở đây nhưng đó sẽ là thông tin đủ để điền vào 3 hoặc 4 khoảng trống câu trả lời. Tuy nhiên, tôi sẽ bao gồm danh sách các chủ đề chung chứ không phải chủ đề phụ của chúng.

Dưới đây là các chủ đề hoặc danh sách chủ đề bao gồm một công cụ trò chơi đầy đủ chức năng bao gồm tất cả các kỹ thuật rending khác nhau, thiết lập các đường ống kết xuất và đổ bóng, kỹ thuật tạo bóng và ánh sáng thông qua các shader, xử lý trước và sau, bộ đệm khung, bộ đệm trở lại , tải hình ảnh, tải âm thanh và mô hình và phân tích cú pháp, tạo các hình dạng nguyên thủy với các thuộc tính vật liệu màu, kết cấu và tọa độ bình thường với ánh xạ kết cấu thủ công, biến đổi đối tượng, loại máy ảnh, phân cấp biểu đồ cảnh, lớp quản lý cho kết cấu, âm thanh, phông chữ và bóng và quản lý bộ nhớ, hệ thống ghi nhật ký với xử lý ngoại lệ, kỹ thuật lập trình đa luồng và song song, mạng, động cơ vật lý, phát hiện va chạm, máy tạo hạt, hoạt hình, trò chơi AI, tạo địa hình, hộp trời và vòm trời, kết xuất nước,tán lá và hơn thế nữa ..., GUI có phông chữ kết cấu để hiển thị văn bản, lớp phủ HUD, hàng tồn kho, bản đồ và tạo macro, hệ thống trạng thái và máy trạng thái, và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa nhiều đối tượng này khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải các tệp dữ liệu để điền vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng khi khởi động ứng dụng.và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa phần lớn các đối tượng này để có khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải vào các tệp dữ liệu để đưa vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng lúc khởi động ứng dụng.và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa phần lớn các đối tượng này để có khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải vào các tệp dữ liệu để đưa vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng lúc khởi động ứng dụng.


Trong suốt những năm qua và tôi đã tò mò muốn học ngôn ngữ lắp ráp, từ họ tôi muốn tìm hiểu về trình biên dịch, trình biên dịch và hệ điều hành đơn giản, ý tôi là hoạt động bên trong của chúng, cách chúng được xây dựng và thiết kế.

Thời gian trôi đi và sau đó tôi bước một chút và bắt đầu học mô phỏng phần cứng. Tôi đặc biệt tập trung vào NES nhưng muốn tìm hiểu mô phỏng phần cứng của CPU nói chung. Điều này dẫn tôi đến việc tìm hiểu về tập lệnh mà tôi đã biết về khái niệm này và nó như thế nào khi tôi đã quen thuộc với gia đình x86 của Intel ở một mức độ nào đó, nhưng bây giờ tôi phải học Bộ hướng dẫn 6502.

Tuy nhiên, bằng cách nghiên cứu sâu về vấn đề này, tôi đã kết thúc việc nghiên cứu thêm và bắt đầu tìm hiểu về Kiến trúc tập lệnh từ góc độ Kỹ thuật. Điều này khiến tôi tìm hiểu về cách CPU được xây dựng từ các cổng logic và cách các cổng logic được xây dựng từ các bóng bán dẫn cùng với các thành phần điện khác nhau. Vì vậy, tôi đã kết thúc việc học về điều này từ hai quan điểm từ trên xuống và từ dưới lên. Cả hai phương pháp đều rất hiệu quả và tôi nghĩ rằng học hỏi từ cả hai sẽ giúp xây dựng cầu nối hoặc khoảng cách nơi phần mềm xử lý phần cứng.

Từ điều này, tôi phải làm mới về Đại số Boolean của mình và cuối cùng tôi đã tìm hiểu về K-Maps, Bảng hàm ý, Máy trạng thái cả Mealy và Moore và nhiều thứ khác liên quan đến Logic nhị phân và Số học với Cổng logic vật lý và Mạch tích hợp. Và điều này đưa tôi đến quá khứ bực bội nơi tôi bắt đầu làm việc với Logisim và bắt đầu học HDL, VHDL, Verilog, v.v.

Tôi đã học tất cả những điều này vào thời gian rảnh rỗi khi tôi có thể trong suốt 15 - 18 năm qua.


Dưới đây là một số trang web và liên kết đã hướng dẫn tôi trong suốt những năm qua. Nhiều trong số này gần đây vì nhiều trang web ban đầu tôi học được từ khi không còn tồn tại, tôi đã mất các liên kết của họ và không nhớ, hoặc các công cụ tìm kiếm đã đẩy họ ra phía sau danh sách tìm kiếm của họ ...

  • Ngôn ngữ - C ++

  • Hướng dẫn đồ họa 3D và trang web tài nguyên

  • Các loạt và kênh Youtube này bao gồm các chủ đề ở trên cũng như phần cứng, máy tính và kỹ thuật điện. Có quá nhiều thứ để liệt kê nên tôi sẽ liệt kê một vài trong số chúng ở đây mà tôi thấy hữu ích và tháo vát nhất. Tôi sẽ không cung cấp các liên kết nhưng bạn có thể tìm kiếm youtube cho các kênh này.

    • 3Blue1Brown - Toán cao cấp
    • Bisqwit - Lập trình C / C ++ nâng cao (Dự án ứng dụng) - Trình giả lập phần cứng NES
    • Jason Turner - Kỹ thuật lập trình C ++ hiện đại tiên tiến
    • javidx9 - Lập trình C / C ++ nâng cao (Dự án ứng dụng) - Trình giả lập phần cứng NES / Một số hội
    • MIT OpenC thảo - Khóa học đại học về toán học và khoa học máy tính
    • Các khóa học trực tuyến của Bilkent - Các khóa học đại học về Khoa học máy tính và Kỹ thuật máy tính (Thiết kế CPU MIPS)
    • The Cherno - Các chủ đề và ứng dụng lập trình nâng cao C / C ++ - Phát triển công cụ trò chơi
    • Ben Eater - Kỹ thuật phần cứng - Ứng dụng thực tế qua Breadboards
    • Học viện Neso - Kỹ thuật phần cứng - Lý thuyết và khái niệm
    • Socratica - Lập trình Python
    • Đơn giản chỉ cần đặt - Kỹ thuật phần cứng - Lý thuyết và khái niệm
    • Bitwise - C / C ++ nâng cao Thiết kế Trình biên dịch thông qua Mô phỏng phần cứng
    • Bo Qian - C ++ Chủ đề trong cấu trúc dữ liệu và thuật toán.
    • LineByLine - Lập trình Vulkan
    • Joshua Shucker - Lập trình Vulkan
    • www.MarekKnows.com - C ++, Toán học 3D và Phát triển công cụ trò chơi

Và những điều này không tính đến một số cuốn sách khác nhau mà tôi có về những chủ đề này.

-Lưu ý- Xin vui lòng không bỏ phiếu về điều này vì đây chỉ là một thông điệp cho người đọc về trải nghiệm cá nhân của riêng tôi và không có bất kỳ nỗ lực nào để trả lời hoặc tham khảo câu hỏi ban đầu. Trong vài ngày tới khi tôi có thời gian; Tôi sẽ thêm câu trả lời tiếp theo để đưa ra suy nghĩ của mình về câu hỏi của OP trong khi cung cấp các liên kết hữu ích làm tài liệu tham khảo và bộ tài nguyên và tôi sẽ cập nhật câu trả lời này để đưa vào một số liên kết tại đây và sửa đổi ghi chú này. Bây giờ đã muộn và tôi không có thời gian để đọc và chỉnh sửa những gì tôi đã viết. Tôi sẽ làm điều này khi tôi có thể ".


Tôi chỉ cập nhật câu trả lời hoặc bài viết này. Tôi sẽ thêm Phần thứ 2 thực sự sẽ trả lời câu hỏi, tuy nhiên tôi không có đủ điểm danh tiếng để làm điều đó. Tôi sẽ mất một thời gian để xây dựng các điểm danh tiếng cần thiết trước khi tôi có thể thêm câu trả lời thứ hai của mình. Bài đăng này không phải là câu trả lời thực sự nhưng tôi sẽ sử dụng nó làm tài liệu tham khảo và tra cứu bảng lý do cho câu trả lời thực sự của tôi. Cần có một số tài nguyên được liệt kê ở trên để giúp thu hẹp khoảng cách giữa phần mềm và phần cứng.
Francis Cugler

-2

Ở cốt lõi của nó, CPU thường chỉ là một máy trạng thái. Vì vậy, bạn sẽ cần hiểu cách các cổng logic và flip-flop hoặc thanh ghi kết hợp với nhau để tạo ra các máy trạng thái.

Một máy trạng thái lấy đầu vào và trạng thái hiện tại, chạy chúng thông qua logic boolean (và có khả năng số học), sau đó cung cấp đầu ra và trạng thái tiếp theo. Một trong những đầu vào có thể là thanh ghi lệnh. Một trong những đầu ra có thể là một kích hoạt và lựa chọn cho nguồn để tải lại thanh ghi lệnh, cũng có thể tăng hoặc tải một thanh ghi khác hoạt động như một bộ đếm chương trình. Cùng với đó, cộng với một số bộ nhớ có thể đánh địa chỉ, bạn có thể sắp xếp theo hướng dẫn.

Khi bạn có cách sắp xếp các lệnh, bạn có thể sử dụng logic để giải mã các bit lệnh này, cộng với trạng thái hiện tại, thành một loạt các bit điều khiển khác. Một số bit điều khiển này có thể đóng vai trò là đầu vào để điều khiển một loạt logic có thể thực hiện logic số học và logic toàn từ, gọi nó là ALU. Các bit khác có thể tải công cụ lên hoặc chọn đầu vào cho ALU. Các bit khác có thể nói nơi lưu trữ kết quả của ALU. Hoặc tải các thanh ghi địa chỉ. Hoặc ghi vào bộ nhớ hoặc các đầu ra khác. Vân vân.

Một phần của việc thiết kế một tập lệnh là chỉ ra các tổ hợp bit nào, khi được giải mã, điều khiển tất cả các thanh ghi và trình tự máy trạng thái. Điều này đã được thực hiện và (tái) tối ưu hóa hàng ngàn cách khác nhau.

Có ít nhất 3 cấp sách giáo khoa đại học về chủ đề không tầm thường này.


2
Điều này không giải thích cách hoạt động của MOV được chuyển thành giá trị nhị phân. Điều này không đề cập đến lệnh MOV hoạt động là một giá trị, đó là từ khóa mà chúng tôi sử dụng, vì vậy chúng tôi không phải ghi nhớ giá trị nhị phân 16 đến 32 bit.
Ramhound
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.