关于new操作符call??2@YAPAXI@Z
用VC6的cl编译以下的源文件
void main()
{
int *p=new int[10];
}
生成的asm文件为:
TITLEnew.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS'
_TLSENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_main
EXTRN??2@YAPAXI@Z:NEAR; operator new
_TEXTSEGMENT
_p$ = -4
$T222 = -8
_mainPROC NEAR
; 2 : {
pushebp
movebp, esp
subesp, 8
; 3 : int *p=new int[10];
push40; 00000028H
call??2@YAPAXI@Z; operator new
addesp, 4
movDWORD PTR $T222[ebp], eax
moveax, DWORD PTR $T222[ebp]
movDWORD PTR _p$[ebp], eax
; 4 : }
movesp, ebp
popebp
ret0
_mainENDP
_TEXTENDS
END
我想知道 new操作符的实现(就是那个call??2@YAPAXI@Z)在哪里?它的实现是不是需要操作系统的支持?操作系统在这方面是不是有相应的标准,来为某些计算机语言的操作符提供支持吗?
麻烦大家推荐一些关于这方面的书籍!谢谢!
[解决办法]
关注中
[解决办法]
那个只是一个函数名字而已,你用调试模式,运行程序,切换到汇编代码,进行调试.
[解决办法]
肯定进行系统调用,让系统给分配内存.凡是涉及硬件操作,都是调用操作系统的函数去实现.计算机语言的操作符是设计语言的人规定的,如果这个操作符涉及到硬件操作,那么这种语言不提供实现方式,而是编译的时候让编译器连接系统提供的函数,实现此功能.比如C中的malloc函数,在linux和windows中连接执行的代码是不一样的,因为两种系统提供不同的堆分配代码.
[解决办法]
void main() { 004117A0 push ebp 004117A1 mov ebp,esp 004117A3 sub esp,0D8h 004117A9 push ebx 004117AA push esi 004117AB push edi 004117AC lea edi,[ebp-0D8h] 004117B2 mov ecx,36h 004117B7 mov eax,0CCCCCCCCh 004117BC rep stos dword ptr es:[edi] int *p=new int[10]; 004117BE push 28h 004117C0 call operator new (4111D6h) 004117C5 add esp,4 004117C8 mov dword ptr [ebp-0D4h],eax 004117CE mov eax,dword ptr [ebp-0D4h] 004117D4 mov dword ptr [p],eax } 004117D7 xor eax,eax 004117D9 pop edi 004117DA pop esi 004117DB pop ebx 004117DC add esp,0D8h 004117E2 cmp ebp,esp 004117E4 call @ILT+455(__RTC_CheckEsp) (4111CCh) 004117E9 mov esp,ebp 004117EB pop ebp 004117EC ret
[解决办法]
new 就是个运算符,跟进去的代码你可以自己看,给你贴一点
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes10269080 push ebp 10269081 mov ebp,esp 10269083 sub esp,10h void *p; while ((p = malloc(size)) == 0)10269086 mov eax,dword ptr [size] 10269089 push eax 1026908A call malloc (1021AB10h) 1026908F add esp,4 10269092 mov dword ptr [p],eax 10269095 cmp dword ptr [p],0 10269099 jne operator new+77h (102690F7h)
[解决办法]
编译器根据规则生成的符号
[解决办法]
编译器生成的名字,一般不去理会