S shrux Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-12 #21 qiubole 强烈建议你让知道的人把答案发到你信箱
T tayu0214 Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-12 #23 wr960204 我想和你交个朋友. 一直都没有联系上你.
W wr960204 Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-12 #25 QQ:42088303基本很少上. 邮箱:wr960204@126.com
Q qiubole Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-12 #26 to wr960204 那次约好周六见面,可惜,在公司等了一天也没见你来,说是临时有事,真是可惜。
S SupermanTm Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #29 题目其实都是些基础题,我就放一道题吧。 Procedure CreateA(Aid: Integer); Var p: PChar; K: Integer; begin P := '123'; GetMem(p, 100); ........... 请写出(Aid、 P、 K、'123')是存放在堆或是栈中,还是其它位置 确实很基础,Aid,P, K在栈里, '123'在堆里
题目其实都是些基础题,我就放一道题吧。 Procedure CreateA(Aid: Integer); Var p: PChar; K: Integer; begin P := '123'; GetMem(p, 100); ........... 请写出(Aid、 P、 K、'123')是存放在堆或是栈中,还是其它位置 确实很基础,Aid,P, K在栈里, '123'在堆里
Y yinju Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #30 楼上答的有问题: Heap:堆,Heap上分配的内存,要求自己控制释放 Stack:栈,Stack上分配的内存系统自动释放 Aid(在寄存器EAX里),k,123都是在栈里 p指针本身也是在栈里,但是P指向的内容是在堆里的,需要freemem释放掉 另外,楼主的代码里应该使用K,不然k没有使用,编译器会自动去掉它,k就根本不存在了
楼上答的有问题: Heap:堆,Heap上分配的内存,要求自己控制释放 Stack:栈,Stack上分配的内存系统自动释放 Aid(在寄存器EAX里),k,123都是在栈里 p指针本身也是在栈里,但是P指向的内容是在堆里的,需要freemem释放掉 另外,楼主的代码里应该使用K,不然k没有使用,编译器会自动去掉它,k就根本不存在了
Q qiubole Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #31 楼上的错了,123凭啥在栈里????? 无缘无故就存在栈里了? K后面还有...
T tayu0214 Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #32 楼上你答的也小有点问题: delphi中: 用过程GetMem或New创建的动态变量是在堆(heap)中分配的,并且一直存在直到被FreeMem或Dispose释放 long strings、wide strings、dynamic arrays、variants以及interfaces等都是堆分配的(heap-allocated),但它们的内存都是被自动管理的。
楼上你答的也小有点问题: delphi中: 用过程GetMem或New创建的动态变量是在堆(heap)中分配的,并且一直存在直到被FreeMem或Dispose释放 long strings、wide strings、dynamic arrays、variants以及interfaces等都是堆分配的(heap-allocated),但它们的内存都是被自动管理的。
W wr960204 Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #33 因为Delphi默认是Register调用约定Aid,是在EAX寄存器中. P,K变量本身如果不优化的话通常是在栈里面. 如果优化的话,而且又不是无用代码被优化去掉.那么P,K会被优化到寄存器中.而不是使用栈. GetMem在堆上分配就无需多说了 象'123'这样的字符串常量不同编译器处理是不同的. MS的编译器通常把它放到只读数据段. Borland编译器通常把它放到代码段,该函数的后面.由于是在代码段.保证了只读性. 数字类型的常量一般就是变成立即数了.
因为Delphi默认是Register调用约定Aid,是在EAX寄存器中. P,K变量本身如果不优化的话通常是在栈里面. 如果优化的话,而且又不是无用代码被优化去掉.那么P,K会被优化到寄存器中.而不是使用栈. GetMem在堆上分配就无需多说了 象'123'这样的字符串常量不同编译器处理是不同的. MS的编译器通常把它放到只读数据段. Borland编译器通常把它放到代码段,该函数的后面.由于是在代码段.保证了只读性. 数字类型的常量一般就是变成立即数了.
E errorcode Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #34 P := '123' '123'不是字符串,是字符常量,跟string不一样,应该是在常量区吧,我记得以前学C/汇编是有这玩意的。 还有代码区,堆,栈,静态区什么
E errorcode Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #35 wr960204,说说看这两句汇编是啥东东,不明白 var P: PChar; begin P := '123'; mov eax, $0044e230 mov [ebp-$04], eax 我理解是将$0044e230是'123'的首地址,指向'1', $0044e231=>'2', $0044e233=>'3',但看不出$0044e230在哪了? 第二句:[ebp-$04]不明了?
wr960204,说说看这两句汇编是啥东东,不明白 var P: PChar; begin P := '123'; mov eax, $0044e230 mov [ebp-$04], eax 我理解是将$0044e230是'123'的首地址,指向'1', $0044e231=>'2', $0044e233=>'3',但看不出$0044e230在哪了? 第二句:[ebp-$04]不明了?
E errorcode Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #36 在D的反汇编,如何查看某地址的内容的?如想查$0044e230的内容?
W wr960204 Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #37 D的CPU查看窗口反汇编功能比较弱.不能区分出代码段中的字符串常量. 你可以用DEDE反汇编. 或者用OllyDbg查看.只要在代码前插入一个 ASM int 3 end; OllyDbg就会自动中断在这里.查看参考就行了
D的CPU查看窗口反汇编功能比较弱.不能区分出代码段中的字符串常量. 你可以用DEDE反汇编. 或者用OllyDbg查看.只要在代码前插入一个 ASM int 3 end; OllyDbg就会自动中断在这里.查看参考就行了
Y yinju Unregistered / Unconfirmed GUEST, unregistred user! 2008-03-13 #38 见笑了,'123'的回答是我错了,他存在于代码段 to: mov [ebp-$04], eax ebp指向堆栈基址,临时变量P刚好是第一个变量,基质偏移4位就指向它了。 mov [ebp-$04], eax 就是将‘123’的指针传给临时变量P
见笑了,'123'的回答是我错了,他存在于代码段 to: mov [ebp-$04], eax ebp指向堆栈基址,临时变量P刚好是第一个变量,基质偏移4位就指向它了。 mov [ebp-$04], eax 就是将‘123’的指针传给临时变量P