【发布时间】:2012-12-15 21:28:35
【问题描述】:
我有这个函数,它主要由内联 asm 组成。
long *toarrayl(int members, ...){
__asm{
push esp
mov eax, members
imul eax, 4
push eax
call malloc
mov edx, eax
mov edi, eax
xor ecx, ecx
xor esi, esi
loopx:
cmp ecx, members
je done
mov esi, 4
imul esi, ecx
add esi, ebp
mov eax, [esi+0xC]
mov [edi], eax
inc ecx
add edi, 4
jmp loopx
done:
mov eax, edx
pop esp
ret
}
}
在运行时,我在返回指令上遇到访问冲突。
我使用的是 VC++ 6,它有时可能意味着指向上面的行,所以可能在“pop esp”上。 如果你能帮助我,那就太好了。 谢谢,iDomo。
【问题讨论】:
-
在调用
malloc后从堆栈中清除大小 (eax)。并将ret留在您的代码之外,让编译器处理该部分。 -
ret崩溃了吗?堆栈粉碎。 飞走了 -
使用内联汇编时,编译器会自动保存需要的寄存器吗?如果没有,则需要将
ESI、EDI、EBX、EBP和ESP在开头(如果您修改它们)用pushes保存,并在末尾用@987654332恢复@s
标签: c++ assembly access-violation inline-assembly