汇编与C++指针

本文通过一个C++示例程序详细展示了指针的使用方法、内存分配与释放的过程,并将其转换为对应的汇编语言代码进行深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值