《软件调试分析技术》学习笔记(三)

M给出一个C程序

#include <stdio.h> 
#include <stdlib.h> 
int a; 
int main() 
{ 
  int b; 
  int *c; 
  c = (int*)malloc(sizeof(int)); 
  a = 1; 
  b = 2; 
  *c = 3; 
  free(c); 
  return 0; 
} 


 

这段代码定义了一个整型全局变量a,在主函数main()中定义了一个整型局部变量b和一个整形指针变量c,然后调用malloc()函数申请大小为1个整形变量的内存并把申请到的内存地址赋值给指针变量c,再依次给变量a、b和c指向的内存赋值1、2、3,接下来释放刚才申请到的堆内存,释放后退出主函数main()。

 

用OD加载

.text:00401000    push    ebp 
.text:00401001    mov     ebp, esp 
.text:00401003    sub     esp, 8 

这里把栈顶向下压8个字节,为整型变量b和指针变量c开辟空间。它们都是局部变量。

.text:00401006    push    4               ; Size 
.text:00401008    call    ds:__imp__malloc 
.text:0040100E    add     esp, 4 
.text:00401011    mov     [ebp+c], eax

一个整型变量占用的空间为4个字节,这里调用函数malloc()申请大小为4个字节的堆空间,然
后把申请到的内存空间地址赋值给变量c。

.text:00401014    mov     ?a@@3HA, 1      ; int a 
.text:0040101E    mov     [ebp+b], 2 
.text:00401025    mov     eax, [ebp+c] 
.text:00401028    mov     dword ptr [eax], 3 


这里分别给三个变量赋值1、2、3。可以看到变量a所使用的内存空间地址是一个常量,它存在于程序的数据段中;变量b所使用到的内存空间地址是ebp+b,它位于栈区;指针变量c储存的数据是刚才由函数malloc()申请到的堆空间地址。

.text:0040102E    mov     ecx, [ebp+c] 
.text:00401031    push    ecx             ; Memory 
.text:00401032    call    ds:__imp__free 
.text:00401038    add     esp, 4 
.text:0040103B    xor     eax, eax 
.text:0040103D    mov     esp, ebp 
.text:0040103F    pop     ebp 

这里调用函数free()来释放刚才由函数malloc()申请到的堆空间地址。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值