反汇编基础-数据类型以及C++引用、指针反汇编后的概括

反汇编中的数据类型

在汇编中,无论是字符串类型,整数类型还是其他类型都只有2个关键单位,地址、长度



【注意:LEA为取地址指令】


引用和指针的汇编代码:
引用并不会影响程序的执行效率,使用引用又比指针多了编译器的检测
所以在编写C++程序时应该抛弃指针,拥抱引用。


const为编译期检查


下面先来看一个C++源码:

#include <stdio.h>


int main(){
	char *p_str = "CSDN IT1995";
	char arr_str[] = "CSDN IT1995";

	int n = 100;
	int *p_n = &n;
	int &r_n = n;
	
#define  num 100
	n = num;

	const int c_i = 100;
	return 0;
}

其中Main函数内对应的反汇编代码如下:


ptr -- pointer (指针)的缩写

第一个char *p_str="CSDN IT1995"

这里是把 2F58A8h这个地址,给了ptr[p_str]这个地址指向的指,说明这个是一个指针;


第二个char arr_str[]="CSDN IT1995";

他的反汇编是如上,这个有几个知识点:

DS(Data Segment):数据段寄存器,还有ds:[xxxx]

ds:[bx+16]指向一个内存地址

ds数据段寄存器是,[bx+16]是它的偏移地址,[段地址*16+偏移地址]得到一个20位的物理地址即ds:[bx+16]真正指向的地址

此处其实就是4个字节的,四个字节往EDP放,这里可以知道,数组是连续的。


第三个:int n=100;

这里,100的十六进制是64


第四个:int *p_n=&n;

这里要注意:LEA就是目标地址传送指令: 将一个地址指针写入到指定的寄存器
把地址写到[p_n]这个指针指向的值里面。
 
 


第五个是int &r_n=n;

这里可以看到,指针与引用没有鸡毛的区别(从反汇编来看,在C++书上,我们都知道,空间大小,编译时还是有差别的),所以要多用引用


第六个#define num 100;

n=num;这里面和第七个const int c_i=100在反编译里面的代码并没有什么区别




猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80794356