2013-10-30 280 views
1

我試圖把彙編代碼放到我的C函數中。 該功能的目的是存儲在SRC地址值複製到DST地址:彙編代碼C

void copy(int *dst, int *src);

我的實際問題的代碼:

void copy(int *dst, int *src) 
{ 
    asm("mov %1, %2" 
     : /* no output */ 
     : "i" (dst), 
      "i" (src) 
     : "" 
    ); 
} 

給我的錯誤:

test.c: In function ‘copy’:
test.c:29: error: unknown register name ‘’ in ‘asm’
test.c:29: warning: asm operand 0 probably doesn’t match constraints
test.c:29: warning: asm operand 1 probably doesn’t match constraints

第29行是這一行:
asm("mov %1, %2"

編輯:

asm("mov %0, %1" 
    : "=m" (dst) 
    : "m" (dst), 
     "m" (src) 
    : "" 
    ); 

現在給我:
error: unknown register name ‘’ in ‘asm’ 我不知道做什麼用的最後一節做。

EDIT2

我讀過,我不能MOV內存 - >內存,我需要使用的寄存器。而且我還需要使用AT & T語法,以便像「mov src,dest」一樣。下面的代碼編譯,但不幸的是,由dst指向的地址中的值是0,而不是我放入由src指向的地址中的值。

asm("movl %1, %%eax \n\t" 
    "movl %%eax, %0 \n\t" 
    : "=m" (dst) 
    : "m" (dst), 
     "m" (src) 
    ); 

EDIT3

我就是這麼做的(改變參數),它現在的作品:

void copy(int *dst, int *src, int n) 
{ 
    int a = *src; 
    int b = *dst; 
    asm("movl %1, %%eax\n" 
     "movl %%eax, %0\n" 
     : "=m" (b) 
     : "m" (a) 
     ); 
    *src = a; 
    *dst = b;  
} 
+1

,你有一個輸入和一個輸出。而且他們都不是我的中間值。一個''m''emory對象應該適用於兩者。 – glglgl

+2

這是什麼架構? –

+3

你使用什麼編譯器? – geoffspear

回答

0

您可以使用:

void copy(int *dst, int *src) 
{ 
    __asm__ __volatile__(
    "movl (%0), %%eax\n" 
    "movl %%eax, (%1)\n" 
    : 
    : "r"(src), "r"(dst) 
    : "%eax" 
); 
} 

這就相當於:如果您將值

mov (%edx), %eax ; eax = *src 
mov %eax, (%ecx) ; *dst = eax 
+0

你的回答指導我最正確的答案。 – archibaldis

2

您的撞節空項。你不需要那個。

試試這個:

asm("mov %0, %1" 
    : "=m" (dst) 
    : "m" (dst), 
     "m" (src) 
    /* no clobbers */ 
    ); 

該代碼是完全等效於這樣的:

*dst = *src 

,所以我想這只是很小的例子嗎?

代碼編譯,但給:

t.c: Assembler messages: 
t.c:2: Error: too many memory references for `mov' 

因此,我認爲你的彙編指令需要工作,但是編譯器語法確定。

+0

謝謝你的回答。是的,這只是一個小例子。 我試過你的代碼,但是編譯器告訴我:「錯誤:在''''令牌'之前的預期字符串字面量」。所以看起來我不會將此部分留空。 – archibaldis

+1

對不起,我忘了刪除冒號了;糾正。它現在編譯,儘管這仍然不是有效的彙編指令。 – ams

+0

謝謝。我編輯了主要職位。它現在編譯,但給出了錯誤的結果。 – archibaldis