2010-02-08 41 views
6

Tôi có câu hỏi về trình biên dịch nội tuyến. Có thể gọi một chương trình con của trình assembler khác từ bộ ghép nội tuyến trong cùng một hàm? Ví dụ:Cuộc gọi lắp ráp nội tuyến cho chương trình con

void FindValidPID(unsigned int &Pid) 
{ 
    __asm 
    { 
     sub esp, 20h 
     mov eax, Pid 
     add eax,eax 
     call sub123 ; another assm subroutine 
     mov Pid, eax 
     add esp, 20h 
    } 
} 

Tôi nên làm gì và viết subroutine sub123 như thế nào?

Chúc mừng,
Thomas

+0

Ý anh là gì bởi " cùng "chức năng? Bạn không có nghĩa là đệ quy, hoặc xác định một điểm vào thay thế cho một loại đệ quy. Có vẻ như bạn chỉ muốn xác định và gọi hàm. – Potatoswatter

Trả lời

2

Nếu bạn đang viết toàn bộ một chương trình con trong lắp ráp, bạn nên xem xét sử dụng lắp ráp tập tin cấp chứ không phải là nội tuyến.

1

Giả sử bạn có một chương trình con _func2 được viết bằng trình biên dịch (Tôi chỉ biết cú pháp NASM).

global _func2 

    section .text 
_func2: 
    ret 

Bạn có thể gọi chương trình con này từ C++ mã như thế này

extern "C" { 
void func2(); 
} 

void func1() 
{ 
    __asm { 
     call func2 
    } 
} 

int main() 
{ 
    func1(); 
} 

Tất nhiên func2 cũng có thể là một C/C++ chức năng với một khối __asm.

0

Bạn có thể làm điều đó bằng cách tạo chức năng khác giống như bạn đã thực hiện với lệnh đầu tiên và sau đó gọi nó với tên bị xiên như call __GLOBAL__I_sub123;.

Có thể là một ý tưởng hay khi khai báo số này là extern "C" để làm cho mọi việc đơn giản hơn.

Trong gcc, bạn có thể sử dụng gcc -S file.cpp để xem tên bị cắt xén của funciton là gì.

1

Từ cú pháp, tôi giả sử trình biên dịch đang được sử dụng là VC++? Nếu vậy, chức năng trần truồng (http://msdn.microsoft.com/en-us/library/5ekezyy2(VS.80).aspx) sẽ cho phép bạn xác định một hàm có thể dễ dàng được gọi từ mã ngôn ngữ assembly.

(chức năng Naked cũng có thể nhìn thấy C++, vì vậy bạn có thể gọi cho họ từ C++ như tốt và có khả năng có được kết quả sai ... vì vậy bạn chỉ phải cẩn thận!)

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