day03.2-寻址方式
一、为什么要寻址
- 我们知道数据存储在内存中,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-寻址方式相关推荐
- 汇编语言关于8086CPU多种寻址方式总结
8086CPU对内存的寻址方式 参考王爽老师的<汇编语言>第四版,P164
- 软考之CPU的寻址方式
在复习软考的时候,发现CPU的内部工作原理这一部分的内容挺重要的,现对CPU的寻址方式进行了一下总结.以下就来一一介绍一下. 我们都知道一个指令分为操作码和地址码两部分.操作码确定指令的类型.地址码确 ...
- 解决 王爽写的汇编语言的第七个验七- 寻址方式在结构化数据访问中的应用
原文: 汇编语言-(第三版) 王爽-著 (实验七) 寻址方式在结构化数据访问中的应用 https://www.52pojie.cn/thread-1241289-1-1.html (出处: 吾爱破解论 ...
- java寄存器_汇编学习 1 寄存器的作用 寻址方式 - DraculaW - JavaEye技术网站
首先 是寄存器的介绍 寄存器名 说明 功能 eax: 累加器 加法乘法指令的缺省寄存 ...
- web复习day03:request
回顾: web相关概念: web资源: 分类: 静态web资源 动态web资源 技术: html css js .... servlet jsp 软件架构: B/S C/S 相同: 都是基于请求和响应 ...
- 《计算机组成与体系结构:性能设计》读后小记 11、指令集:寻址方式和指令格式...
一.寻址方式(7种) 1.方式字段:通常是不同的操作码使用不同的寻址方式.指令格式中的一位或几位能用做方式字段,方式字段的值确定使用哪种寻址方式. 2.立即寻址:操作数实际出现在指令中.优点是,获得操 ...
- 实模式与保护模式详解三:寻址方式
寻找操作数物理地址的方式叫寻址方式 操作数的存放点 操作数在指令中 指令的操作数部分就是操作数本身 也叫立即数 操作数存放在CPU寄存器中 指令的操作数部分是寄存器的编码 也叫寄存器操作数 操作数存放 ...
- 汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)
寻址方式小结: 寻址方式 含义 名称 常用格式示例 [idata] EA=idata,SA=(ds) 直接寻址 [idata] [bx],[si],[di] EA=(bx)或(si)或(di),SA= ...
- 汇编的8种寻址方式,以及2个默认段寄存器
16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位 ...
- 段寄存器和8种地址寻址方式
段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定: 1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的 ...
最新文章
- 使用条件卷积进行实例和全景分割
- 原创 | 从席卷全球的“刷脸”乱象,看国内人脸识别立法方向
- 微软统一预训练语言模型UniLM 2.0解读
- vue图片宽高自适应_Echarts图标宽度变成100px,让图表宽度随着父元素自动适应,Vue实时监听宽度的变化,这可能是史上最好的解决方案!...
- 怎么博客圆的文章越来越杂?
- multism中ui和uo应该怎么表示_Excel中VBA程序基本语法之强大的数组,了解数组的功能...
- Python ID 生成(UUID、自增、19位雪花算法ID)
- python不能import当前目录下的文件_python无法导入包是什么原因
- Centos 7 下配置codeblocks13.12的googletest单元测试环境
- CDN的基本原理和基础架构
- Java Annotation 刷课笔记(二)
- Beego使用AdminLTE
- 通话清晰的蓝牙耳机推荐,打电话专用的耳机盘点
- 界面扩大缩小操作按钮_少儿编程|04.Scratch编程基本操作
- 移动支付走入线下商家
- 调和平均数、几何平均值和算术平均数
- Python PDF转高清图片 可设置转前几张
- 客户端架构设计的简单总结
- 软件开发随笔系列一——分布式架构实现
- Matlab:isempty()函数用法
热门文章
- Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operat
- 天嵌E9开发板tftp烧录eMMC教程(Android)
- 爱思服务器能不能更新苹果手机系统,iPhone 无法更新系统怎么办?
- iPhone 更新系统后死机怎么搞定?
- Anaconda Navigator启动缓慢
- 使用Python编写面向安卓模拟器的明日方舟挂机脚本
- 什么是逻辑卷管理器lvm?lvm设备的管理
- jenkins部署的时候WARNING: IPv4 forwarding is disabled. Networking will not work.
- 用苹果手机计算机程序二,两台iPhone怎么互传软件 苹果手机互传应用的3个小技巧...
- ThinkPHP 虚拟主机 跳转public主页设置