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

14 篇文章 0 订阅
13 篇文章 0 订阅
一起看看数组在程序中的使用。C语言代码:
#include <stdio.h> 
int main() 
{ 
  int a[2]; 
  a[1] = 0; 
  a[a[1]] = 1; 
  return 0; 
} 


 

这段代码定义了一个大小为2的整型数组,给数组下标为1的变量赋值0,然后取数组下标为1的变量的值作为新的下标,给该变量赋值1,这里数组下标为1的变量的值为0,就是说给数组下标为0的变量赋值1,最后退出主函数main()。

载入OD看看反汇编代码:

 

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


这里为数组a开辟内存空间。一个整型变量所占的内存空间为4字节,数组a的大小为2,因此把栈顶向下压8个字节。

 

text:00401006    mov     [ebp+a+1*4], 0


  只要知道数组就是一个指针,这句代码就很容易理解了。OD是一个好工具,这里它已经分析出a是一个数组了,而ebp+a是数组的基地址。a是一个整型数组,其中的每一个变量占用的大小都是4字节,因此在数组中下标为i的变量的地址就可以表示为数组的基地址加上数组下标为i的变量与数组下标为0的变量的偏移量,即ebp+a+i*4,这一句代码中的地址ebp+a+1*4就是数组下标为1的变量的地址。

text:0040100D    mov     eax, [ebp+a+1*4] 
.text:00401010    mov     [ebp+eax*4+a], 1 

这两句代码,获取数组中下标为1的变量的值,把这个值作为新的数组下标eax,并给数组下标为eax的变量赋值1。

.text:00401018    xor     eax, eax 
.text:0040101A    mov     esp, ebp 
.text:0040101C    pop     ebp 
.text:0040101D    retn 



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值