大会,没有这样的指令弹出?

我在C中有一个代码,主要用汇编写成。 程序的想法是,例如当x = abc def时,y = a删除至少有一个字母相同的单词,并写入没有相同字母的单词,因此它会写入def。 我有一个代码,但它会给出错误,如:

  • prog.c:10:错误:没有这样的指令:`addl $ 112,%esp'
  • prog.c:12:错误:没有这样的指令:`xorl%eax,%eax'
  • prog.c:13:错误:没有这样的指令:`popl%ebx'
  • prog.c:16:错误:没有这样的指令:`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,'';" //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;
    }
    

    这里是ideone链接:http://ideone.com/wHFeDK有人知道什么可能是错的? 感谢帮助。


    在inline asm中手动切换语法模式是一种可怕的手段,如果您有任何参数替换,它可能不起作用。 如果您需要intel语法,正确的方法是使用-masm=intel

    这就是说,你的问题是,你必须在你想恢复模式的指令输入错误:你已经.att_syntax_prefix代替.att_syntax prefix (注意你并不需要在另一个之前下划线prefix )。

    此外, ''将不起作用,您应该只使用0

    而且,你有一个错字: interuj_po_slowie vs iteruj_po_slowie

    PS:Stackoverflow是一个英文论坛,请用英文发布代码,并对其进行正确评论。

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

    上一篇: Assembly , no such instruction popl?

    下一篇: op for an instruction?