2014-12-02 33 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是一个英文论坛,请用英文发布代码,并对其进行正确评论。