2010-09-08 32 views
9

Tôi đã dành hàng giờ để khắc phục sự cố chỉ để có một người có kinh nghiệm hơn nhìn vào IL (một cái gì đó như 00400089 mov dword ptr [ebp-8], edx) và chỉ ra vấn đề. Thành thật mà nói, điều này trông giống như tiếng Do Thái với tôi - Tôi không biết nó nói gì.Làm cách nào để trở thành chuyên gia MSIL?

Tôi có thể tìm hiểu thêm về nội dung này và gây ấn tượng với mọi người xung quanh mình ở đâu? Mục tiêu của tôi là đọc những thứ như sau và đưa ra nhận xét như: Yeh, bạn đang có một tình trạng chạy đua.

.maxstack 2 
.entrypoint 
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass 
ldc.i4 5 
+5

Haha, "Tôi có thể tìm hiểu thêm về nội dung này và gây ấn tượng với mọi người xung quanh mình ở đâu". Trừ khi bạn đi chơi độc quyền với các nerds (như tôi), tôi đoán ... –

Trả lời

4

Để trở nên tuyệt vời tại IL, hãy bắt đầu với bài viết tuyệt vời này: Introduction to IL Assembly Language. Mặc dù nó nói "giới thiệu", đó là tất cả mọi thứ bạn cần để bắt đầu cảm thấy thoải mái.

Phần khác của những gì bạn cần là thực hành và rất nhiều. Sử dụng .NET Reflector và bắt đầu xem mã đã được tháo rời thành IL. (Mẹo: khi bạn tải xuống, bạn không phải cung cấp email thực.) Ngoài ra, hãy chơi với plugin Reflexil trong Trình phản chiếu. Đây là điểm khởi đầu tốt cho điều đó: Assembly Manipulation and C#/VB.NET Code Injection.

Không cần thiết nhưng tiền thưởng: Reflexil là nguồn mở. Bạn có thể lấy nguồn here.

7

Đó không phải là MSIL, nó là ngôn ngữ lắp ráp 80x86.

+3

Không có thắc mắc tôi không biết chuyện gì đang xảy ra. – RonT

+5

Đã từng làm việc trong nhiều năm, nhiều năm trước đây, gần đây nhất trong một thói quen mã hóa AES, tôi có thể nói với bạn rằng bạn không nên cố gắng pha loãng những nỗ lực của bạn học C# bằng cách cố gắng tập trung vào lắp ráp. Nếu mã ban đầu của bạn là trong C# bạn nên đã có thể phát hiện một điều kiện chủng tộc trong mã ban đầu. – Bill

3

Tôi có thể cung cấp cho bạn câu trả lời chạy cả hai cách.

Một mặt, không có gì giống như kỹ năng ngôn ngữ lắp ráp tốt để dạy bạn làm thế nào một máy tính thực sự hoạt động. MSIL, ở một mức độ nào đó, một ngôn ngữ giống như lắp ráp. Mặt khác, có rất ít cơ hội để thực hiện loại phát triển này nữa.

Mặt khác, việc sử dụng MSIL để khắc phục sự cố không nhất thiết là cách trực tiếp hoặc giáo dục nhất để hiểu vấn đề. Trong năm năm lập trình .NET, tôi chưa bao giờ cảm thấy cần phải đến đó. Chỉ một lần có một đồng nghiệp (đã từng làm việc tại Microsoft về kiểm thử trình biên dịch) đã đi đến đó với một vấn đề mà tôi đang cố gắng giải quyết, và cuối cùng, câu trả lời của anh ta gây hiểu lầm, bởi vì vấn đề thực sự dựa trên thiết kế và ràng buộc CLR. . Kiến thức tốt hơn về CLR và C# sẽ dẫn đến một sự hiểu biết tốt hơn và một giải pháp thực sự.

(Trong trường hợp bạn đang tự hỏi, vấn đề là tôi muốn sử dụng "như" để đúc an toàn với chung. "Như" không hoạt động, nhưng "được" đã làm. Vấn đề thực sự là "như" chỉ hoạt động cho các lớp đúc, và không có ràng buộc thích hợp trên khai báo chung, C# không biết liệu kiểu generic của bạn có phải là một lớp hay không. Trong thực tế, các loại tôi đã sử dụng với generics là loại giá trị, "như" không thể làm việc cho những người ở tất cả.)

Thay vì đi cho kỹ năng MSIL, tôi khuyên bạn nên cuốn sách của Jeffrey Richter CLR via C#. Ngay cả sau nhiều năm đào khó khăn vào C#, cuốn sách này vẫn còn đầy những tiết lộ - tôi học được điều gì đó từ mọi trang.

+0

Lý do 'as' không hoạt động với các loại giá trị là do loại giá trị không được là' null', nhưng 'as' muốn trả lại' null' nếu biến không thuộc loại được cung cấp. Nếu bạn biết rằng tham số kiểu generic của bạn 'T' là một kiểu giá trị (nghĩa là bạn đã chỉ định ràng buộc' struct'), bạn có thể sử dụng 'như T?' Thay vì 'như T' và nó sẽ hoạt động ngay cả khi cá thể thực sự thuộc loại 'T' chứ không phải' T? '. Tuy nhiên, đây là một vấn đề ngôn ngữ C# hoàn toàn và ít có liên quan đến IL hoặc CLR ... – Timwi

+0

@Timwi, chính xác; "as" không thể trả về giá trị rỗng trên một loại giá trị, và điều này có ** hoàn toàn ** không liên quan gì đến IL. Đó là điểm; việc học IL không giúp bạn giải quyết các trường hợp như thế này. Cho dù đây là hoàn toàn là một vấn đề ngôn ngữ, hoặc liên quan đến việc thực hiện CLR của generics, tôi không thể nói, nhưng tôi sẽ lưu ý rằng xử lý của VB.NET đúc (thông qua DirectCast hoặc TryCast) có nhiều vấn đề tương tự. –

3

Không thể nói tôi là một IL “pro”, nhưng tôi cố gắng dạy cho bản thân mình khá nhiều bài của IL bằng cách làm như sau:

  • Viết rất ngắn (hai hoặc ba dòng) Chương trình C# mà bạn tò mò về cách viết trong IL.

  • Biên dịch chương trình.

  • Mở EXE đã biên dịch trong .NET Reflector.

  • Xem mã IL cho phương pháp trong Trình phản xạ.

  • Di chuột qua mã op IL (ví dụ: "ldloc"). Có một chú giải công cụ mô tả từng hướng dẫn IL.

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