反汇编中的数据类型
在汇编中,无论是字符串类型,整数类型还是其他类型都只有2个关键单位,地址、长度
【注意:LEA为取地址指令】
引用和指针的汇编代码:
引用并不会影响程序的执行效率,使用引用又比指针多了编译器的检测
所以在编写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在反编译里面的代码并没有什么区别