2014-12-02 72 views
0

我有一個C代碼,其中主tak是用Assembly編寫的。程序的想法是,例如當x = abc def時,y = a刪除至少有一個字母相同的單詞,並寫入沒有相同字母的單詞,因此它會寫入def。我已經wrotten的碼,但它給錯誤等:大會,沒有這樣的指令彈出?

  • prog.c中:10:錯誤:沒有這樣的指令:`ADDL $ 112%ESP」
  • prog.c中:12:錯誤:沒有這樣的指令:'xorl%eax,%eax'
  • prog.c:13:錯誤:沒有這樣的指令:`popl%esi''popl%esi'

下面是代碼:

#include <stdio.h> 
#include <string.h> 

int main(){ 
    char *x = "asbc4a2bab "; 
    char *y = "ab"; 
    char bufor[100]; 
asm volatile (
    ".intel_syntax noprefix;" 
    "mov ecx,%0;" 
    "push ecx;" //wrzuca na stos 
    "mov ecx,%1;" 
    "mov eax,%2;" 
    "call zadanie1;" 
    "jmp wyjscie;" 
    "zadanie1:" 
    "push ebp;" //wrzucamy ebp na stos 

    "push eax;" 
    "push ecx;" //ecx zliczanie 
    "push edi;" //edi destination 
    "mov ebp,esp;" //do ebp adres stosu 

    "mov esi,[ebp+20];" //esi bezposrednio do x 
    "mov edi,[ebp+4];" //edi adres y 
    "mov ebx,[ebp+8];"//ebx bufor 
    "mov eax,0;"//eax to false 
    "push eax;" 
    "push esi;" 
    "push eax;" 
    "etykieta_x:" 

    "mov eax,[esp+8];" 
    "cmp eax,0;" 
    "je etykieta_y;" 
    "mov [esp+4],esi;" 
    "mov eax,0;" 
    "mov [esp+8],eax;" 
    //"mov [esp+4],esi;" 
     "etykieta_y:" 

      "mov eax,[edi];" 
      "cmp eax,'\0';" //porownoje eax z koncem 
      "je koniec_etykiety_x;" 
      "add edi,1;"//zwiekszamy petle 
      "cmp eax,[esi];"//porownoje y i x 
      "jne etykieta_y;"//wrocimy do etykiety y jesli nie sa rowne 
      "ustaw_flage:" 
       "pop eax;" 
       "mov eax,1;" //ustawia flage 
       "push eax;" 

     "koniec_etykiety_x:" 
     "pop eax;" 
     "cmp eax,1;" 
     "jne iteruj_dalej;" 
     "mov eax,0;" 
     "push eax;" 

     "iteruj_po_znakach:" 
      "add esi,1;" 
      "mov eax,[esi];" 
      "cmp eax,'\0';" 
      "je koniec;" 
      "cmp eax,' ';" 
      "je spacja_wykryta;" 
      "jmp etykieta_x;" 

      "spacja_wykryta:" 
       "mov eax,1;" 
       "mov [esp+8],eax;" 
       "jmp iteruj_po_znakach;" 



     "iteruj_dalej:" 
      "mov eax,0;" 
      "push eax;" 
      "add esi,1;"//zwiekszamy adres 
      "mov eax,[esi];"//pobieramhy nast zznak 
      "cmp eax,'\0';" 
      "je zapisz_do_bufora;" 
      "cmp eax,' ';" 
      "je spacja_wykryta_2;" 

       "mov eax,[esp+8];" 
       "cmp eax,0;" 
       "je etykieta_x;" 
       "jmp zapisz_do_bufora;" 

      "spacja_wykryta_2:" 
      "mov eax,1;" 
      "mov [esp+8],eax;" 
      "jmp iteruj_dalej;" 


      "zapisz_do_bufora:" 
       "mov eax,[esp+4];" 

       "interuj_po_slowie:" 
        "mov edx,[eax];" 
        "cmp edx,' ';" 
        "je etykieta_x;" 
        "cmp edx, '\0';" 
        "je etykieta_x;" 

        "mov [ebx],edx;" 
        "add eax,1;" 
        "add ebx,1;" 
        "jmp iteruj_po_slowie;" 

    "koniec:" 
    "pop edi;" //zdejmuje ze stosu 
    "pop ecx;" 
    "pop eax;" 
    "pop ebp;" 
    "ret;" //wyjdzie z funkcji 
    "wyjscie:" 
    ".att_syntax_prefix;" 
    : 
    :"r"(x), "r"(y), "r"(bufor) 
    :"eax", "ecx" 
    ); 
    return 0; 
} 

這裏是ideone鏈接:http://ideone.com/wHFeDK 有人知道什麼可能是錯誤的?感謝幫助。

+0

對於什麼平臺和編譯器? – 2014-12-02 00:55:46

+0

你意識到已經有一個幾乎相同的問題了嗎? – EOF 2014-12-02 01:02:50

+0

它應該爲linux,nasm完成 – user3491139 2014-12-02 01:03:04

回答

0

手動切換內聯asm中的語法模式是一種可怕的手段,如果您有任何參數替換,它可能無法正常工作。如果您需要intel語法,正確的方法是使用-masm=intel

這就是說,你的問題是,你必須在你想恢復模式的指令輸入錯誤:你有.att_syntax_prefix而不是.att_syntax prefix(注意你不需要prefix之前另一個下劃線)。

此外,'\0'將無法​​正常工作,你應該只使用0

而且,你有一個錯字:interuj_po_slowie VS iteruj_po_slowie

PS:Stackoverflow是一個英文論壇,請用英文發佈代碼,並對其進行正確評論。