地址、指针和引用

地址: 对变量取地址使用“&”符号

指针: TYPE * 定义指针,TYPE为数据类型

引用: TYPE & 定义引用,TYPE为数据类型

地址和指针
c 代码
汇编

13  int nVar = 0x12345678;

mov dword ptr ss:[ebp-C],12345678

14  int *pnVar = &nVar;

lea eax,dword ptr ss:[ebp-C]

mov dword ptr ss:[ebp-18],eax    //直接将地址存入内存

15  char *pcVar = (char*)&nVar;

lea eax,dword ptr ss:[ebp-C]

mov dword ptr ss:[ebp-24],eax

16  short *psnVar = (short*)&nVar;

lea eax,dword ptr ss:[ebp-C]

mov dword ptr ss:[ebp-30],eax

18  printf("Justin: %08x \r\n", *pnVar);

19  printf("Justin: %08x \r\n", *pcVar);

20  printf("Justin: %08x \r\n", *psnVar);

23  char cVar[5] = {0x01, 0x23, 0x45, 0x67, 0x89};

mov byte ptr ss:[ebp-40],1

mov byte ptr ss:[ebp-3F],23

mov byte ptr ss:[ebp-3E],45

mov byte ptr ss:[ebp-3D],67

mov byte ptr ss:[ebp-3C],89

内存数据

24  int *pnVar1 = (int*)cVar;

lea eax,dword ptr ss:[ebp-40]

mov dword ptr ss:[ebp-4C],eax

25  char *pcVar1 = (char*)cVar;

lea eax,dword ptr ss:[ebp-40]

mov dword ptr ss:[ebp-58],eax

26  short *psnVar1 = (short*)cVar;

lea eax,dword ptr ss:[ebp-40]

mov dword ptr ss:[ebp-64],eax

27  pnVar1 += 1;

mov eax,dword ptr ss:[ebp-4C]

add eax,4   //int 指针 4 位

mov dword ptr ss:[ebp-4C],eax

28  pcVar1 += 1;

mov eax,dword ptr ss:[ebp-58]

add eax,1    //char 指针 1位

mov dword ptr ss:[ebp-58],eax

29  psnVar1 += 1;

mov eax,dword ptr ss:[ebp-64]

add eax,2  //short指针 2位

mov dword ptr ss:[ebp-64],eax

32  int &nVarType = nVar;

lea eax,dword ptr ss:[ebp-C]

mov dword ptr ss:[ebp-70],eax

33  Add(nVar);

lea eax,dword ptr ss:[ebp-C]

push eax

call addressandpointerref.A11320

add esp,4


void Add(int &nVar) {

nVar++;

mov eax,dword ptr ss:[ebp+8]    //堆栈寄存器,获取函数调用前push的地址

mov ecx,dword ptr ds:[eax]        //数据段寄存器

add ecx,1

mov edx,dword ptr ss:[ebp+8]

mov dword ptr ds:[edx],ecx

}

AH&AL=AX(accumulator):累加寄存器 

BH&BL=BX(base):基址寄存器 

CH&CL=CX(count):计数寄存器 

DH&DL=DX(data):数据寄存器 

SP(Stack Pointer):堆栈指针寄存器 

BP(Base Pointer):基址指针寄存器 

SI(Source Index):源变址寄存器 

DI(Destination Index):目的变址寄存器 

IP(Instruction Pointer):指令指针寄存器 

CS(Code Segment)代码段寄存器 

DS(Data Segment):数据段寄存器 

SS(Stack Segment):堆栈段寄存器 

ES(Extra Segment):附加段寄存器 

OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. 

SF sign Flag 符号标志 记录运算结果的符号,结果负时为1. 

ZF zero flag 零标志 运算结果等于0时为1,否则为0. 

CF carry flag 进位标志 最高有效位产生进位时为1,否则为0. 

AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. 

PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0. 

DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. 

IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. 

TF trap flag 陷阱标志 用于调试单步操作.

推荐阅读更多精彩内容