Обновление: мне разрешено использовать strcpy в моем коде.
Я пытаюсь написать реализацию strdup на ассемблере x86 (синтаксис att), преобразовывая код на 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*. Пример: переход в «Переполнение стека» дает мне «Stac@@#$$». Я предполагаю, что я делаю что-то не так с movl, не совсем уверен, что.
p/s: я почти уверен, что мой strlen работает.
Часть 2. Будет ли код, который я написал, возвращать указатель на вызывающую программу? Как и в возможности освободить любое пространство, которое я выделил позже.
strcpy()
илиstrlen()
. Вы прекращаете чтение/запись после байта со значением 0. - person Alexey Frunze   schedule 13.10.2012