Tài nguyên về học lập trình trong mã máy? [đóng cửa]


24

Tôi là một sinh viên, mới lập trình và yêu thích nó, từ Java đến C ++ và xuống C. Tôi đã di chuyển ngược về các barebones và nghĩ rằng sẽ đi sâu hơn vào hội.

Nhưng, thật ngạc nhiên, nhiều người nói rằng nó không nhanh bằng C và không có tác dụng. Họ đề nghị học cách lập trình kernel hoặc viết trình biên dịch C. Ước mơ của tôi là học lập trình nhị phân (mã máy) hoặc có thể lập trình kim loại trần (chương trình vi điều khiển vật lý) hoặc viết bios hoặc bộ tải khởi động hoặc một cái gì đó có tính chất đó.

Điều duy nhất tôi có thể nghe được sau rất nhiều nghiên cứu là trình soạn thảo hex là thứ gần nhất với ngôn ngữ máy tôi có thể tìm thấy trong thời đại này. Có những điều khác tôi không biết? Có tài nguyên nào để học lập trình trong mã máy không? Tốt nhất là trên bộ vi điều khiển / bộ vi xử lý 8 bit.

Câu hỏi này tương tự câu hỏi của tôi, nhưng trước tiên tôi quan tâm đến việc học thực tế và sau đó hiểu lý thuyết.


2
Có gì chính xác là vấn đề ở đây? Nếu bạn hỏi liệu có thể mã bằng mã máy không thì câu trả lời có lẽ là "có". Nếu bạn đang yêu cầu hướng dẫn thì a) làm rõ rằng đó là câu hỏi của bạn, nhưng b) đó không phải là một câu hỏi mang tính xây dựng.
ChrisF

6
Là C không đủ kim loại?
Tom Squires

6
Tôi program bare metalmỗi khi tôi đá hộp máy chủ của tôi. Công trình kỳ diệu!
yannis

7
Bao giờ xem xét đi xa hơn nữa? Hack CPU của riêng bạn: opencores.org
SK-logic

3
@ SK-logic, vâng, chương trình mã máy sẽ không thể truy cập được sau khoảng 1 giờ. Bạn nói đúng, một ý tưởng tốt hơn và hiệu quả hơn là bắt tay vào thực hiện CPU. Ngoài ra còn có các phiên bản ảo của 6502 ( visual6502.org ) cũng như những người có hoặc khao khát xây dựng CPU bằng cách sử dụng logic rời rạc hiện đại ( bradrodriguez.com/ con / piscedu2.htm )
Angelo

Câu trả lời:


27

Mọi người không lập trình trong mã máy (trừ khi họ là khổ dâm). Họ sử dụng (hoặc phát triển) các công cụ để tạo mã máy (trình biên dịch hoặc trình biên dịch, bao gồm các công cụ phát triển chéo) hoặc có lẽ các thư viện tạo mã máy (LLVM, libjit, GNU sét, ....). Vì vậy, các tài nguyên về tạo mã máy, biên dịch, tối ưu hóa và kiến ​​trúc vi mô cũng có liên quan.

Và rất thường xuyên, một trình biên dịch tối ưu hóa tốt sẽ tạo ra mã máy tốt hơn bạn có thể làm. Có lẽ bạn sẽ không thể viết mã trình biên dịch 200 dòng tốt hơn trình tối ưu hóa tốt.

Nếu bạn muốn hiểu mã máy, hãy học lắp ráp trước. Nó rất gần với mã máy. Sử dụng nó một cách khôn ngoan, chỉ cho những thứ bạn không thể mã bằng C (hoặc trong một số ngôn ngữ cấp cao hơn, như Ocaml, Haskell, Common Lisp, Scala). Một cách tốt thường là sử dụng các asmhướng dẫn (đáng chú ý là tính năng lắp ráp mở rộng GCC ) bên trong chức năng C. Đọc mã lắp ráp (được tạo bởi gcc -S -O2 -fverbose-asm) cũng có thể hữu ích.

Các Linux hội Howto là một điều tốt để đọc.

Kiến trúc tập lệnh của bộ xử lý hiện tại (tức là bộ hướng dẫn được hiểu bởi chip) khá phức tạp. Những cái phổ biến là x86 (một PC điển hình ở chế độ 32 bit), X86-64 (một PC để bàn ở chế độ 64 bit), ARM (điện thoại thông minh, ...), PowerPC , v.v ... Chúng đều khá phức tạp (vì lịch sử và kinh tế lý do). Có lẽ việc học trước tiên là một bộ hướng dẫn giả thuyết, ví dụ như MMIX của Knuth đơn giản hơn.


8
"Mọi người không lập trình bằng C (...). Họ sử dụng các ngôn ngữ hiện đại, có lẽ với phần phụ trợ C"
Abyx

Tôi chắc chắn đồng ý. Và dự án công việc hiện tại của tôi ( MELT , xem gcc-melt.org ) là một DSL được dịch sang C.
Basile Starynkevitch

Tôi đã thêm một số tài liệu tham khảo đến
ISAs

6
Còn những người muốn tạo và lắp ráp thì sao? Có nhiều lý do để học mã máy, mặc dù chúng không phổ biến.
Jetti

Tôi muốn nói rằng nó đang học một kiến ​​trúc tập lệnh (sử dụng các ký hiệu lắp ráp). Bạn hiếm khi tìm hiểu rõ ràng mã hóa chính xác của hướng dẫn (ví dụ: NOP là 0x90). Bạn cần biết nhiều khi viết trình biên dịch mã hoặc trình tạo mã máy. (Tương tự như vậy, bạn hiếm khi cần phải học thuộc bảng mã UTF8 của Unicode).
Basile Starynkevitch

13

Như đã nêu trước đây Tìm hiểu hội .

Ngôn ngữ lắp ráp là ngôn ngữ lập trình cấp thấp cho máy tính, bộ vi xử lý, vi điều khiển và các thiết bị lập trình khác. Nó thực hiện một biểu diễn tượng trưng của mã máy và các hằng số khác cần thiết để lập trình kiến ​​trúc CPU nhất định.

Vậy hội là a symbolic representation of machine code.

Bây giờ bạn có thể hỏi "Ok, vậy làm thế nào để tôi học được tất cả những điều đó?" Tôi rất vui vì bạn đã hỏi:

  1. Hiểu nó là gì. Nó là cấp độ rất thấp và sẽ cung cấp cho bạn một sự hiểu biết rất sâu sắc về một máy tính. Bạn có thể muốn bắt đầu với Wikipedia và sau đó đọc đoạn văn ngắn này .
  2. Học nó! Những bài đọc hay nhất có lẽ là Nghệ thuật của ngôn ngữ hộingôn ngữ hội từng bước: Lập trình với Linux
  3. Nhận mã hóa!

Tôi đã đọc chủ đề khác này và tôi đoán tôi đã vấp phải điều này: lập trình viên.stackexchange.com/a/82573/43388 bất cứ điều gì thuộc về bản chất đó tôi có thể tìm thấy một hướng dẫn về? Nhưng, tôi cần học lắp ráp trước để chuyển đổi dễ dàng hơn.
AceofSpades

1
Cảm ơn, tôi đoán tôi cần học lắp ráp theo yêu cầu phổ biến. +1
AceofSpades

8

Tôi thực sự khuyên bạn nên xem xét lại mục tiêu của mình và đây là lý do:

Lần đầu tiên tôi học ngôn ngữ hội 6502 trên Máy vi tính BBC (Model B, 32K). Nó đã có một triển khai BASIC tuyệt vời bao gồm một trình biên dịch macro. Chúng tôi có chúng ở trường nên tôi đã viết tất cả các chương trình tinh nghịch sẽ làm những việc như thao tác đệm màn hình trực tiếp để thực hiện bước đi Lemming trên mỗi màn hình, xung quanh phòng (chúng được nối mạng) nếu máy móc đã được sử dụng trong 10 phút . Nó dẫn đến những tiếng cười khúc khích giữa những người bạn Lớp 7 của tôi.

Khi tôi có một chiếc Commodore 64 ở nhà, tôi đã biết rằng nó có CPU 6510 cũng chạy ngôn ngữ lắp ráp 6502 nhưng với một số tính năng bổ sung thú vị. Tôi đã phải mua một trình biên dịch (đi kèm hộp mực ) và gọi các chương trình thông qua BASIC. Với tầm nhìn lớn về việc viết một trò chơi bán chạy nhất, cuối cùng tôi đã xoay sở để tạo ra một số bản demo mà các phần cứng hiển thị video bị xoắn đôi khi bị gián đoạn để thực hiện các hiệu ứng thanh màu thú vị mà hoạt hình thành nhạc chip vui nhộn. Ấn tượng, nhưng không hữu ích.

Sau đó, tôi đã nhận được một chiếc Acorn Archimedes A310 có CPU ARM2 vì vậy tôi đã sử dụng cùng một triển khai BASIC tuyệt vời với trình biên dịch macro tích hợp như BBC Micro (cùng di sản). Tôi đã xoay sở để kết hợp một vài trò chơi mà một người bạn giàu có cung cấp đồ họa, cộng với một số bản demo trippy dựa trên hình sin. Cả hai đều khó để lập trình và mã xấu có thể làm hỏng máy (vô tình vấp phải thanh ghi thiết lập lại phần cứng, v.v.), mất tất cả mọi thứ nếu tôi không lưu (vào đĩa mềm!).

Tại trường đại học, tôi đã được giới thiệu về C ++ và do đó C. Tôi đã có thể sử dụng nó để lập trình Sun / Solaris và một số máy tính lớn khác. Tôi không biết CPU kiến ​​trúc những máy này chạy trên cái gì - Tôi không bao giờ cần sử dụng trình biên dịch hoặc đọc mã máy vì các công cụ C ++ đã cho tôi sức mạnh tôi cần để tạo ra các ứng dụng chuyên nghiệp.

Sau Uni, tôi đã làm việc trên Windows và một số hương vị của Unix. C và C ++ đã làm việc trên tất cả các máy này và cuối cùng Java cũng vậy.

Sau đó tôi đã làm việc trên Windows và Dreamcast bằng C ++ với DirectX với chuỗi công cụ toàn diện để gỡ lỗi.

Sau đó, tôi đã nhận một công việc làm việc với các chipset dựa trên ARM cho TV thông minh (năm 2000). Mặc dù kinh nghiệm của tôi với ARM2 có thể có liên quan ở đây, công việc dựa trên C. Tôi thấy rằng tất cả những điều thú vị về phần cứng mà tôi đã thực hiện trên Archimedes cũng có thể được thực hiện trong C bằng cách sử dụng các thao tác vặn bit đơn giản. Một phần vai trò của tôi là di chuyển cơ sở mã sang Windows, Playstation 2, Linux, các chipset và TV di động khác. Tất cả các nền tảng này đều có sẵn với cả trình biên dịch C (thường là GCC) và một số cấp độ API để ghi vào máy bên dưới - thế giới nhúng hiếm khi là O / S kernel. Tôi chưa bao giờ cần biết mã máy đầy đủ cho bất kỳ nền tảng cụ thể nào ngoài việc viết bộ tải khởi động và mini-BIOS, cả hai đều nhảy vào mã C trong cơ hội có sẵn đầu tiên (sau khi thiết lập các vectơ bẫy,

Công việc tiếp theo là làm việc với C ++, C # và JavaScript trên Windows. Không có mã máy.

Công việc hiện tại đang làm việc với C ++, JavaScript, Python, LUA, HTML và các ngôn ngữ khác trên các nền tảng khác nhau. Tôi không biết những nền tảng nào mà các nền tảng này chạy, tôi cũng không cần biết - trình biên dịch sẽ dịch mã của chúng tôi thành bất cứ thứ gì nó cần. Nếu nó gặp sự cố, tôi bắt lỗi trong trình gỡ lỗi hoặc thông qua chẩn đoán thời gian chạy (ngoại lệ, tín hiệu, v.v.).

Để giải trí, tôi phát triển các ứng dụng iOS vào thời gian rảnh rỗi tôi có ở nhà. Nó sử dụng Objective-C và API hoạt động trên nhiều chipset. Rõ ràng chúng dựa trên ARM, nhưng tôi chưa bao giờ thấy bất kỳ mã máy nào trong quá trình phát triển của mình.

Mặc dù đây là một bài tập hấp dẫn để học ngôn ngữ lắp ráp, nhưng hiện nay có các công cụ và ngôn ngữ cấp cao hơn nhiều cho phép bạn trở thành một người có trình độ (hoặc hai) hiệu quả hơn.

Số cơ hội việc làm dành cho một lập trình viên ngôn ngữ / mã máy lắp ráp tuyệt vời rất nhỏ so với những thứ như JavaScript, Java, C #, C ++ hoặc ObjC.

Tôi khuyên bạn nên biến điều này thành sở thích / lợi ích phụ hơn là mục tiêu chính.


6
Đó là một sở thích. Tôi quan tâm đến cách mọi thứ hoạt động và học cách thao tác chúng ở mức rất cơ bản nếu có thể. +1
AceofSpades

6

Đề xuất của tôi? Tìm hiểu MIPS và tìm hiểu cách xây dựng bộ xử lý MIPS (đơn giản). Nó thực sự dễ dàng hơn nó có vẻ.

Ưu điểm của MIPS so với một số kiến ​​trúc khác là sự đơn giản. Bạn sẽ không bị cuốn vào vô số chi tiết nhỏ, nhưng bạn vẫn sẽ học được tất cả những ý tưởng lớn bạn cần để viết mã trong các kiến ​​trúc khác.

Thật trùng hợp, đây là dự án cuối cùng cho lớp CS giới thiệu (thứ ba) của tôi. Nếu bạn muốn, bạn có thể đọc bài tập và duyệt qua các bài giảng dưới dạng video hoặc slide .

Trong số những thứ khác, chúng tôi đã đề cập đến cách mã MIPS được chuyển thành nhị phân; chúng tôi thậm chí đã phải giải mã một số mã máy (rất đơn giản) trong các bài kiểm tra.

Ngay cả khi bạn không muốn bao quát mọi thứ, hầu hết các bài giảng đều được đưa ra bởi một trong những giảng viên yêu thích của sinh viên và họ rất vui khi xem.


Cảm ơn bạn rất nhiều vì các liên kết và giải thích tôi nên bắt đầu từ đâu. +1
AceofSpades

6

Tôi là một sinh viên, mới lập trình và yêu thích nó, từ Java đến C ++ và xuống C. Tôi đã di chuyển ngược về các barebones và nghĩ rằng sẽ đi sâu hơn vào hội.

Con đường tuyệt vời để đi. Bước nhảy của tôi (rơi?) Từ C sang hội và thấp hơn là một khóa học đại học Tổ chức và thiết kế máy tính , dựa trên cuốn sách cùng tên.

Rất khuyến khích cuốn sách này cho các chương đầu tiên về lắp ráp MIPS cơ bản, tất cả các cách thông qua kiến ​​trúc đường ống và bộ nhớ. Thậm chí tốt hơn là tham gia một khóa học xung quanh cùng một chủ đề, hoặc tìm một số bài giảng trực tuyến.

Ngoài ra, hãy xem MARS MIPS Simulator để có được bàn tay viết lắp ráp bẩn.


4

Nếu bạn muốn hiểu làm thế nào máy hoạt động hoàn toàn, tại sao bạn không đi ở mức thấp nhất có thể và xây dựng theo cách của bạn đến nơi bạn đang ở (ví dụ: C, C ++)?

Điều đó có nghĩa là: tại sao bạn không xây dựng bộ cộng 4 bit của riêng mình với các bóng bán dẫn trên một mạch (chỉ Google nó nếu bạn đang tìm kiếm hướng dẫn / hướng dẫn)?

Sau đó, xây dựng một máy tính nhỏ với một ít RAM, sau đó bắt đầu học hội và viết một hoặc hai chương trình với nó.


Nếu người đăng ban đầu xây dựng một máy tính từ đầu, anh ta sẽ phải xác định (không chỉ tìm hiểu) lắp ráp của riêng mình.
Basile Starynkevitch

@daniels Tôi hiểu lý do bằng cách học thêm từ các bit thực sự ở mức thấp. +1
AceofSpades

Một cách khác để xây dựng một máy tính từ đầu có thể là học một số bộ xử lý cũ (và ngôn ngữ lắp ráp của nó) như Z80 hoặc 6502 vẫn đủ đơn giản để hiểu. Tôi đoán thậm chí có những trình giả lập mà bạn có thể chơi với.
Giorgio

@AceofSpades Một cách tuyệt vời để dễ dàng xây dựng CPU và các thành phần CPU (ví dụ: trình bổ sung) là với redstone trong Minecraft, tôi muốn giới thiệu điều đó. Tôi đã bắt đầu làm việc trên một số máy đơn giản trong Minecraft và nó đã thúc đẩy sự hiểu biết của tôi về lý thuyết và logic đằng sau máy tính.
Aaron

1

Tôi có một bộ hướng dẫn được tạo ra cho việc này, một trình giả lập và một số hướng dẫn về những điều cơ bản một hướng dẫn hoặc khái niệm cho mỗi bài học. Chỉ cần gõ chương trình, chạy nó sau đó học những gì nó làm, chuyển sang bài học tiếp theo.

http://www.github.com/dwelch67/lsasim

Tôi cũng có các trình giả lập cho một vài bộ hướng dẫn chính. Bất kỳ hoặc tất cả đều tốt cho việc sử dụng để học asm (nếu bạn thực sự cảm thấy bạn phải học x86, học nó lần cuối và sử dụng một trình giả lập như cái tôi đã rẽ nhánh, trước tiên là 8088/86, sau đó tiến về phía trước). Học chống lại một trình giả lập có những ưu và nhược điểm, một chuyên gia lớn, đặc biệt khi bắt đầu, là bạn không gặp sự cố gì và bạn có tầm nhìn tuyệt vời. Trước tiên, nhảy vào một nền tảng nhúng, vi điều khiển, v.v. để tìm hiểu một tập lệnh mới, bạn phải vượt qua những trở ngại để không thể nhìn thấy những gì đang diễn ra, dẫn đến một danh sách dài các cách để thất bại ...


1

Mã của Charles Petzold là một giới thiệu rất hay về chủ đề này và mô tả quá trình xây dựng một máy tính bao gồm cách xây dựng các bộ cộng, bộ đếm và mảng RAM và giới thiệu mã máy và ngôn ngữ lắp ráp và mối quan hệ của chúng với các ngôn ngữ cấp cao hơn. Nó cũng là một bài đọc tuyệt vời về lịch sử của máy tính.

Và tôi vừa đọc câu hỏi này trên Electronics.stackexchange cũng có thể được sử dụng


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.