标签:
C++代码如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int a = 1;
int* p=NULL;
p=(int*)malloc(sizeof(int));
*p = 5;
cout<<&a;
cout<<"\n";
cout<<&p;
cout<<"\n";
cout<<p;
cout<<"\n";
cout<<*p;
return 0;
}
相应的汇编语言为(不全):
_TEXT SEGMENT
_a$ = -8 ; size = 4
_p$ = -4 ; size = 4
_main PROC
; 5 : {
push ebp
mov ebp, esp
sub esp, 8
; 6 : int a = 1;
mov DWORD PTR _a$[ebp], 1
; 7 : int* p=NULL;
mov DWORD PTR _p$[ebp], 0 ;注意到:目前的指针指向0——空地址。
; 8 : p=(int*)malloc(sizeof(int));
push 4
call _malloc
add esp, 4
mov DWORD PTR _p$[ebp], eax
;注意到:申请内存之后,p指针已经指向了一个地址。
; 9 : *p = 5;
mov eax, DWORD PTR _p$[ebp]
mov DWORD PTR [eax], 5
; 10 : cout<<&a;
lea ecx, DWORD PTR _a$[ebp]
push ecx
mov ecx, ……
call ……
; 12 : cout<<&p;
lea edx, DWORD PTR _p$[ebp];注意:传递的是p指针的地址
push edx
mov ecx, ……
call ……
; 14 : cout<<p;
mov eax, DWORD PTR _p$[ebp];注意,传递的是p指针指向的地址。
;也即是当前栈区中存的实际数据。
push eax
mov ecx, ……
call ……
; 16 : cout<<*p;
mov ecx, DWORD PTR _p$[ebp];传递地址
mov edx, DWORD PTR [ecx];根据地址寻找数据
push edx
mov ecx, ……
call ……
; 17 : return 0;
xor eax, eax
; 18 : }
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
程序运行结果及示意图如下:
标签:
原文地址:http://blog.csdn.net/yangcq06/article/details/51364420