文章转自 http://www.mcany.cn/article/291.htm
博主 没落的残阳
这节来学习下寻址方式。
1.首先我们来看什么是直接寻址?
直接寻址是我们创建一个直接偏移的操作数。 举例 mov eax, dword ptr [00403020h] ,那么[00403020h]就是直接寻址的形式。。加上dword ptr [] 表示获取的是我们目标内存地址的内容, dowrd ptr 是强制获取4个字节。
2.间接寻址
那什么是间接寻址呢?
用寄存器作为指针并操纵积存器的值,这称为间接寻址。存放地址的寄存器称为间接操作数。在32位模式下间接操作数可以是任何用[]括起来的32位通用寄存器(eax, ebx, ecx, edx ,esi , edi ,ebp ,esp) ,(注意:16位的模式下只能使用bx si di bp 4个寄存器), 寄存器里面放着数据的偏移。。
举例: 此时00402030h中存放4个字节数据。 00h 10h 40h 00h 。
执行 mov esi, 00402030h
mov eax, dowrd ptr [esi]
如果mov 指令使用“间接操作数”作为源操作数,那么esi内的指针将被用来寻址。该地址的4个字节被传送到目的操作数中。。 此时eax = 00401000h
3.变址寻址
变址操作数将“常量”加到寄存器上以产生一个有效地址,任何32位通用寄存器都可以作为指针寄存器。
格式:[constant + reg] --- (constant:常量, reg:寄存器) 。这样的形式被用到我们高级语言的数组处理比较多。
举例:
此时00403020h,存放8个字节数据 00h 10h 40h 00h 15h 00h 40h 00h
那么通过
mov esi, 00403020h
mov eax, dword ptr [esi]
mov eax, dword ptr [esi+4]
这里大家要注意下,避免使用ebp寄存器。因为ebp寄存器被常用于堆栈段,所以我们要避免这个情况。
这里我们是依据80386的寻址方式,例如80386还可以演化一些相对寻址,变址寻址等。其实这些也都是基于变址寻址的,大家知道就可以了。 。