我试图在汇编语言中编写脚本。从给定的字符串打印带有子字符串的单词。 例如:
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天的时间来写这篇文章......现在我想出了如何让它真正发挥作用。
干杯!
答案 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;"