吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3506|回复: 14

[转载技术] 菜鸟先飞汇编学习之路(二)——寻址方式

[复制链接]
Shark_鹏 发表于 2015-3-24 16:04 | 显示全部楼层 |阅读模式

今天整理的学会的七种寻址方式这很重要,逆向的话你要找所存的注册码之类的就需要用到。还是我自己纯手工打的。部分是粘贴的。


1、寄存器寻址
     在这种寻址方式中,指令指明的寄存器就是操作数的存放地址,不需要访问存储器来取得操作数。
          对于32位操作数,寄存器可以是:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP等。
          对于16位操作数,寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等。
          对于8位操作数,寄存器可以是AL 、AH、BL、BH、CL、CH、DL、DH。
     例如:INC EAX       ;INC为+1指令,操作数地址为寄存器EAX。
          假设,执行前(EAX)= 00000001H,
          执行:(EAX)+1 = 00000001H-->(EAX)
          执行后:(EAX)= 00000002H
     (注:操作数(operand),是计算机指令中的一个组成部分,它规定了指令中进行数字运算的量。操作数指出指令执行的操作所需要数据的来源。操作数是汇编语言指令的一个字段,一般存放在数据段,操作数的地址由DS加上指令中直接给出的十六位偏移地址得到。但是如果采用超越前缀,则操作数也可能在其他段。)
     (注:段超越前缀:段超越前缀用来改变默认段寻址,通常内址寻址是数据段或者堆栈段,但你可以在指令前面加上段超越前缀,就可以访问到其它段内的数据。
       例如:MOV AL, CS:[SI]    ;[我的理解是:大部分寻址指令其实都可以看作段超越前缀如:mov al, [si] = mov al, ds:[si]   ;  mov al, [bp] = mov al, ss:[bp]    ])
  2、立即寻址
     在这种寻址方式中,操作数就包含在指令中,作为指令的一部分跟在指令(操作码)后面,存放在 代码段,如,MOV EAX,00000001H。
     例如:MOV WORD PTR EAX ,12345678H  ;MOV是传送指令,相当于EAX=-12345678H
     假设,执行前:(EAX)=00000000H,
     执行时:12345678-->(EAX)
     执行后:(EAX)= 123456789H
    (注:操作码:指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。不同的指令用操作码这个字段的不同编码来表示,每一种编码代表一种指令。组成操作码字段的位数一般取决于计算机指令系统的规模。)
  3、直接寻址方式
     在这种寻址方式中,操作数在寄存器中,指令直接包含右操作数的有效地址(偏移地址)。
     例如:ADD  EAX,[00000032H]
     假设执行前:(DS)=00002000H  (EAX)= 00000001H
     执行时:DS+0032=00020032H    00020032+00000001=00020033-->(EAX)
     执行后:(DS)=00002000H     (EAX)=00020033
    (注:这种寻址方式其实就相当于你已经走到街口,直接去找门牌号。应该就是这样--我的理解。)
     在汇编语言中,可以用符号地址代替数值地址。
     例如如:MOV AX,VALUE
            此时VALUE为存放操作数单元的符号地址。
            写成:MOV AX,[VALUE]也是可以的,两者是等效的
    (注:符号地址,是数值地址符号化后的地址,它相当于偏移地址)
  4、间接寻址
     间接寻址是在直接寻址的基础上面建立起来的,也就是直接寻址得到的数据是一个地址,通过这个地址找到最终的数据,也就是两次寻址,第一次得到的是地址,第二次才是目标数据。
     例如:MOV AX,[SI]
     假设执行前:[SI]=0001H,(DS)=1000H,地址为10001H的内容为:1234H
     执行时:10000+0001=10001H  寻址得到的内容为1234H
     执行后:(AX)=1234H  ([SI])=0001H
    (注:第一次寻址得到寄存器SI的值,这个值是一个地址,再通过这个地址,第二次寻址得到存数器数据。就是把寄存器SI里的内容看成是地址,然后把这个地址里面的内容赋给累加器AX)
  5、相对寻址
     以当前程序计数器pc的内容为基址,加上指令给出的一字节补码数(偏移量)形成新的pc值的寻址方式称为相对寻址。隐含引用的专用寄存器是程序计数器(PC),即EA=A+(PC),它         是当前PC的内容加上指令字段中A的值。一般来说,地址字段的值在这种操作下被看成2的补码数的值。因此有效地址是对当前指令地址的一个上下范围的偏移,他基于程序的局部性         原理。使用相对寻址可节省指令中的地址位数,也便于程序在内存中成块搬动。
    (注:原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位),其余位表示数值的大小。
          补码,在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统一处理。此外还有移码和反码。)
     操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器的(SI,DI)内容加上指令中给定的8位或16位位移量之和。
     如下:EA(有效地址)=[BX,BP](8位),[SI,DI](16位)之一+8位(BX,BP)或16位(SI,DI)偏移量
     在一般情况下,如果SI,DI或BX之内容作为有效地址的一部分,那么引用的段寄存器是DS;如果BP之内容作为有效地址的一部分,那么引用的段寄存是SS。
     物理地址=16D*(DS)+(BX)+8位位移量或(SI)或16位位移量或(DI)
     物理地址=16D*(SS)+(BP)+8位位移量或16位位移量
     在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如位移量是8位,则被带符号扩展成16位。
     例如: MOV  AX,[DI+1233H]
     假设,(DS)=5000H,(DI)=3678H  则
     物理地址=50000+3678+1223=5489BH(16位的段地址最后未位一定是0)
     执行后:(AX)=55AAH
    (注:说的这么复杂,其实很简单,就是给出的寄存器地址加上或者减去后面的偏移地址就是目标地址。我的理解是这样。)
  6、基址加变址寻址方式
     基址加变址的寻址方式是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址。
     即:EA(有效地址)=BX/BP+DI/SI
     在一般情况下,如果BP之内容作为有效地址的一部分,则以SS之内容为段值,否则以DS之内容为段值.
     例子:MOV AX, [BX+SI] 基址加变址寻址, MOV AX, [BX+DI+0400H] 带位移的基址加变址寻址。
    (注:这种寻址方式按图索骥即可,基址,即BX/BP看作基址寄存器,而变址则为DI/SI变址寄存器)
  7、相对基址加变址寻址方式
     在相对基址变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器。它是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,再加上指令中给定的8         位或16位位移量,并以一个段寄存器作为地址基准,作为操作数的地址。
     操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。同样,当基址寄存器为BX时,使用DS为段寄存器;而当基址寄存器为BP时,则使用SS为段寄存器
         物理地址= 16d×(DS) + (BX) + (SI) + 8位位移量或(DI) 或16位位移量
         或物理地址= 16d×(SS) + (BP) + (SI) + 8位位移量或(DI) 或16位位移量
     例如:MOV AX,MASK[BX][SI]
     假设执行前:(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,
     则 物理地址=16d×(DS)+(BX)+(SI)+MASK=3000+2000+1000+0250=33250H
     执行结果(AX)=1234H。
不知道会不会有人看到,但这只是我的学习之路,希望对大家有所帮助,和我一起进步。

评分

参与人数 18HB +23 THX +10 收起 理由
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
Jawon + 1
Soul1999 + 1
后学真 + 1
冷亦飞 + 1
temp + 1
极速菜 + 1
消逝的过去 + 1
飞刀梦想 + 1
yexing + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
jaunic + 2
hackysh + 1
lies + 1
向往神鹰 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Scar-疤痕 + 3 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
逍遥绝尘 + 6 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
逍遥绝尘 发表于 2015-3-24 17:50 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2015-3-24 22:33 | 显示全部楼层

学习了,感谢楼主!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-9 15:57 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
bnjzzheng 发表于 2022-2-26 16:16 | 显示全部楼层


[快捷回复]-感谢楼主热心分享!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-10 04:20 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
凌夏随缘 发表于 2022-6-5 15:11 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zg2600 发表于 2022-8-10 09:18 | 显示全部楼层

[吾爱汇编论坛52HB.COM]-标记一下,先看看好不好,谢谢楼主咯!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-10-12 07:59 | 显示全部楼层

收藏,便于后续使用
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-23 20:26 | 显示全部楼层

这个必须点个赞!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表