• 数组是相同类型数据的集合,以先行方式连续储存在内冲中
  • 而指针只是一个保存地址值的4字节变量。

数组在函数中

  • 数组定义在函数中时,如果没有其他声明,数组为局部变量

    • 数组在内存中时线性连续的,数据排列顺序由低地址到高地址,数组名是数组的首地址
  • 反汇编之后,数组很像是连续定义了好几个变量,区分他们的方法
    • 观察类型,如果一些连续定义的变量中出现不同的类型,那就不是数组
    • 内存中是否一致
  • 数组不会因为被赋予常量值而使用常量传播
  • IDA中解析数组的方法
    • 双击标号定位首地址
    • 按下"*" 以这里为首地址
    • 填写数组大小
    • 按下"N" 重命名

字符串

  • 字符串本身就是数组,最后一个数据使用‘0’作为结束符
  • VC6中,为字符串类型赋值,是字符串赋值的过程。每次复制4字节,如果不是4的倍数,就依次减少
    • 4 4 2 1 的方式来复制11字节数据
  • 复制的时候使用eax,ecx,edx三个寄存器

数组作为参数

  • 数组作为参数的时候,只传递首地址

以下代码,在Debug模式下,汇编之后可以看到call _strlen

但是在Release模式下,编译器将函数作为内联函数处理了。

  • MMX 寄存器

MMX 为一种 SIMD 技术,即可通过一条指令执行多个数据运算,共有8个64位寄存器,分别为mm0 – mm7,

他与其他普通64位寄存器的区别在于通过它的指令进行运算,可以同时计算2个32位数据,或者4个16位数据等等,

可以应用为图像处理过程中图形 颜色的计算。

另外需要特别注意的是,MMX并非一种新的寄存器,而是FPU 80位寄存器的低64位,也就是说,使用MMX指令集,会影响浮点运算!

  • XMM 寄存器

XMM 同 MMX,只是他有 8 个 128 位寄存器,分别为 xmm0 – xmm7,另外还包含计算过程中的状态和控制寄存器

原文链接:https://blog.csdn.net/lidonghat/article/details/70244288

下标寻址和指针寻址

两种寻址方式

  • 下标寻址

    • 直接通过数组首地址和下标计算的偏移得到数据地址(首地址+(sizeof(type)*下标))
    • 下标值为整形常量的寻址:直接计算数据所在地址
    • 下标值为整形变量的寻址:需要计算偏移,形如:dword ptr [ebp+ecx*4-14h]
    • 下标值为整形表达式的寻址:如果是常量表达式,会常量折叠,编译期间算出结果
  • 指针寻址
    • 通过指针变量获取数据地址的地址,再去找数据地址(两次寻址)

多维数组

  • 将多维数组转为一维数组

存放指针类型数据的数组

  • 数组中全部都是类型相同的指针构成的数组
  • 字符串指针数组指向的是字符串的地址,但是二维字符数组就是内容

指向数组的指针变量

  • 定义方式:char (*pArray)[10];
  • 代码如下:
#include<iostream>
using namespace std; int main()
{
char sArray[3][10] = {"Hello","World","!!!"};
char(*pArray)[10] = sArray;
for (int i = 0; i < 3; i++)
{
cout << *pArray << endl;
*pArray++;
}
return 0;
}

函数指针

  • 保存函数首地址的指针
  • 例子代码如下:
#include <stdio.h>

int addNum(int i,int j)
{
printf("%x\n%d\n",i,i);
return i & 0x7;
} int main()
{
int(*addNumP)(int, int) = NULL; //定义一个函数指针
addNumP = &addNum; //将函数地址赋值给函数指针
printf("%d\n",addNumP(-3,2));
return 0;
} struct v
{
int(*addNumP)(int, int); //第一个成员 函数指针
char c = 48; //第二个成员 一字节数据
};

[C++逆向] 8 数组和指针的寻址的更多相关文章

  1. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  2. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  3. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  4. #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

    #运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x)  #x   //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[ ...

  5. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...

  6. c++ 反汇编 数组和指针

    字符串初始化字符数组 58: char as[] = "hello word"; 00AC7308 A1 70 2E B6 00 mov eax,dword ptr [string ...

  7. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  8. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  9. C指针-数组和指针的归一

    int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...

  10. 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

    数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...

随机推荐

  1. 在C#或python中使用xpath解析xml

    记几个笔记 文件后缀不一定要.xml,可以是任意后缀,只要内容是符合xml和格式即可解析出来 文件编码需要是utf-8,python和c#都需要,或者xml文件头有这样一句:<?xml vers ...

  2. 脑科学与人工神经网络ANN的发展历程与最新研究

    本文深入研究了ANN的基本概念.发展背景.应用场景以及与人脑神经网络的关系. 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复 ...

  3. python快速入门【三】-----For 循环、While 循环

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  4. C/C++ Qt 编译打包项目

    Qt程序编译后,需要去qt目录拷贝几个文件,与qt程序放在一起该程序才可以脱离开发环境而独立运行下去,在开发环境下编译好代码以后,还需要进行以下操作将其打包才可以在别的机器上正常运行. QT的下载地址 ...

  5. 驱动开发:内核MDL读写进程内存

    MDL内存读写是最常用的一种读写模式,通常需要附加到指定进程空间内然后调用内存拷贝得到对端内存中的数据,在调用结束后再将其空间释放掉,通过这种方式实现内存读写操作,此种模式的读写操作也是最推荐使用的相 ...

  6. axios请求失败,获取接口返回错误信息

    一般vue项目都会对axios进行封装,后台统一规范默认让服务器对所有请求都返回成功,然后在成功的对象里面包装一层对象result,里面也包含code,msg,result信息,前端拿这个result ...

  7. 8、数据库学习规划:MS SQL Server - 学习规划系列文章

    微软的SQL Server数据库是笔者最先接触的数据库,虽然之前有Access,但是那个是学校里知道的,没实际去开发基于Access的程序.SQL Server发展到现在已经有很多个版本了,其功能也非 ...

  8. 手撕B树 | 二三查找树,B+树B*树你都会了吗? | 超详细的数据结构保姆级别实现

    说在前面 今天给大家带来B树系列数据结构的讲解! 博主为了这篇博客,做了很多准备,试了很多画图软件,就是为了让大家看得明白!希望大家不要吝啬一键三连啊!! 前言 那么这里博主先安利一下一些干货满满的专 ...

  9. 借助Rich库实现Pandas DataFrame颜值升级

    pandas的DataFrame功能强大自不必说,它可以帮助我们极大的提高统计分析的效率. 不过,使用DataFrame开发我们的分析程序的时候,经常需要打印出DataFrame的内容,以验证和调试数 ...

  10. java 如何计算两个汉字的相似度?如何获得一个汉字的相似汉字?

    计算汉字相似度 情景 有时候我们希望计算两个汉字的相似度,比如文本的 OCR 等场景.用于识别纠正. 实现 引入 maven <dependency> <groupId>com ...