与操作数有关的寻址方式有七种
立即寻址
寄存器寻址
直接寻址
寄存器间接寻址
寄存器相对寻址
基址+变址寻址
相对基址加变址寻址
文章源自楠竹林-https://www.nanzl.com/archives/123
立即寻址方式
定义:在一条汇编指令中直接给出操作数就无需在寻找他的数据值来源,这就是立即寻址方式,他直接给出的操作数称之为立即数文章源自楠竹林-https://www.nanzl.com/archives/123
特点:指令中操作数2(源操作数)出现的操作数是一个立即数,并且立即数是以常量的形式出现的,在机器码中可以观测到这个立即数文章源自楠竹林-https://www.nanzl.com/archives/123
例子:
Mov Ax,123H ;立即寻址方式 十六位汇编语言 AX的值为1234H
Mov Cx,40D ;立即寻址方式 十六位汇编语言 CX的值为40D文章源自楠竹林-https://www.nanzl.com/archives/123
Mov EAx,123H ;立即寻址方式 三十二位汇编语言
Mov ECx,40D ;立即寻址方式 三十二位汇编语言文章源自楠竹林-https://www.nanzl.com/archives/123
备注:这四行代码都属于立即寻址方式 其中 123H 与 40D都为立即数值。
这种形式的汇编代码,源操作数是直接给出一个数值的话,那么他的寻址方式就是立即寻址方式文章源自楠竹林-https://www.nanzl.com/archives/123
如上面两行汇编代码AX 和 CX 这两个十六位寄存器的数据来源,很直观的就可以看出是分别来源于1234H与40D常量值,而1234H与40D本身就是个立即数值,没有其他的寄存器货地址再给他们赋值了文章源自楠竹林-https://www.nanzl.com/archives/123
所以语句这种立即寻址方式的汇编代码,我们就无需再去查找1234H 与 4D的值来源于那个寄存器或地址了文章源自楠竹林-https://www.nanzl.com/archives/123
总结:源操作数是一个以常理形式的立即数值,那么就是立即寻址方式,源操作数的值不来源于寄存器或内存地址赋值提取文章源自楠竹林-https://www.nanzl.com/archives/123
--------------------------------------------------------
直接寻址方式
定义:一个指令中是直接给出操作数的偏移地址,那么这种寻址方式就是直接寻址文章源自楠竹林-https://www.nanzl.com/archives/123
特点:在指令中给出的偏移地址是被[]方括号括起来的一个常量值文章源自楠竹林-https://www.nanzl.com/archives/123
备注:这种寻址方式中给出的是操作数所在数据段的偏移量,那么寻找这个操作数就需要确定操作数所在段的段首址文章源自楠竹林-https://www.nanzl.com/archives/123
例子:
mov EAX,DS:[2000H] ;EAX=(DS x 16 + 2000H)
mov ECX,ES:[0ABCDH];ECX=(ES x 16 + ABCDH)
这两行汇编代码都是直接寻址方式,其中[2000H]与[ABCDH]都是操作数的偏移量
需要注意的是 直接寻址 可以是正数也可以是负数
例如:mov bx,[-0020H]
这样也是直接寻址方式文章源自楠竹林-https://www.nanzl.com/archives/123
辨别直接寻址方式的方法
1.源操作数都是[]方括号括住 属于直接寻址方式特点
2.源操作数是一个常量值或直接地址,不是寄存器,属于直接寻址方式特点文章源自楠竹林-https://www.nanzl.com/archives/123
======文章源自楠竹林-https://www.nanzl.com/archives/123
举例:
006DE469 - A1 5427DB03 - mov eax[03DB2754] 直接寻址方式 这个就是游戏基址
006DE46E - 8B 48 08 - mov ecx[eax+08]文章源自楠竹林-https://www.nanzl.com/archives/123
这两句 第一句汇编代码 eax 的值 是直接给出了一个地址给传送给EAX
并且这个地址被[]方括号括住 属于直接寻找地址
直接寻址的地址是不变的,因为它本身自己就是个起始地址,没有其他寄存器或其他东西给他传递值
所以我们称之为基址(起始地址) 用它加上相关的偏移量就可以指向到相关的内存地址,
然后我们读取指向的内存地址就可以获取到数据信息文章源自楠竹林-https://www.nanzl.com/archives/123
---------------------------------------------------------文章源自楠竹林-https://www.nanzl.com/archives/123
寄存器寻址方式
定义:如果一个操作数存储在某个寄存器中,并且以寄存器的形式出现在指令中,那么这种寻址方式称之为寄存器寻址方式文章源自楠竹林-https://www.nanzl.com/archives/123
例子:
mov Eax,Ebx
mov Eax,Ecx
mov Eax,Esi
以上这些举例的指令都是属于寄存器寻址方式
因为操作数只可以分别存放在EBX ECX ESI 寄存器里,并且以寄存器形式出现文章源自楠竹林-https://www.nanzl.com/archives/123
例子:
mov EBX,5577H ;立即数5577H 送入EBX寄存器
mov ECX,EBX ;寄存器寻址方式(符合寄存器寻址方式的特点)
mov EAX,4CH ;
这三句汇编代码中,第二句 是寄存器寻址方式
因为 操作数是存放在EBX寄存器里 并且以寄存器形式作为源操作数
寄存器寻址辨别方法:源操作数存储在某个寄存器中,并且以寄存器的形式出现在当前指令中
执行完第二句后 ECX 寄存器的值是EBX的值(5577H) ECX=EBX(5577H)
执行完第三句后 操作码(也就是mov指令)把立即数(4CH)这个值传入EAX这个32位寄存器里去,EAX里的值就会是4CH
寄存器寻址方式是以寄存器来进行存放操作数的值
==
mov EBX,5577H ; EBX = 5577H
mov ECX,EBX ; 当跟踪到这步时 发现这条汇编代码是属于寄存器寻址
mov EAX,4CH
我们在分析数据时知道了ECX的值来源于EBX , 遇见这种寄存器寻址方式时 我们就往上找EBX赋值的代码来跟踪出最终数据起源地址。
--------------------------------------------------------
寄存器间接寻址方式
定义:寄存器间接寻址方式是指将操作数的直接地址送入基址寄存器EBX或EBP,或者变址寄存器ESI与EDI,这些寄存器中的任意一个寄存器里。在指令中使用这些存储了直接地址的寄存器作为操作数的地址指针,来实现操作数的提取和存储,我们就称之为寄存器间接寻址。
特点:当我们看见汇编代码指令中出现了用[]方括号括起来的基址寄存器EBX或EBP或者变址寄存器ESI与EDI任意一个时。
例如:
mov EAX,[EBX]
mov EDX,[EBP]
mov ECX,[ESI]
mov EBX,[EDI]
上面这4中形式都是寄存器间接寻址方式。
他们符合寄存器间接寻址的特点
1.都是寄存器被方括号[]括住
2.源操作数都是以EBX EBP ESI EDI 这四个寄存器其中任意一个寄存器来存储直接地址
寄存器间接寻址方式与直接寻址方式的区别是: 寄存器间接寻址方式是在指令中给出了存放操作数直接地址的寄存器,以寄存器形式进行提取和存储操作数的直接地址!
例如:
mov EAX,[EBX] ; 操作数的直接地址存放在EBX寄存器里并且以寄存器形式来给EAX进行提取存放在EBX寄存器里的操作数的直接地址
直接寻址方式是在指令中直接给出直接地址,不以寄存器形式提取和存储操作数的直接地址
例如
mov EAX,[008231BA] ;操作数直接给出了直接地址,不是以寄存器存储和提取
---------------------------------------------
寄存器相对寻址方式
定义:这种寻址方式是将操作数放在储存器中,而操作数的有效地址有 EBX EBP ESI EDI 等四个寄存器任意一个寄存器的内容再加上指令中给出的八位或十六位偏移量的和组成,这中寻址方式称之为寄存器相对寻址方式。
例如:
mov Eax,[Ebx+290H] 或 mov ECX,[ESI+12H] 这样的都是属于寄存器相对寻址方式
特点:由在寄存器的间接寻址方式基础上,EBX EBP ESI EDI 等4个寄存器任意一个寄存器再加上一个 8 位 或 16 位 偏移量组成。他们相加后的结果构成操作数的有效地址。
例如:
mov Eax,[Ebx+2000h] ; Eax 寄存器的内容 = 相加结果构成一个有效地址 = (EBX寄存器的内容 + 2000H)
mov Ecx,[Esi+12H] ;Ecx寄存器的内容 = 相加结果构成一个有效地址 = (ESI寄存器的内容 + 12H)
备注:寄存器相对寻址方式中,只能采用EBX EBP ESI EDI 这四个寄存器,其他寄存器都不允许
----------------------------------------------
基 址+变址寻址方式
定义:在指令中给出一个基址寄存器(EBX或EBP) 和一个变址寄存器(ESI或EDI),他们两个的内容相加之和是一个操作数的有效地址,那么这种寻址方式就是基址加变址寻址方式。
例如:
mov ax,[BP+SI] 或 mov CX,[BX+DI] 这两句汇编代码语句都属于基址加变址寻址
mov EAX,[ebp+esi] 或 mov ECX,[EBX+EDI] 32位
采用这种寻址方式 如果说要计算出操作数的物理地址,可以有两种情况进行计算求物理地址。
1.如果使用EBX作为基址寄存器在与ESI或EDI相配合,那么计算操作数物理地址的公式为
(物理地址 = DS x 16D + EBX + ESI或EDI)
例子:mov EAX,[EBX+ESI] 假设:EBX = 00410000H DS = 2000H ESI = 300H
那么要计算出AX寄存器的内容,就可以找公式计算:2000H x 16D + 410000H + 300H = 00430300
然后将这个有效地址传送给EAX
2.如果使用EBX作为基址寄存器在与ESI或EDI相配合,那么计算操作数物理地址的公式为
(物理地址 = SS x 16D +EBX + ESI/EDI)
-----------------------------------------------
相对基址+变址寻址方式
定义:在基址加变址寻址方式的基础上再加上一个8位或16位偏移量,他们三者内容之和为操作数的有效地址,这种寻址方式称之为相对基址加变址寻址方式。
例如:
mov EAX,[EBX+ESI+200H] ;32位汇编语句
mov AX,[BX+SI+200H] ;16位汇编语句
特点:在基址加变址寻址方式的基础上再加上一个8位或16位偏移量。
评论