知识点:立即寻址寄存器寻址寄存器间接寻址直接寻址方式直接寻址方式寄存器相对寻址一、了解指令常用寻址方式 寻址方式就是寻找操作数或操作数地址的方式。 寄存器是中央处理器内的组成部分。寄存器是一组容量有限的高速存贮部件,它们可用来暂存指令、数据和位址。(DWORD)MOV EAX,0x1234 //立即寻址 MOV EAX,EBX //寄存器寻址 数据寄存器,一般称之为通用寄存器组 通用寄存器有4个 EAX,EBX,ECX,EDX MOV EAX,[EBX] //寄存器间接寻址 MOV EAX,v //v是一个变量名 MOV EAX,[1234] //直接寻址方式 MOV EAX,[EBX+1234] //寄存器相对寻址 二、理解寻址 上边的名字看起来很多,总结起来也就2种方式: 带[]与不带[] 1、不带括号的 有立即数与寄存器 2、带括号的就是指针,从地址里边取值出来。 MOV EAX,0x1234 //立即寻址 eax=0x1234; MOV EAX,EBX //寄存器寻址 eax=ebx MOV EAX,[EBX] //寄存器间接寻址 eax=*(int*)ebx; MOV EAX,v //v是一个变量名 eax=v; //被编译后 一般会呈后边两种形式MOV EAX,[1234] //直接寻址方式 eax=*(int*)(0x1234)MOV EAX,[EBX+1234] // 寄存器相对寻址 eax=*(int*)((int)ebx+1234); //这里的1234称为偏移,EBX是基址三、对调位置MOV EAX,0x1234 //立即数不能出现在MOV指令左边。如: MOV 0x1234,EAX 这是错的写法 后边的都可以对换位置 MOV EAX,EBX //寄存器寻址 eax=ebx mov ebx,eax MOV EAX,[EBX] //寄存器间接寻址 eax=*(int*)ebx; mov [ebx],eax MOV EAX,v //v是一个变量名 eax=v; mov v,eaxMOV EAX,[1234] //直接寻址方式 eax=*(int*)(0x1234) mov [1234],eaxMOV EAX,[EBX+1234] // 寄存器相对寻址 eax=*(int*)((int)ebx+1234) mov [ebx+1234],eax
//下边指令,前边是寄存器相对寻址,后边是立即寻址0040105A |. C745 FC 20304>MOV DWORD PTR SS:[EBP-4],001_MOV.00403020 ; int *da=a //a是数组的地址 00401061 |. B8 11110000 MOV EAX,1111 ; eax=0x1111 立即寻址00401066 |. 8BD8 MOV EBX,EAX ; mov ebx,0x1111-->ebx=0x1111 //寄存器寻址00401068 |. 8B1D 18304000 MOV EBX,DWORD PTR DS:[403018] ; mov ebx,008899FF-->ebx=009988FF 直接寻址0040106E |. 8B5D FC MOV EBX,DWORD PTR SS:[EBP-4] ; mov ebx,da 寄存器 相对寻址00401071 |. 8B45 00 MOV EAX,DWORD PTR SS:[EBP] //寄存器间接寻址00401074 |. 8B43 04 MOV EAX,DWORD PTR DS:[EBX+4] ; eax=da[1]=1 寄存器 相对寻址