簡體   English   中英

匯編,沒有這樣的指令嗎?

[英]Assembly , no such instruction popl?

我有一個用C編寫的代碼,其中主要的tak是用Assembly編寫的。 編程的想法是,例如,當x = abc def且y = a時,它將刪除至少一個字母相同的單詞,並寫入不包含相同字母的單詞,從而將其寫入def。 我寫了一個代碼,但它給出了如下錯誤:

  • 節目: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,'\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有人知道怎么了? 感謝幫助。

在嵌入式asm中手動切換語法模式是一個可怕的技巧,如果您有任何參數替換,它可能無法正常工作。 正確的方法是,如果要使用intel語法,請使用-masm=intel

就是說,您的問題是您想要恢復模式的指令中有一個錯字:您使用.att_syntax_prefix而不是.att_syntax prefix (注意,您無需在prefix之前.att_syntax prefix一個下划線)。

另外, '\\0'將不起作用,您應該只使用0

而且,您有一個錯字: interuj_po_slowieiteruj_po_slowie

PS:Stackoverflow是一個英語論壇,請以英語發布代碼,並對其進行正確注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM