一、为什么要寻址

  • 我们知道数据存储在内存中,CPU需要使用存在内存中的数据,使用一个数据就要在内存中找到这个数据,用什么找,就是用内存编号,即地址,来找到数据在内存中所在的位置,把它取出来使用,或者再放回到指定位置
  • 上述就是一个寻址过程:寻址方式一共有五种,计算机只认识这五种方式来寻址

二、五种寻址方式

1.寻址方式一[立即数]

  • 直接通过[立即数],即直接用内存地址来寻址

  • 读取内存的值

    MOV EAX,DWORD PTR DS:[0x13FFC4]
    

    MOV就是将DWORD PTR DS:[0x13FFC4]这个值放到32位EAX寄存器中;DWORD表示读32位的数字,可以省略但不建议;PTR是固定写法;DS是段寄存器,32位汇编中段寄存器和内存的属性有关系,如果后面地址直接用数表示,则用DS,如果后面写ESP或者EBP,就写SS,如果EDI的话就用ES。所以32位汇编中段寄存器就是后面内存属性的一个标识。所以整条指令的作用就是用立即寻址的方式将内存中0x13FFC4地址中存储的值读出来放到EAX里

  • 内存中写入数据

    MOV DWORD PTR DS:[0x13FFC4],ebx
    

    将内存中0x13FFC4中的值读出来写入到ebx寄存器中

  • 获取内存编号

    LEA EAX,DWORD PTR DS:[0x13FFC4]
    

    第一条指令表示将内存中0x13FFC4这个地址编号放入到EAX寄存中

2.寻址方式二[reg]

  • 通过[reg]来寻址,reg可以是8个通用寄存器中的任意一个。先通过读取寄存器中存放的内存地址编号,再通过内存地址编号找到内存中的值

  • 读取内存的值

    MOV ECX,0x13FFD0    #将0x13FFD0这个地址编号,放到到ECX寄存中,此地址就是ecx的基址
    #中间可能还有很多对ecx中的值的操作,我们只要找到ecx的基址,就可以跟踪ecx,最后得到下面语句中ecx究竟是什么
    MOV EAX,DWORD PTR DS:[ECX]    #将ECX寄存中存储的0x13FFD0这个地址中的值取出来放到EAX里
    

  • 向内存中写入数据

    MOV EDX,0x13FFD8     #将0x13FFD8存入EDX中
    MOV DWORD PTR DS:[EDX],0x87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EDX]
    

3.寻址方式三[reg+立即数]

  • 通过[reg+立即数]

  • 读取内存的值

    MOV ECX,0x13FFD0
    MOV EAX,DWORD PTR DS:[ECX+4]     #将地址编号为0x13FFD0+0x000004中的值取出存到EAX中
    
  • 向内存中写入数据

    MOV EDX,0x13FFD0
    MOV DWORD PTR DS:[EDX+0xC],0x87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EDX+4]
    

4.寻址方式四[reg+reg*{1,2,4,8}]

  • 通过[reg+reg*1或者2或者4或者8]来寻址,只能是1,2,4,8,后面学硬编码就知道了

  • 读取内存的值

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV EDX,DWORD PTR DS:[EAX+ECX*4]  #将0x13FFC4+0x8后的地址编号中的值取出来存到EDX
    

    特殊情况:如果[reg+reg*{1,2,4,8}]得到的内存地址编号不是栈的表示地址,比如算出来的结果是0x0019ff7A,我们知道栈中每个地址编号之间相差4,是因为用一个首地址0x0019ff78表示了0x0019ff78到0x0019ff7B这四个内存块,一共4字节,所以0x0019ff78后面才能显示存的值为0x004010f0。实际上0x0019ff7A中存的值为0x40(一个字节),而上面的命令用的是DWORD,表示读取4字节作为整体存入edx中,所以就从0x0019ff7A后面往后取4字节,即取0x19ff7A,0x19ff7B,0x19ff7C,0x19ff7D中的值,最终结果为0xFA100040(写的时候记得从高位开始写)

  • 向内存中写入数据

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+ECX*4],87654321   #将87654321这个值写入到0x13FFC4+0x8这个内存中
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EAX,ECX*4]   #只是将EAX,ECX*4这个地址编号存入到EAX中
    

5.寻址方式五[reg+reg*{1,2,4,8}+立即数]

  • 通过[reg + reg*1或者2或者4或者8 + 立即数 ]

  • 读取内存的值

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
    
  • 向内存中写入数据

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
    

三、作业

1.内存读写练习

  • 每种寻址公式分别实现内存的读、写和取内存地址

    • 寻址公式一:[立即数]

      mov eax,dword ptr ss:[0x0019ff74]          #读取内存
      mov dword ptr ss:[0x0019ff74],0xAAAAAAAA   #写入内存
      lea eax,dword ptr ss:[0x0019ff74]          #取内存地址
      
    • 寻址公式二:[reg]

      mov eax,dword ptr ss:[esp]
      mov dword ptr ss:[esp],0xBBBBBBBB
      lea eax,dword ptr ss:[esp]
      

      注意mov指令两个参数不能同时为寄存器

    • 寻址公式三:[reg + 立即数]

      mov eax,dword ptr ss:[esp+4]
      mov dword ptr ss:[ebp-8],edx   #将edx中的值存入到[ebp-8]内存
      lea eax,dword ptr ss:[esp+8]
      
    • 寻址公式四:[reg + reg * {1,2,4,8}]

      mov eax,2
      lea ecx,dword ptr ss:[ebp]  #现在ecx中存的值即为栈底地址编号0x19ff80
      lea ebx,dword ptr ss:[esp]  #现在ebx中存的值即为栈顶地址编号0x19ff74
      ----------------------------------
      #mov edx,dword ptr ds:[ecx-eax*1]  不能是减法!!!
      mov edx,dword ptr ds:[ebx+eax*1]   #将0x19ff76地址编号以及往高位的后三位地址编号组合起来的数存入                                   edx中
      mov edx,dword ptr ds:[ebx+eax*2]   #将0x19ff78地址中的值复制一份存入edx中
      ----------------------------------
      mov dword ptr ds:[esp+eax*2],ecx
      lea eax,dword ptr ds:[esp+eax*4]
      
    • 寻址公式五:[reg + reg * {1,2,4,8} + 立即数]

      mov eax,1
      mov ebx,dword ptr ss:[esp+eax*4+0x2]   #fa100019
      mov dword ptr ss:[esp+eax*4+0x2],edx
      lea eax,dword ptr ss:[esp+eax*4+0x2]
      

day03.2-寻址方式相关推荐

  1. 汇编语言关于8086CPU多种寻址方式总结

    8086CPU对内存的寻址方式 参考王爽老师的<汇编语言>第四版,P164

  2. 软考之CPU的寻址方式

    在复习软考的时候,发现CPU的内部工作原理这一部分的内容挺重要的,现对CPU的寻址方式进行了一下总结.以下就来一一介绍一下. 我们都知道一个指令分为操作码和地址码两部分.操作码确定指令的类型.地址码确 ...

  3. 解决 王爽写的汇编语言的第七个验七- 寻址方式在结构化数据访问中的应用

    原文: 汇编语言-(第三版) 王爽-著 (实验七) 寻址方式在结构化数据访问中的应用 https://www.52pojie.cn/thread-1241289-1-1.html (出处: 吾爱破解论 ...

  4. java寄存器_汇编学习 1 寄存器的作用 寻址方式 - DraculaW - JavaEye技术网站

    首先 是寄存器的介绍 寄存器名     说明                            功能 eax:            累加器                 加法乘法指令的缺省寄存 ...

  5. web复习day03:request

    回顾: web相关概念: web资源: 分类: 静态web资源 动态web资源 技术: html css js .... servlet jsp 软件架构: B/S C/S 相同: 都是基于请求和响应 ...

  6. 《计算机组成与体系结构:性能设计》读后小记 11、指令集:寻址方式和指令格式...

    一.寻址方式(7种) 1.方式字段:通常是不同的操作码使用不同的寻址方式.指令格式中的一位或几位能用做方式字段,方式字段的值确定使用哪种寻址方式. 2.立即寻址:操作数实际出现在指令中.优点是,获得操 ...

  7. 实模式与保护模式详解三:寻址方式

    寻找操作数物理地址的方式叫寻址方式 操作数的存放点 操作数在指令中 指令的操作数部分就是操作数本身 也叫立即数 操作数存放在CPU寄存器中 指令的操作数部分是寄存器的编码 也叫寄存器操作数 操作数存放 ...

  8. 汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)

    寻址方式小结: 寻址方式 含义 名称 常用格式示例 [idata] EA=idata,SA=(ds) 直接寻址 [idata] [bx],[si],[di] EA=(bx)或(si)或(di),SA= ...

  9. 汇编的8种寻址方式,以及2个默认段寄存器

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位 ...

  10. 段寄存器和8种地址寻址方式

    段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定: 1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的 ...

最新文章

  1. 使用条件卷积进行实例和全景分割
  2. 原创 | 从席卷全球的“刷脸”乱象,看国内人脸识别立法方向
  3. 微软统一预训练语言模型UniLM 2.0解读
  4. vue图片宽高自适应_Echarts图标宽度变成100px,让图表宽度随着父元素自动适应,Vue实时监听宽度的变化,这可能是史上最好的解决方案!...
  5. 怎么博客圆的文章越来越杂?
  6. multism中ui和uo应该怎么表示_Excel中VBA程序基本语法之强大的数组,了解数组的功能...
  7. Python ID 生成(UUID、自增、19位雪花算法ID)
  8. python不能import当前目录下的文件_python无法导入包是什么原因
  9. Centos 7 下配置codeblocks13.12的googletest单元测试环境
  10. CDN的基本原理和基础架构
  11. Java Annotation 刷课笔记(二)
  12. Beego使用AdminLTE
  13. 通话清晰的蓝牙耳机推荐,打电话专用的耳机盘点
  14. 界面扩大缩小操作按钮_少儿编程|04.Scratch编程基本操作
  15. 移动支付走入线下商家
  16. 调和平均数、几何平均值和算术平均数
  17. Python PDF转高清图片 可设置转前几张
  18. 客户端架构设计的简单总结
  19. 软件开发随笔系列一——分布式架构实现
  20. Matlab:isempty()函数用法

热门文章

  1. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operat
  2. 天嵌E9开发板tftp烧录eMMC教程(Android)
  3. 爱思服务器能不能更新苹果手机系统,iPhone 无法更新系统怎么办?
  4. iPhone 更新系统后死机怎么搞定?
  5. Anaconda Navigator启动缓慢
  6. 使用Python编写面向安卓模拟器的明日方舟挂机脚本
  7. 什么是逻辑卷管理器lvm?lvm设备的管理
  8. jenkins部署的时候WARNING: IPv4 forwarding is disabled. Networking will not work.
  9. 用苹果手机计算机程序二,两台iPhone怎么互传软件 苹果手机互传应用的3个小技巧...
  10. ThinkPHP 虚拟主机 跳转public主页设置