2010-02-28 38 views
48

Tôi thực sự muốn học lắp ráp. Tôi khá giỏi c/C++, nhưng muốn hiểu rõ hơn về những gì đang diễn ra ở cấp độ thấp hơn.Để học lắp ráp - tôi có nên bắt đầu với 32 bit hoặc 64 bit không?

Tôi nhận ra rằng câu hỏi liên quan lắp ráp đã được hỏi trước, nhưng tôi chỉ tìm kiếm một số hướng đó là đặc biệt đến tình hình của tôi:

Tôi đang chạy windows 7, và đang bối rối về làm thế nào tôi nên bắt đầu làm việc với lắp ráp. Tôi có để bắt đầu với x64 vì tôi đang chạy các cửa sổ 7 không? Một số người đã nói 'bắt đầu với 32 bit đầu tiên' - làm thế nào để tôi đi về việc này? Hệ điều hành của tôi phải làm gì với khả năng viết assembly của tôi cho bit '32' hoặc '64'. Trong thực tế, cụm từ 'n bit' có nghĩa là gì, trong đó n là một số ??


Edit:

Dưới đây là một số liên kết đã giúp tôi bắt đầu với lắp ráp; những người mới chỉ mới bắt đầu có thể thấy chúng hữu ích. Tôi sẽ tiếp tục cập nhật danh sách này khi tôi tiếp tục hành trình lắp ráp của mình :)

Lưu ý: Vì tôi đã học, tôi đã quyết định tập trung vào lập trình với masm32. Do đó, hầu hết các tài nguyên dưới đây đều tập trung vào đó.

  • tag wiki (hướng dẫn người mới bắt đầu, sách hướng dẫn tham khảo, tài liệu ABI, và nhiều hơn nữa.)
  • www.masm32.com
  • X86 Assembly WikiBook
  • X86 Dissassembly WikiBook (tuyệt vời cho sự hiểu biết một số công ước, và những điều cơ bản về cách mã cấp cao dịch thành lắp ráp)
  • WinAsm IDE (phát độc đáo với masm32)
  • Intro: Assembly for Windows (tất cả các ví dụ mã là dành cho masm32)
  • List of Interrupts
  • Assembly Tutorial (tuyệt vời cho việc giúp đỡ để hiểu khái niệm cốt lõi)
  • x86 Assembly Guide
  • Agner Fog's Software optimization resources, bao gồm một số nội dung tốt về kêu gọi công ước trên nền tảng khác nhau (Windows vs. Linux/OS X), cũng như rất nhiều ví dụ về cách làm những việc cụ thể một cách hiệu quả. Không tuyệt vời cho người mới bắt đầu, nhưng tuyệt vời cho người đọc từ trung cấp đến cao cấp.

    (Ông cũng có thông tin hiệu suất chi tiết cho từng hướng dẫn dành cho CPU Intel và AMD, tuyệt vời để tối ưu hóa hiệu năng nghiêm trọng. Một số người mới bắt đầu có thể muốn xem xét một số cách để bắt đầu suy nghĩ về cách CPU hoạt động. có thể làm điều gì đó một cách thay vì cách khác.)

+1

Cân nhắc "Lập trình từ Ground Up" –

+0

Chúc bạn may mắn. Viết lắp ráp là một kéo thực sự. Không cố gắng để ngăn cản nó, nhưng damn nó khá cam kết – HumbleWebDev

Trả lời

33

Khi mọi người tham khảo 32-bit64-bit lắp ráp, chúng ta đang nói về những hướng dẫn thiết lập bạn sẽ sử dụng - họ cũng đôi khi được gọi Ia32x64 trong trường hợp của Intel, mà tôi đoán bạn đang hỏi về . Có rất nhiều điều xảy ra trong trường hợp 64-bit, do đó, bắt đầu với 32-bit có lẽ là tốt; bạn chỉ cần chắc chắn rằng bạn đang lắp ráp chương trình của bạn với một bộ ghép 32 bit vào một nhị phân 32 bit. Windows sẽ vẫn biết cách chạy nó.

Điều tôi thực sự khuyên bạn nên bắt đầu với việc lắp ráp sẽ là thứ gì đó với một bộ chỉ dẫn đơn giản hơn để có được sự xử lý. Hãy tìm hiểu MIPS assembly - trình mô phỏng spim thật tuyệt vời và dễ sử dụng. Nếu bạn thực sự muốn đi sâu vào thế giới lắp ráp Intel, hãy viết cho mình một chương trình C nhỏ gọi các thói quen lắp ráp của bạn cho bạn; làm tất cả các thiết lập và teardown cho một 'chương trình thực sự' là một mớ hỗn độn lớn, và bạn thậm chí sẽ không thể bắt đầu ở đó. Vì vậy, chỉ cần viết một wrapper C với main() trong nó, và biên dịch và liên kết với các tập tin đối tượng bạn nhận được từ viết mã lắp ráp của bạn.

Xin vui lòng không có thói quen viết lắp ráp nội tuyến trong mã C của bạn - đó là một cơn ác mộng về tính di động mã, và không có lý do gì cho nó.

Bạn có thể tải xuống tất cả Intel 64 and IA-32 Architectures Software Developer's Manuals để bắt đầu.

+0

Điều này hữu ích, cảm ơn. Sự khác biệt thiết lập hướng dẫn có ý nghĩa ... là sự khác biệt duy nhất? Giống như, có bất kỳ sự khác biệt nào trong cách chương trình được viết bằng 32 bit sẽ chạy như trái ngược với chương trình 64 bit không? Nếu không, tại sao chúng được gọi là 32-bit/64-bit, trái ngược với 'tập lệnh A' và 'tập lệnh B', chẳng hạn? – Cam

+2

@incrediman, bộ hướng dẫn là một sự khác biệt khá lớn. Các tập lệnh có các tên khác nhau, nhưng mọi người chỉ sử dụng 32-bit/64-bit để viết tắt. Ngoài ra, có các quy ước gọi điện khác nhau (ABI) giữa hai bộ lệnh và thậm chí cả hai ABI 64 bit cạnh tranh. –

+0

"Hiện tại, chúng tôi chỉ đang thực hiện mã hóa 32 bit, vì vậy các thanh ghi bên trong trong CPU, đối với chúng tôi, sẽ là 32 bit. Mỗi bit có khả năng lưu trữ 1 hoặc 0." (http://www.friedspace.com/assembly/cpuregs1.php) ... Đây có phải là sự khác biệt bổ sung giữa 32 và 64 bit asm không? Nếu câu đó không nói gì? Cảm ơn! – Cam

3

Nhận IDA pro. Đó là đầu gối ong để làm việc với lắp ráp.

Cá nhân tôi không thấy nhiều sự khác biệt giữa 32 bit và 64 bit. Nó không phải là về các bit mà là tập lệnh. Khi bạn nói về lắp ráp, bạn nói về các bộ hướng dẫn. Có lẽ họ đang ngụ ý rằng một tập lệnh 32-bit là tốt hơn để học hỏi từ.Tuy nhiên nếu đó là mục tiêu của bạn, tôi đề nghị Donald Knuth sách về thuật toán - họ dạy thuật toán về lắp ráp bộ hướng dẫn 7 bit: D

Vì vấn đề về tính di động, bạn nên học cách sử dụng trình biên dịch nội tại - nó sẽ là tối ưu hóa tốt nhất cho các tối ưu hóa không được nhúng. : D

+1

Từ những gì tôi đọc, đó là một disassembler ... vì vậy, thực sự viết/mã hóa một số mã ngôn ngữ lắp ráp là không thể, phải không? Nếu vậy, đây chỉ là một nửa câu trả lời. –

+1

Làm việc với việc lắp ráp những ngày này (ngay cả trong đất được nhúng) là về việc điều chỉnh mã được tạo ra bởi trình biên dịch C/C++. IDA làm cho công việc này trở nên đau đớn nhất có thể. –

+0

Điều đó có thể nhưng nó vẫn không trả lời cho câu hỏi ban đầu của tôi là tốt :) – Cam

0

nhưng muốn có một sự hiểu biết tốt hơn về những gì đang xảy ra ở mức độ thấp hơn

Nếu bạn thực sự muốn biết tất cả những gì đang xảy ra ở mức độ thấp hơn trên bộ vi xử lý/hệ thống x86/x64, tôi sẽ thực sự khuyên bạn nên bắt đầu với những điều cơ bản, đó là, 286/386 mã chế độ thực. Ví dụ, trong mã 16 bit, bạn buộc phải sử dụng phân đoạn bộ nhớ, đây là một khái niệm quan trọng cần hiểu. Các hệ điều hành 32-bit và 64-bit của ngày hôm nay vẫn bắt đầu ở chế độ thực, sau đó chuyển sang/giữa các chế độ liên quan.

Nhưng nếu bạn quan tâm đến phát triển ứng dụng/thuật toán, bạn có thể không muốn tìm hiểu tất cả các công cụ hệ điều hành cấp thấp. Thay vào đó bạn có thể bắt đầu ngay với mã x86/x64, tùy thuộc vào nền tảng của bạn. Lưu ý rằng mã 32 bit cũng sẽ chạy trên Windows 64 bit, nhưng không chạy theo cách khác.

+1

Thời gian khởi động không phải là cách duy nhất ở mức thấp hơn để tương tác với một hệ thống; Tôi nghĩ rằng viết bản địa hội cho các chương trình hệ điều hành là một cách tốt để bắt đầu. Viết và gỡ lỗi hệ thống khởi động không dành cho những người yếu tim. –

+2

Hiểu được các phân đoạn 16 bit hữu ích khi học cách các chữ số La Mã hoạt động. Và như xa như bắt đầu trong chế độ thực để bootstrap hệ điều hành của riêng bạn, đó sẽ mất một vài năm nghiên cứu, trừ khi nó chỉ sẽ được in ra "BIOS trao cho tôi những giá trị đăng ký trên màn hình xxxx xxxx". Công cụ cấp thấp như đọc/ghi các cổng phần cứng trong trình điều khiển thiết bị sẽ là một sử dụng tốt cho mã lắp ráp ngay cả khi bạn không phải là một thiên tài asm. –

+0

+1 cho chế độ Thực 16 bit! – dns

20

Tôi bắt đầu viết assembly vào năm 1977 bằng cách lấy tuyến đường dài: học toán cơ bản đầu tiên (và, hoặc, xor, not) và toán bát phân trước khi viết chương trình cho DEC PDP-8/E với OS/8 và 8k ký ức. Đây là vào năm 1977.

Kể từ đó tôi đã phát hiện ra một vài thủ thuật về cách học lắp ráp cho các kiến ​​trúc mà tôi không quen thuộc. Đó là một số ít: 8080/8085/Z80, x86, 68000, VAX, 360, HC12, PowerPC và V850. Tôi hiếm khi viết các chương trình độc lập, thường là các hàm được liên kết với phần còn lại của hệ thống thường được viết bằng C.

Vì vậy, trước hết tôi phải có khả năng giao tiếp với phần mềm còn lại yêu cầu học thông số đi qua, bố cục ngăn xếp, tạo khung ngăn xếp, vị trí tham số, vị trí biến cục bộ, loại bỏ khung ngăn xếp, giá trị trả về, trả về và dọn dẹp ngăn xếp. Cách tốt nhất để làm điều này là viết một hàm gọi một hàm khác trong C và kiểm tra danh sách mã được tạo bởi trình biên dịch.

Để tự học ngôn ngữ lắp ráp, tôi viết một số mã đơn giản, xem trình biên dịch tạo ra và đơn bước qua nó trong trình gỡ lỗi thô. Tôi có hướng dẫn sử dụng hướng dẫn đặt gần để tôi có thể tra cứu các hướng dẫn mà tôi không chắc chắn.

Một điều tốt cần biết (ngoài việc xử lý ngăn xếp được đề cập trước đây) là cách trình biên dịch tạo mã máy cho một cấu trúc ngôn ngữ cấp cao nhất định. Một chuỗi như vậy là cách các mảng/cấu trúc được lập chỉ mục được dịch thành con trỏ. Khác là trình tự mã máy cơ bản cho các vòng lặp.

Vì vậy, "trình gỡ lỗi thô" là gì? Với tôi đó là một trình gỡ rối là một phần của gói phát triển đơn giản và không cố gắng bảo vệ tôi khỏi phần cứng như trình gỡ lỗi trực quan (s). Trong đó tôi có thể dễ dàng chuyển đổi giữa nguồn và lắp ráp gỡ lỗi. Nó cũng bắt đầu nhanh chóng từ bên trong IDE phát triển. Nó không có ba nghìn tính năng, nhiều khả năng ba mươi và những người sẽ là những người bạn sử dụng 99,9% thời gian. Gói phát triển thường là một phần của trình cài đặt mà bạn nhấp một lần để phê duyệt giấy phép, một lần để phê duyệt thiết lập mặc định (bạn có thích nó khi ai đó nghĩ và làm việc đó cho bạn không?) Và lần cuối cùng để cài đặt .

Tôi có một môi trường phát triển đơn giản được yêu thích cho x86-32 (IA-32) và đó là OpenWatcom. Bạn có thể tìm thấy nó tại openwatcom.org.

Tôi khá mới với x86-64 (AMD64) nhưng quá trình chuyển đổi có vẻ đơn giản (giống như khi chuyển từ x86-16 sang x86-32) với một số mánh lới quảng cáo phụ như đăng ký bổ sung r8 đến r15 và thanh ghi rộng 64 bit. Tôi vừa mới chạy qua một môi trường phát triển cho XP/64, Vista/64 và 7/64 (có thể hoạt động cho hệ điều hành máy chủ: s) và nó được gọi là Pelles C (pellesc.org). Nó được viết và duy trì bởi một Pelle Orinius ở Thụy Điển và từ vài giờ tôi đã trải qua với tôi có thể nói rằng nó là mệnh để trở thành yêu thích của tôi cho x86-64. Tôi đã thử các gói Visual Express (họ cài đặt quá nhiều rác - bạn có biết bao nhiêu uninstalls bạn cần phải làm sau đó? Hơn 20) và cũng đã cố gắng để có được gcc từ một nơi để làm việc với một IDE (eclipse hoặc cái gì khác) Đến từ một nơi khác.

Một khi bạn đã đi xa này và bạn bắt gặp một kiến ​​trúc mới, bạn sẽ có thể dành một hoặc hai giờ để xem danh sách được tạo ra và sau đó khá nhiều kiến ​​trúc khác tương tự như thế nào. Nếu chỉ số và cấu trúc vòng lặp xuất hiện lạ, bạn có thể xem xét mã nguồn tạo ra chúng và có lẽ cả mức tối ưu hóa trình biên dịch.

Tôi nghĩ rằng tôi nên cảnh báo bạn rằng khi bạn bị treo nó, bạn sẽ thấy rằng ở bàn gần, tại máy pha cà phê, trong các cuộc họp, ở fora và nhiều nơi khác sẽ có cá nhân chờ đợi để khinh miệt bạn , làm cho niềm vui của bạn, ném báo giá không đầy đủ vào bạn và đưa ra lời khuyên không thông thạo/không đủ năng lực vì bạn quan tâm đến lắp ráp. Tại sao họ làm điều này tôi không biết. Có lẽ bản thân họ là những lập trình viên lắp ráp không thành công, có lẽ họ chỉ biết OO (C++, C# và Java) và đơn giản là không có manh mối nào về những gì mà người lắp ráp đang nói đến. Có lẽ một người nào đó mà họ "biết" (hoặc người bạn của họ biết) là "thực sự tốt" có thể đã đọc điều gì đó trong một diễn đàn hoặc nghe điều gì đó tại một hội nghị và do đó có thể cung cấp một sự thật tuyệt đối thời gian. Có rất nhiều người trong số họ ở đây tại stackoverflow.

+0

Câu trả lời hay (cảm ơn bạn đã thêm nó bất kể tuổi của câu hỏi), nhưng bạn không cần phải làm cho cộng đồng wiki - bạn xứng đáng có một số người đại diện! :) – Cam

+0

Cảm ơn Cam. Tôi cảm thấy câu hỏi cần thêm một cái gì đó ... howto trong thực tế! –

+0

@OlofForshell Olof, tôi muốn nói chuyện với bạn đôi khi. Nếu bạn quan tâm đến việc nói chuyện, địa chỉ email của tôi là [email protected] Vui lòng nhắn tin cho tôi bất cứ lúc nào, tôi sẽ liên hệ lại với bạn. – zeboidlund

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