但是我从这个汇编代码中看不出哪些存在代码段,哪些在数据段,各位大虾指点啊
// C++源程序
const int n = 2;
class CCircle
{
public:
int radius;
int GetRadius();
};
int CCircle::GetRadius()
{
return radius;
}
void main()
{
CCircle CirA;
CirA.radius = n;
CirA.GetRadius();
}
// 对应的汇编代码
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?GetRadius@CCircle@@QAEHXZ ; CCircle::GetRadius
_TEXT SEGMENT
_this$ = -4
?GetRadius@CCircle@@QAEHXZ PROC NEAR ; CCircle::GetRadius
; 9 : {
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _this$[ebp], ecx // 这个语句有什么用?push ecx已经将ecx
// 入栈了,就是将参数传给this指针了,
// 我觉得是多余的
; 10 : return radius;
mov eax, DWORD PTR _this$[ebp]
mov eax, DWORD PTR [eax]
; 11 : }
mov esp, ebp
pop ebp
ret 0
?GetRadius@CCircle@@QAEHXZ ENDP ; CCircle::GetRadius
_TEXT ENDS
PUBLIC _main
_TEXT SEGMENT
_CirA$ = -4
_main PROC NEAR
; 13 : {
push ebp
mov ebp, esp
push ecx
; 14 : CCircle CirA;
; 15 : CirA.radius = n;
mov DWORD PTR _CirA$[ebp], 2 // 数字2 究竟是存在堆栈段还是存在数据段
; 16 : CirA.GetRadius();
lea ecx, DWORD PTR _CirA$[ebp]
call ?GetRadius@CCircle@@QAEHXZ ; CCircle::GetRadius
; 17 : }
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
多谢大家了
2 个解决方案
#1
被装载到cs:eip就是代码段,其它的是数据段
#2
在汇编代码中间有没有体现出来?
#1
被装载到cs:eip就是代码段,其它的是数据段
#2
在汇编代码中间有没有体现出来?