2012-03-23 32 views
11

Tôi đang học ngôn ngữ lắp ráp trong thời gian rảnh rỗi. Bất cứ ai có thể giải thích lý do tại sao .maxstack dường như là tùy chọn trong chương trình này. Tôi đã cố gắng tìm ra câu trả lời trực tuyến và trong cuốn sách của tôi không có may mắn như vậy tức là chương trình sẽ biên dịch và chạy với .Maxstack nhận xét ra:Tại sao Chỉ thị .MaxStack Tùy chọn trong Mã MSIL?

//Add.il 
//Add Two Numbers 

.assembly extern mscorlib {} 

.assembly Add 
{ 
    .ver 1:0:1:0 
} 
.module add.exe 

.method static void main() cil managed 
{ 
    //.maxstack 2 
    .entrypoint 

    ldstr "The sum of 50 and 30 is = " 
    call void [mscorlib]System.Console::Write (string) 

    ldc.i4.s 50 
    ldc.i4 30  
    add 
    call void [mscorlib]System.Console::Write (int32) 
    ret 
} 

Tôi đang biên soạn chương trình tại cửa sổ dòng lệnh bằng công cụ ILASM và sau đó chạy tệp thực thi được tạo.

Trả lời

12

Tôi nghĩ rằng sự nhầm lẫn của bạn bắt nguồn từ sự hiểu lầm về những gì .maxstack thực sự làm. Đó là một sai lầm dễ dàng để thực hiện, bởi vì nó có vẻ như nó sẽ gây ra một lỗi khi thực hiện. Đáng ngạc nhiên, chỉ thị cụ thể đó thực sự có không có gì với kích thước ngăn xếp tại thời gian chạy, thay vào đó, nó được sử dụng cụ thể trong quá trình xác minh mã.

Từ phân vùng III - Mục 1.7.4

Lưu ý: Maxstack có liên quan đến phân tích của chương trình, chứ không phải với kích thước của ngăn xếp khi chạy. Nó không chỉ định kích thước tối đa theo byte của một khung ngăn xếp, mà là số lượng các mục phải được theo dõi bởi một công cụ phân tích.

Mã trở thành unverifiable. Cùng một phần, lưu ý rằng bất kỳ triển khai tuân thủ nào không cần phải hỗ trợ phương thức có giá trị ngăn xếp tối đa không hợp lệ. Tuy nhiên, nó không nói rằng nó không được và khá rõ ràng, thời gian chạy đang thực thi mã. Vì vậy, nếu nó dường như không có hiệu lực, tại sao thậm chí bận tâm có nó?

Tin hay không, theo mặc định, khung .NET chạy không thể xác minh mã. Nó thực sự là khó khăn cho tôi để tìm hiểu làm thế nào để bật xác minh trong .NET 4.0, nhưng nếu bạn bật CAS, chương trình của bạn (với .maxstack 1) sẽ ngừng chạy với

Unhandled Exception: System.InvalidProgramException: Sở hữu chung Language Runtime đã phát hiện một chương trình không hợp lệ. tại địa chỉ chính()

Lưu ý rằng, không thể xác minh mã không thể chạy trong bất kỳ môi trường nào không có đủ sự tin cậy (thường là hội đồng từ internet). Nếu điều đó không quan trọng với bạn, bạn có thể để nó là một giá trị không hợp lệ, và nó thực sự sẽ không tạo ra sự khác biệt. Nếu mã số vẫn chính xác, nó sẽ chạy tốt; tất nhiên nếu có một vấn đề thực sự với ngăn xếp IL, nó sẽ ném một InvalidProgramException.

0

Nếu tôi nhớ chính xác, kích thước ngăn xếp mặc định là 8 nếu tuyên bố bị bỏ qua.

+1

đây là những gì tôi nghĩ đầu tiên, nhưng chương trình vẫn chạy nếu tôi đặt .maxstack trong chương trình trên thành 1. Nó phải là 2 hoặc cao hơn cho chương trình từ những gì tôi có thể nhìn thấy. – w0051977

+0

Chỉ cần đoán ở đây, nhưng có lẽ ILASM là đủ thông minh để nhận ra rằng 1 sẽ không đủ và ghi đè các thiết lập. –

+2

@ 500-InternalServerError, không phải vậy. Theo ILDASM, mã được phát ra thực sự chứa '.maxstack 1'. Và theo đặc điểm kỹ thuật, mã như vậy phải là không hợp lệ và không thể xác minh. Và PEVerify thực sự không xác minh của hội đồng. Nhưng nó vẫn chạy tốt. – svick

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