Mã máy thực sự trông như thế nào trong khi đang chạy?


21

Khi mã máy thực sự được thực thi bởi phần cứng và CPU, nó trông như thế nào?

Nó sẽ trông giống như nhị phân, như trong các hướng dẫn được đại diện bởi các số và số 0, hoặc nó sẽ là một thứ gì đó được tạo thành từ các chữ số thập lục phân trong đó các mã là các byte được trình bày dưới dạng số hex có thể được chia lại thành số nhị phân, như mã byte?


24
Những gì bạn sẽ thấy là dây, cổng và thanh ghi nhấp nháy trên silicon. Ví dụ: visual6502.org/JSSim
Nayuki

4
@Nayuki Tôi nghĩ rằng hình dung này là tuyệt vời và xứng đáng được đưa vào một câu trả lời!
nalzok

2
Nó không giống bất cứ thứ gì với tôi
Gaius

3
Nó thậm chí không thực sự tồn tại khi nó thực sự "được thực thi". Đó là "JIT được biên dịch" bởi một thiết bị (phần cứng!) Trên CPU thành microcode, thực sự hướng dẫn CPU!
xuq01

2
Một cách nhanh chóng để hiểu cách máy tính dịch là xây dựng một cổng từ cổng logic, tôi thực sự thích xem cái được tạo bởi Ben Eater youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

Câu trả lời:


38

Câu trả lời tốt nhất tôi có thể đưa ra là, nó không thực sự "trông" như bất cứ thứ gì. Lệnh hiện đang được CPU thực thi được thể hiện bằng một loạt các dây, một số trong đó có điện áp cao, một số có điện áp thấp.

Bạn có thể hiểu các điện áp cao và thấp là 0 và 0, nhưng bạn cũng có thể hiểu các nhóm điện áp cao và thấp như các chữ số thập lục phân, hoặc như một hướng dẫn lắp ráp như ADD $0 $1(gần nhất với cách CPU diễn giải nó). Những con số và bản thân chúng là tiện lợi cho con người đọc; bên trong, nó không có gì ngoài điện áp trên dây.

Trong số các tùy chọn này, nhị phân là "gần nhất với kim loại", trong đó các số 0 và số ánh xạ trực tiếp tới điện áp cao và thấp trên dây. Nhưng không ai trong số những cái khác là không chính xác, và chúng thường hữu ích hơn: có một lý do khiến mọi người nhìn vào các khối hex của các tệp thực thi, nhưng hầu như không bao giờ là các nhị phân.


Vì vậy, bạn có thể mở một chương trình trong trình soạn thảo hex và các byte được biểu thị trong hex dịch sang nhị phân mã máy có thể được chạy bằng điện áp được gán cho 0 và điện áp được gán cho một?
Tim Hardly

4
@TimHardly Yep! Hex chỉ dễ đọc hơn. Hội, tương tự, thậm chí còn dễ đọc hơn, nhưng có thể được dịch một cách máy móc sang số không và số. Đó là lý do tại sao trình biên dịch dễ viết hơn trình biên dịch.
Draconis

cảm ơn, toàn bộ câu hỏi này đã mở rộng kiến ​​thức của tôi và xóa tan sự nhầm lẫn của tôi.
Tim cứng

1
@TimHardly Một trình biên dịch chỉ ánh xạ một chuỗi các ký tự như "NOP" thành một chuỗi các bit như "10010000", lặp đi lặp lại, để biến một tệp lắp ráp thành mã máy. Các mã được xác định bởi CPU, vì đó là phần sẽ thực sự sử dụng chúng. Tất cả các máy tính có thể chạy cùng một tệp thực thi thực sự có cùng một tập hợp các mã; bộ x86 là phổ biến nhất và được sử dụng trong hầu hết các PC hiện nay. Một phổ biến khác là MIPS, được sử dụng trong một số máy chơi game.
Draconis

1
@TimHardly Nếu câu hỏi của bạn là, trình biên dịch có thể hỏi CPU xem opcode của nó là gì cho lệnh NOP không, câu trả lời là không. Trình biên dịch đã phải biết byte nào sẽ xuất ra cho lệnh trước khi nó có thể hoạt động. Trong thực tế, một trình biên dịch có thể xuất một chương trình cho một bộ xử lý, trong khi chính nó chạy trên một loại bộ xử lý khác.
Ông Lister

11

"Trông giống như" ngụ ý một phép ẩn dụ. Nếu chúng ta hiểu "nó sẽ trông như thế nào" theo nghĩa đen, thì nó sẽ trông giống như một miếng silicon được khắc lạ mắt trên bo mạch chủ của nó. Rõ ràng ẩn dụ là mục tiêu. Để xây dựng phép ẩn dụ, chúng ta cần xem xét nó thực sự là gì đầu tiên. Sau đó chúng ta có thể xây dựng một phép ẩn dụ được chấp nhận. Điều này hơi dài, nhưng may mắn thay, nó kết thúc bằng một phép ẩn dụ video cho bạn.

Mã máy thực sự được lưu trữ trong bộ nhớ dưới dạng bit. Các chip bộ nhớ thường là DRAM , lưu trữ các bit đó dưới dạng điện áp trên một tụ điện và electron. Hai cái được kết nối - thật khó để nói về điện áp mà không có electron. Đôi khi thật tiện lợi khi nói về người này hay người kia, nhưng hãy hiểu rằng người này đi đâu, người kia đi theo.

Hành trình của mã máy bắt đầu bằng một "tìm nạp". Một kiểu điện áp cụ thể được áp dụng cho các dây của chip RAM cho biết rằng bộ bit cụ thể này sẽ được gửi đến CPU. Tại sao? Đừng biết đừng quan tâm. Thông thường, tín hiệu đó được gửi đi vì CPU đã hoàn thành hướng dẫn cuối cùng và đang yêu cầu một tín hiệu mới như một phản ứng theo bản năng, giống như một con chó yêu cầu điều trị thứ hai sau khi bạn đưa ra lệnh đầu tiên. Quá trình này bắt đầu với một số cú đá nguyên thủy trong quần gây ra bởi sự mất ổn định tự nhiên trong CPU. Khi nguồn cung cấp điện áp vào chip không đổi, điện áp tăng dần dẫn đến CPU đặt điện áp chính xác lên chip RAM để có được hướng dẫn đầu tiên (Tôi sẽ điều khiển lớp BIOS một chút, vì nó không quan trọng đến câu chuyện. Hãy tìm nó).

Bộ nhớ hiện đại truyền dữ liệu song song. Điều này có nghĩa là các bit tạo nên mã máy được chia thành "làn" (phổ biến là 32 hoặc 64), đó là cách logic để nói các dây 32/64 từ RAM đến CPU. Điện áp trên các đường dây đó được nâng lên và hạ xuống khi cần thiết để truyền nó vào CPU.

Một khi nó ở trong CPU, nó có thể thực hiện công việc của nó. Đây là lĩnh vực của kiến trúc vi mô , và nó có thể trở nên phức tạp bởi vì đây thực sự là một ngành công nghiệp tỷ đô. Những điện áp này ảnh hưởng đến các bóng bán dẫn, ảnh hưởng đến các điện áp khác, theo cách mà chúng ta có thể mô tả là "thêm bit" hoặc "nhân". Tất cả chúng thực sự chỉ là điện áp đại diện cho các bit đó, giống như cách chúng ta có thể viết nguệch ngoạc chuỗi 5 ký tự "2 + 2 = 4" trên một tờ giấy và nói rằng chúng ta đã làm toán học. Các bút chì than chì không phải là số hai. Đó chỉ là đại diện vật lý mà chúng tôi đang sử dụng cho số đó.

Vì vậy, đó là những gì hệ thống thực sự làm, ở mức cực kỳ cao. Tôi đã bỏ qua tốt ... khá nhiều thứ ... nhưng nó đủ tốt để có thể quay lại câu hỏi thực tế của bạn. Nó [ẩn dụ] sẽ trông như thế nào?

Khi điều đó xảy ra, tôi nghĩ Martin Molin có thể đã xây dựng phép ẩn dụ tốt nhất, với Máy đá cẩm thạch của mình . Mã máy được mã hóa (bằng tay) vào một số dải Lego Technics ở giữa dưới dạng chốt, thay vì điện áp trên tụ điện. Điều này giống như EPROM hơn DRAM, nhưng cả hai đều giữ dữ liệu. Các viên bi giống như các electron, được di chuyển bằng điện áp (hoặc trọng lực, trong trường hợp viên bi). Và khi các electron di chuyển, chúng tác dụng lực lên các cổng làm mọi việc.

Máy của anh ta đơn giản, so với một CPU hiện đại, nhưng nó không tệ lắm, theo như những ẩn dụ. Và nó thật hấp dẫn!


1
Máy đá cẩm thạch quá đơn giản cho điều này trong video. Một CPU cần trạng thái.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Đúng. Tôi cho rằng nếu cỗ máy bằng đá cẩm thạch có một vài cánh cổng cho phép nó tự động ném cần gạt thay vì Marin phải lật chúng, thì nó sẽ gần hơn.
Cort Ammon - Phục hồi Monica

Cảm ơn! Tương tự như câu hỏi tôi đã hỏi về câu trả lời ở trên câu hỏi này, liệu mã lắp ráp có được coi là mã máy được dịch thành điện áp và mọi thứ không?
Tim cứng

@TimHardly Sử dụng các ý nghĩa duy nhất cho "lắp ráp", "Lắp ráp" và "Mã máy", Sản phẩm của lắp ráp lắp ráp được xác định là mã máy (vì vậy, có thể coi đó là =)). Một cái gì đó có thể giúp là cả lắp ráp và mã máy được coi là các khái niệm "logic", gần với khái niệm toán học "2 + 2 = 4" và hơn nữa từ than chì trên giấy mà phương trình đó được viết. Mã hội / mã máy là lắp ráp / mã máy cho dù nó đang được lưu trữ trên một đĩa từ tính, được viết trên một tờ giấy hoặc được lưu trữ trong các tụ điện trong DRAM.
Cort Ammon - Phục hồi Monica

1
Nếu tôi có thể tượng trưng cho triết học, mã máy là mã máy vì chúng tôi coi nó như mã máy. Chúng tôi nghĩ về nó như mã máy. Tôi có thể trỏ CPU vào các byte mô tả âm thanh ở định dạng .wav và nó thực sự sẽ thực thi chúng dưới dạng mã máy. Việc thực hiện kết quả không có khả năng làm bất cứ điều gì hữu ích (vì âm thanh không được xây dựng thành mã máy) và nó có thể dừng lại, nhưng nó có thể được thực thi.
Cort Ammon - Phục hồi Monica

10

Kiểm tra video này , đặc biệt là 1:00 đến 1:17. Đó chính xác là những gì nó trông giống như khi một chương trình đang chạy trên máy tính. Hai hàng đèn hiển thị nội dung hiện tại của thanh ghi địa chỉ và thanh ghi dữ liệu. PDP-11 không có thanh ghi chỉ dẫn, nhưng nếu có một và có đèn ở phía trước để hiển thị nội dung của nó, nó sẽ trông khá giống nhau. 16 đèn - một số trong số họ bật, một số trong số họ tắt.

Nếu bạn thực sự thích đèn nhấp nháy, bạn có thể có nhiều đèn hơn để hiển thị nội dung hiện tại của sáu thanh ghi, con trỏ ngăn xếp, bộ đếm chương trình ... để có thêm 32768 đèn bạn có thể có đèn cho mỗi bit của bộ đệm. Bạn thậm chí có thể có một ánh sáng cho mỗi bit bộ nhớ ... nhưng đó thực sự sẽ là rất nhiều ánh sáng.

Đây là PDP11-70 chạy ở tốc độ 15,2 MHz và mỗi lệnh mất khoảng 1,5 micro giây để thực thi. Mắt người có thể phát hiện các thay đổi xuống tới 1/10 giây và trong thời gian đó, PDP-11 có thể thực hiện 60.000 hướng dẫn. Về cơ bản, mọi thứ đều mờ ảo.


Ồ, đó là một ví dụ hay, tôi đã thấy những người khác thích nó, một cái gì đó dọc theo những dòng mà bạn có thể thấy ánh sáng và những thứ khác. youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly


6

Các nhà thiết kế phần cứng triển khai và thử nghiệm (và kiểm tra và thử nghiệm) bộ xử lý thực sự sử dụng các mô hình trực quan để xem thiết kế của họ đang làm gì. Hầu hết (nếu không phải tất cả) các công cụ mô phỏng HDL đưa ra các chế độ xem sóng của tất cả các thanh ghi và dây để cho phép gỡ lỗi dễ dàng. Ảnh chụp màn hình bên dưới (được chụp từ đây ) cho thấy các sóng này từ trình giả lập VCS cho bộ xử lý RISC-V chạy một vài hướng dẫn.

Sóng DVE cho RISC-V

Đây là một ví dụ khá đơn giản cho thấy một tập hợp con nhỏ của logic liên quan đến một thiết kế bộ xử lý đầy đủ. Bạn có thể mở các khung nhìn này cho toàn bộ bộ xử lý và xem dữ liệu truyền qua logic. Nếu bạn muốn xem mã máy đang chạy, như bạn đã đề cập, bạn có thể xem các sóng cho thanh ghi lệnh hoặc bus mà bộ xử lý sử dụng để đọc các hướng dẫn ra khỏi bộ nhớ. Hầu hết người xem sóng có các tùy chọn xem linh hoạt cho xe buýt và đăng ký cho phép bạn hiển thị các giá trị của chúng dưới dạng nhị phân, hex, bát phân và thậm chí là nhãn enum. Trong một số, bạn thậm chí có thể xác định các hàm của riêng mình để ánh xạ các mẫu bit thực hiện các giá trị được hiển thị.

Điều đáng chú ý là đây chỉ là một đại diện cho một mô phỏng của bộ xử lý. Không có cách nào để có được các loại khung nhìn này cho chip xử lý đã được chế tạo.


2

Hãy tưởng tượng một người mù vấp xuống một con hẻm đang xây dựng. Đâu đâu cũng có lỗ hổng và rạn nứt, nên tự nhiên anh nên ngã. Không phải người mù này, vì anh ta có một cuộn giấy có hướng dẫn, khi nào nên chờ, khi nào nên di chuyển, di chuyển ở đâu và làm thế nào để thao túng môi trường của anh ta để đến cuối con đường. Đó là những gì lắp ráp, một danh sách hướng dẫn mù quáng - chúng chỉ có ý nghĩa đối với con hẻm này và cho người mù này. Về lý thuyết, bạn thậm chí có thể xây dựng lại một mô hình 3d từ các hướng dẫn (Dịch ngược).

Mỗi thay đổi đối với nền tảng, cần phải biên dịch lại các hướng dẫn cho người mù. Bạn cần biết phần cứng (cách bố trí của công trường), hướng dẫn về ý định đánh máy của con người (Mã cấp cao) như "Tôi muốn bạn nhảy qua tất cả các hàng rào bạn gặp phải cho đến khi bạn vượt qua 12 hàng rào phía sau bạn" và khả năng của người mù (CPU). Liệu anh ta có trí nhớ ngắn hạn, khả năng làm nhiều việc cùng một lúc?

Lấy tất cả các thông tin này và tạo ra một cuộn chỉ dẫn mạch lạc là công việc của trình biên dịch.

Vì vậy, tôi có thể mô tả làm thế nào một chương trình trông? Không. Nhưng chúng ta có thể mô tả cảm giác khi thực hiện nó không? Vâng, nó sẽ cảm thấy như một cú nhảy và chạy, như gương cạnh mà không nhìn thấy gì đó, theo một danh sách hướng dẫn chính xác, bất cứ nơi nào nó có thể đưa bạn đi.

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.