更新:コードでstrcpyを使用できます。
x86アセンブリ(att構文)でstrdupの実装を記述し、CのコードをAssemblyのコードに変換しようとしています。
Cのコード:
char* func( int x, char* name){
namestr = (char *) malloc( strlen(name) + 1 );
strdup( namestr, name );
free( name ); //Just showing what I plan to do later.
return namestr;
}
アセンブリのコード:
;basic start, char* I'm trying to copy is at 12(%ebp)
new_string:
pushl %ebp
movl %esp, %ebp
pushl %edi
subl $20, %esp
movl 12(%ebp), %ecx
movl %ecx, %edi
movl (%ecx), %ecx
movl %ecx, -8(%ebp)
;get the length of the string + 1, allocate space for it
.STR_ALLOCATE:
movl $0, %eax
movl $-1, %ecx
repnz scasb
movl %ecx, %eax
notl %eax
subl $1, %eax
addl $1, %eax
movl %eax, (%esp)
call malloc
movl %eax, -12(%ebp)
;copy value of of the char* back to %eax, save it to the stack, pass the address back
.STR_DUP:
movl -8(%ebp), %eax
movl %eax, -12(%ebp)
leal -12(%ebp), %eax
.END:
popl %edi
leave
ret
コードを実行すると、char*の一部しか返されません。例:「StackOverflow」を渡すと「Stac @@#$$」になります。私はmovlで何か間違ったことをしていると思いますが、実際には何がわかりません。
p / s:私のstrlenはうまくいくと確信しています。
パート2:私が書いたコードは呼び出し元へのポインターを返しますか?後で割り当てたスペースを解放する機能のように。