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;
}
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++. –
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