2012-07-08 41 views
5

Tôi đang cố gắng tìm hiểu ASM và muốn thử một vài điều kết hợp với C++. Phần ASM được thực hiện trong một chức năng khỏa thân. Nhưng bất cứ khi nào tôi gọi hàm (trống) ứng dụng bị treo trong hàm tiếp theo. Tôi nên làm gì trong chức năng trần truồng để làm cho nó hoạt động, tôi có cần phải bật hay không? Một ví dụ có thể hữu ích.C++ sử dụng chức năng khỏa thân

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    i = 1; 

    asmfunc(); 

    cout << i << endl; // <-- crash 
    system("pause"); 

    return 0; 
} 
+2

Theo quy định của [tài liệu] (http://msdn.microsoft.com/it-it/library/h5w10wxs.aspx), bạn cần phải viết mã prolog/epilog; xem [câu hỏi này] (http://stackoverflow.com/questions/3021513/could-someone-explain-declspecnaked-please). Ngoài ra, hãy xem xét nếu bạn thực sự cần các hàm 'naked': nếu tất cả những gì bạn muốn là viết một số assembly được nhúng chỉ cần sử dụng một hàm bình thường và để cho trình biên dịch xử lý các quy ước gọi C++. –

+2

Chú ý đến các quy ước gọi điện. Các hàm khỏa thân không giữ lại các thanh ghi được yêu cầu. – Mysticial

Trả lời

12

Chức năng giả sẽ không chứa bất kỳ đoạn mở đầu do biên dịch viên tạo ra và mã kết nối. Điều đó cũng áp dụng cho câu lệnh trả về tiềm ẩn ở cuối hàm.

Điều đó có nghĩa là chức năng bạn khai báo không có hướng dẫn nào ở số ret ở cuối. Khi điều khiển được chuyển đến asmfunc, nó sẽ không bao giờ trả về. Hàm này tiếp tục thực hiện bất kỳ mã nào tồn tại tại vị trí đó cho đến khi nó chạm vào thứ gì đó khiến nó bị lỗi.

Về cơ bản, triển khai ban đầu của bạn là asmfunc hoạt động như một nhãn ở đâu đó ở giữa mã chương trình. Và khi bạn gọi hàm của mình, về cơ bản bạn đang thực hiện một số goto asmfunc, tức là bạn chuyển quyền kiểm soát ở đâu đó mà không có bất kỳ hy vọng trả lại nào.

Vì lý do này, một chức năng thường tối thiểu nên trông như

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
     ret 
    } 
} 

Đó là trách nhiệm của bạn để đặt ret hướng dẫn vào một chức năng thường.