【发布时间】:2012-10-13 15:10:29
【问题描述】:
更新:我可以在我的代码中使用 strcpy。
我正在尝试在 x86 汇编(att 语法)中编写 strdup 的实现,将 C 中的代码转换为汇编中的代码。
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*。 示例:传入“Stack Overflow”让我得到“Stac@@#$$”。 我想我在 movl 上做错了什么,不太确定是什么。
p/s:我很确定我的 strlen 有效。
第 2 部分: 我写的代码会将指针传回给调用者吗?就像释放我稍后分配的任何空间的能力一样。
【问题讨论】:
-
因为你得到了正确的 4 个字符,我怀疑你正在复制一个指针(字)大小的区域而不是整个字符串,即。 e.在某些地方,您正在使指针与数组混淆(除了这在此处比在 C 中更有害)。
-
我猜你的原型是这样的: mystrcpy(char * src, char** dest) 因为 movl (%ecx),%ecx 因为这与 strcpy 不完全一样,也许你应该先写出 C 代码,然后添加到你的问题中
-
您不需要为
strcpy()或strlen()分配任何内存。在值为 0 的字节之后停止读/写。 -
@H2CO3 是的,我很确定你是对的,但我自己看不到。
-
@MarcovandeVoort 我已经在 C 中添加了代码。