Assembly , no such instruction popl?

I have a code in C where the main tak is written in Assembly. The idea of the programm is to for example when x = abc def ,and y = a it deletes the word where at least one letter is the same and writes words without the same letters so it would write def. I have wrotten a code, but it gives error like :

  • prog.c:10: Error: no such instruction: `addl $112,%esp'
  • prog.c:12: Error: no such instruction: `xorl %eax,%eax'
  • prog.c:13: Error: no such instruction: `popl %ebx'
  • prog.c:16: Error: no such instruction: `popl %esi'
  • Here is the code :

    #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,'';" //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,'';"
                "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,'';"
                "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, '';"
                        "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;
    }
    

    and here is the ideone link : http://ideone.com/wHFeDK Someone know what may be wrong ? Thanks for help.


    It's a horrible hack to manually switch syntax mode in inline asm and it might not work if you have any argument substitutions. The correct way is to use -masm=intel if you want intel syntax.

    That said, your problem is that you have a typo in the directive where you wanted to restore the mode: you have .att_syntax_prefix instead of .att_syntax prefix (notice you don't need another underscore before prefix ).

    Also, the '' won't work, you should just use 0 .

    And, you have a typo: interuj_po_slowie vs iteruj_po_slowie .

    PS: Stackoverflow is an english language forum, please post code in english, and comment it properly.

    链接地址: http://www.djcxy.com/p/87136.html

    上一篇: GCC的Linux 64位如何改变使用内联汇编stackpointer esp?

    下一篇: 大会,没有这样的指令弹出?