逆向知识-汇编寻址方式汇总

最近工作需要逆向工程的技术,醒悟自己以前好高骛远,误以为拿来主义即可,许许多多基础知识并不扎实,弄得焦头烂额。千里之行始于足下,记录一下自己的前行脚步。
汇编指令组成:  
  • 操作码:规定所要执行的操作类型 
  • 操作数:所要处理的数据或数据的位置信息 
在操作数部分通常不是直接给出操作数的数据本身,而是给出该数据的位置信息,如何获得数据的方式称为寻址方式。
 
例如:指令 MOV AX,1234H
指令里有两个操作数,按照指令中所处的位置,将前者称为目的操作数后者称为源操作数。该指令的作用是把数据1234H传送到AX中。源操作数是“立即”寻址方式,目的操作数是“寄存器”寻址方式。
 
  • 立即数寻址(Immediate Addressing)
    • 立即数直接传送入寄存器或存储器中; 通常用于对通用寄存器或内存单元赋初值。
    • MOV AX, 4576H 
  • 直接寻址(Direct Addressing) 
    • 源操作数在内存中,在指令中直接给出该操作数的有效地址
    • MOV BX, [1234H](在执行时,(DS)=2000H,内存单元21234H的值为5213H)
    • 数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来,如MOV ES:[1000H], AX
    • 立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
  • 寄存器寻址(Registert Addressing) 
    • 源操作数存储在某寄存器中,或把目的操作数存入寄存器
      • 源操作数是寄存器寻址方式
      • 目的操作数是寄存器寻址方式
      • 源操作数和目的操作数都是寄存器寻址方式
  • 寄存器间接寻址(Register Indirect Addressing) 
    • 操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定。该寻址方式物理地址的计算方法如下:
    • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
    • MOV BX,[DI]
  •  寄存器相对寻址方式
    • 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。
    • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。 
    • 在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
    • MOV BX, [SI+100H]

  • 变址寻址(Indexed Addressing) 
    • 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
    • 在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
    • 在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
    • MOV BX, [BX+SI]
  • 相对基址加变址寻址方式
    • 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。
    • 在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
    • 在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
    • MOV AX, [BX+SI+200H]
    • 几种等效表达方式:MOV AX, [BX+SI+1000H];MOV AX,1000H[BX+SI] MOV AX, 1000H[BX][SI]; MOV AX, 1000H[SI][BX]
  • 32位地址的寻址方式
    • 在用32位寄存器寻址时,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。
    • 32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
      32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
    • 地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;
    • 默认段寄存器的选用取决于基址寄存器,基址寄存器是EBP或ESP时,默认的段寄存器SS,否则,默认的段寄存器是DS
    • 在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
    • MOV EBX, [ECX*2] 
      MOV  EAX, [EBX+EBP] 
      MOV  EDX, ES:[EAX*4+200H]
原文地址:https://www.cnblogs.com/bigrabbit/p/3449129.html