2009-04-13 32 views
10

Khi sử dụng lắp ráp nội tuyến dưới MSVC, một được phép nhảy ra ngoài khối lắp ráp bằng cách tham chiếu nhãn trong mã C/C++, như được giải thích in this MSDN article.GCC Inline Assembly: Chuyển đến nhãn bên ngoài khối

Điều đó có thể được thực hiện khi sử dụng lắp ráp nội tuyến theo GCC không?

Dưới đây là một ví dụ về những gì tôi đang cố gắng để hoàn thành:

__asm__ __volatile__ (
" /* assembly code */ " 
" jz external_label; " 
); 

/* some C code */ 

external_label: 
/* C code coninues... */ 

Trình biên dịch, tuy nhiên, phàn nàn về "external_label" không được xác định.

+0

Tại sao '__volatile__'? – curiousguy

Trả lời

10

Điều gì sẽ xảy ra nếu bạn xác định nhãn bằng bộ lắp ráp?

asm("external_label:"); 

Cập nhật: mã này dường như làm việc:

#include <stdio.h> 

int 
main(void) 
{ 
    asm("jmp label"); 
    puts("You should not see this."); 
    asm("label:"); 

    return 0; 
} 
+0

Đó là điều đầu tiên tôi đã thử, không hoạt động. :/ –

+0

Tôi đã cập nhật với mẫu có vẻ chính xác. Nó làm việc cho bạn? –

+0

Hmm ... Điều này thật kỳ lạ. Mã của bạn không biên dịch, tuy nhiên khi làm điều tương tự trong tôi, mối liên kết vẫn than phiền về một tham chiếu không xác định. :/ –

1

Tính đến GCC 4.5, bạn cũng có thể sử dụng asm goto. Ví dụ sau nhảy vào nhãn C:

#include <stdio.h> 

int main(void) { 
    asm goto (
     "jmp %l[done]" // %l == lowercase L 
     : 
     : 
     : 
     : done   // specify c label(s) here 
    ); 
    printf("Should not see this\n"); 

done: 
    printf("Exiting\n"); 
    return 0; 
} 
Các vấn đề liên quan