码迷,mamicode.com
首页 > 编程语言 > 详细

汇编与C++指针

时间:2016-05-12 15:29:35      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

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

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

技术分享

汇编与C++指针

标签:

原文地址:http://blog.csdn.net/yangcq06/article/details/51364420

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!