汇编与C++指针

来源:互联网 发布:手机mac码查询 编辑:程序博客网 时间:2024/06/05 14:34

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

程序运行结果及示意图如下:

这里写图片描述

0 0
原创粉丝点击