逆向工程-汇编语言 君子谬@看雪学院
章节概述 本节的重点是了解汇编语言的7种寻址方式。
七种武器(七种寻址方式) 在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式和堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。寻址方式分为两类,即指令寻址方式和数据寻址方式,前者比较简单,后者比较复杂。值得注意的是,在传统方式设计的计算机中,内存中指令的寻址与数据的寻址是交替进行的。
长生剑-立即数寻址方式 立即寻址方式的目的就是将操作数紧跟在操作码后面,与操作码一起放在指令代码段中,在程序运行时,程序直接调用该操作数,而不需要到其他地址单元中去取相应的操作数,上述的写在指令中的操作数也称作立即数。
碧玉刀-寄存器寻址方式 指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。 寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。 1、源操作数是寄存器寻址方式 如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。 其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。 2、目的操作数是寄存器寻址方式 如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。 3、源和目的操作数都是寄存器寻址方式 如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
孔雀翎-直接寻址方式 在指令格式的地址字段中直接指出操作数在内存的地址ID 。 在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。 直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值。 指令中直接给出操作数地址(dir)的寻址方式称为直接寻址。 寻址对象为: 1 内部数据存储器,在指令中以直接地址表示; 2特殊功能寄存器SFR,在指令中用寄存器名称表示。
多情环-寄存器间接寻址方式 寄存器间接寻址是将指定的寄存器内容为地址,由该地址所指定的单元内容作为操作数。MCS-51规定R0或R1为间接寻址寄存器,它可寻址内部RAM低位地址的128个字节单元内容。还可采用数据指针(DPTR)作为间接寻址寄存器,寻址外部数据存储器的64K字节空间,但不能用本寻址方法寻址特殊功能寄存器。 寄存器的间接寻址需要以寄存器符号的形式来表示,且在寄存器名称前面加上间接寻址符号“@”。例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中.
霸王枪-寄存器相对寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。 在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS。 指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。 例:假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么? 根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为: EA=(SI)+100H=2345H+100H=2445H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2445H=12445H。 所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。
离别钩-基址变址寻址方式 在基址加变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器,可把两种方式组合起来形成一种新的寻址方式。基址加变址的寻址方式是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址。 当基址寄存器为BX时,段寄存器使用DS,当基址寄存器为BP时,段寄存器用SS。 例子:MOV AX, [BX+SI] 基址加变址寻址, MOV AX, [BX+DI+0400H] 带位移的基址加变址寻址。
拳头-相对基址变址寻址方式 在相对基址变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器。它是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,再加上指令中给定的8位或16位位移量,并以一个段寄存器作为地址基准,作为操作数的地址。 当基址寄存器为BX时,段寄存器使用DS。 当基址寄存器为BP时,段寄存器则用SS。
结束