代码段,数据段怎么看得出

时间:2021-03-06 02:18:52
书上说汇编程序中有代码段和数据段的区别,我写了一个小程序,在VC++6.0下编译输出汇编代码,
但是我从这个汇编代码中看不出哪些存在代码段,哪些在数据段,各位大虾指点啊
// 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


在汇编代码中间有没有体现出来?