程序集查找包含给定字符串中的子字符串的单词

时间:2014-11-22 13:01:16

标签: string assembly substring

我试图在汇编语言中编写脚本。从给定的字符串打印带有子字符串的单词。 例如:

char* a="hello world   lol  asdf";
char* b="lo";
char buffer[100];

和印刷的文字是:

"你好lol"

我用ANSI C编写程序:

    #include <stdio.h>
#include <string.h>
int main(){

    char *s = "hello bencsss trololo molo";
    char *b ="lo";
    char bufor[100];
    int i, j=0,k=0,c=0,l=0;
    for(i=0;i<strlen(s);i++){
        if(s[i]==' ') k=i+1;

        if(b[j]==s[i]){
            j++;
            if(j==strlen(b)-1){
                while(s[k]!=' ' && k<(strlen(s))){
                bufor[c]=s[k];
                    c++;
                    k++;
                }
            bufor[c]=' ';
            c++;
            k=i;
            }
        }
        else{
        j=0;    
        }
    }
    printf("%s",bufor);
    return 0;   
}

这是我到目前为止在asm中所写的内容:

#include <stdio.h>

int main(){
    //short int y;
    char *s = "hello world!\n"; 
    char *b ="lo";
    char bufor[100];

    asm volatile(
    ".intel_syntax noprefix;"   
    "mov eax,%0;" //16
    "push eax;"
    "mov eax,%1;" //12
    "push eax;"
    "mov eax,%2;" //8
    "call zadanie1;"
    "jmp end;"
"zadanie1:"
    "push eax;"
    "push ebp;" //4
    "mov ebp,esp;"
    "push ebx;"
    "push ecx;"
    "push edx;"

    "mov ebx,[esp+16];"
"reset:"
    "mov eax,[esp+12];"
    "jmp word;"
"space:"
    "mov [si],ebx;"
    "jmp forward;"
"word:"
    "mov dl,[ebx];"
    "mov dh,[eax];"
    "cmp dl,' ';"
    "je space;"
"forward:"
    "cmp dl,dh;"
    "inc ebx;"
    "jz reset;"
    "inc eax;"       
    "cmp dh,'0';"
    "je buff;"
    "jmp word;"
"buff:"
    "mov [ecx,esp+8];"
    "inc ecx;"
"loop:"
    "mov dh,[ecx];"
    "mov [si],dh"   
    "cmp dh,' ';"
    "je reset;"
    "inc ecx;"
    "inc si;"




    "end:"
    ".att_syntax prefix;"
    :
    :"r"(s), "r"(b),"r"(bufor) 
    :"eax"

    );
asm可能写错了而且还没有完成,我仍然是这种语言的新手......所以...

好的......我可以得到任何言语或建议或者如何在asm中制作这个节目吗? 到目前为止,我花了3天的时间来写这篇文章......现在我想出了如何让它真正发挥作用。

干杯!

1 个答案:

答案 0 :(得分:0)

接下来的说明不正确。

"mov ebx,[esp+16];"
"mov eax,[esp+12];"

使用EBP代替ESP来处理您的参数。

此语法不存在。目标是什么?

"mov [ecx,esp+8];"

您认为jz reset会采取什么行动?在cmp dl,dh之后定义的inc ebx定义的ZF。

"cmp dl,dh;"
"inc ebx;"
"jz reset;"