2012-07-15 27 views
5

Tôi gặp một số sự cố khi truy cập Biến tĩnh với Inline Assembler trong Ngôn ngữ lập trình D. Các tài liệu nói rằng tôi phải truy cập các biến địa phương vớiD Inline Assembler: Truy cập Biến tĩnh

mov EAX, var[EBP]; //or mov EAX, var; 

và lớp biến với

mov EBX, this; 
mov EAX, var[EBX]; 

Nhưng nó isnt tài liệu làm thế nào để truy cập vào một biến tĩnh. Đây là mã của tôi mà ném một lỗi:

module test; 

static int A = 1234; 

static void SetA() 
{ 
    asm 
    { 
     mov A, 5432; //compiles, but throws an error 
     //tried it with "mov dword ptr [A], 5432; too 
    } 
} 

Tôi thực sự cần một cách để một số "dự trữ toàn cầu" cho các số nguyên có thể truy cập từ cả hai, lắp ráp và D, tôi sẽ rất hạnh phúc về bất kỳ sự giúp đỡ với điều này (hoặc một cách khác).

Trả lời

4

Biến toàn cục được đặt trong bộ nhớ cục bộ theo mặc định trong D2. Sử dụng __gshared để khai báo biến tĩnh "cổ điển".

này hoạt động:

module test; 

__gshared int A = 1234; 

void SetA() 
{ 
    asm 
    { 
     mov A, 5432; 
    } 
} 

unittest 
{ 
    SetA(); 
    assert(A == 5432); 
} 
+0

không thể cảm ơn đủ, nó hoạt động ngay bây giờ! –

+0

Bạn có thể thấy mã này đang hoạt động tại http://dpaste.dzfl.pl/ead5ed8e – DejanLekic

2

Lưu ý: Các static trên A là không cần thiết vì nó là một biến mô-đun cấp. Tương tự cho các chức năng cấp mô-đun.

Trong D, các biến cấp mô-đun đi vào bộ nhớ cục bộ. Bạn phải đánh dấu một biến là __gshared nếu bạn thực sự muốn biến đó thành toàn cầu. Việc truy cập các biến TLS trong lắp ráp nội tuyến về cơ bản là không thể trong một thời trang di động.

Một cách để làm những gì bạn muốn:

module test; 

/*static*/ int A = 1234; 

/*static*/ void SetA() 
{ 
    int a; 

    asm 
    { 
     mov a, 5432; 
    } 

    A = a; 
} 

Edit: Nếu bạn có ý định __gshared, sau đó xem câu trả lời CyberShadow của. :)

+0

Bạn có thể thấy mã này hoạt động tại: http://dpaste.dzfl.pl/64f6a656 – DejanLekic

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