80x86汇编—寻址方式
术语解释
EA:有效地址,通过段地址:偏移地址组合得到的Effect Address
位移量:一般是常量和标号,比如某个数据段首地址是ARR标号,那我们就可以直接写标号ARR找到数据段首地址。
基地址:BX、BP寄存器一般作为基地址
很有意思的是,我一开始以为基地址段地址,因为我一直觉得段地址是老大,我们偏移地址才是小弟,所以我们都以他为基准就以为段地址是基地址了,但其实不是的,BX和BP可以作为基地址, 基地址的意思是在偏移地址中能够作为一个基准,比如你MOV了一个地址进BX里面,我们寻址的时候可以用上基地址寻址以BX为基准,不用修改它,然后使用变址寄存器来改变。(下面会提到变址)
变址量:一般是SI、DI作为变址寄存器去改变地址值,就好像数组的下标一样。
比例因子:这位就好笑了,其实就是乘一个数字,一般是1,2,4,8,因为计算机就是用这几个进制,而且比例因子出现是因为我们可以通过比例因子乘以变址寄存器跳着找地址。比如SI * 4就是希望每次SI改变的时候地址能够以4的倍数跳着寻址。
细节:后面提到段地址其实我们寻址方式不涉及段地址,所以当时学的时候不清楚才导致我不理解基地址寻址连带后面的寻址方式也搞错了。
其次,寻址中可以不写出段地址,但是需要的时候就要指明。(后面会详细解释什么时候需要特地指明)
上面没懂没关系,这里解释我也是学完了才补上的。
8086寻址方式
直数寻址
- 立即数寻址
MOV AX, DS:[0110H] - 标号寻址
MOV AX, 标号,比如我们定义了一个叫做data的数据段,那就可以直接将data作为标号寻址到这段数据的地址。
寄存器间接寻址
MOV AX, [SI]
MOV AX, [DI]
MOV AX, [BX]
MOV AX, [BP]
MOV [SI], AX
上面多种多样都可以,但是唯独AX不可以作为寄存器寻址,验证时候,debug中错误提示是说:must be index or base reg ,所以我就把他理解为AX不是下标寄存器或者基址寄存器。
寄存器相对寻址
相对寻址就是有一个标号或者固定一个常量地址作为首地址然后使用变址寄存器,这里很容易和基地址寻址方式搞混,基地址那个是使用寄存器,这里是使用常量和标号(其实标号就是常量,编译器执行完后就是常量了)
这里设:ARR为标号地址
MOV AX, ARR[SI] ,这里ARR后面没有冒号,不是段地址,不要搞混了,而且debug中会看到是等于 EA = [ARR + SI]
其实也可以这样写:MOV AX,[ARR + SI],但是寄存器相对寻址这个名字既然起了咱就规规矩矩用,按照规矩来其实才是实战中最好用的
当然不止可用SI,DI也可以用,BP也可以用,但是这里的MOV AX, ARR[SI] 默认是DS段
如果你要用BP,请记住如果不指名段地址,BP默认的段地址是SS栈段。
可以看到没有指明和指明的段地址是不同的
38h[bp][si]中其实等于[BP + SI + 38h],不信的话也可以看到图中,debug出来的地址就是[BP + SI + 38h]
基址变址寻址
为什么不说基址?
好,我说,MOV AX,[BP],这就是基址寻址,这tm跟寄存器间接寻址没啥区别。
为啥不说变址寻址?
好,我再说,MOV AX,[SI],这就是你要的变址寻址,这特喵跟寄存器间接寻址有啥区别。
所以,还是学基址变址寻址
这里设:ARR是一个标号,假设ARR地址等于1010H
MOV AX, ARR[BP][SI]
也可以MOV [BP][DI], AX,不止只有源操作数才可以使用这种寻址方式
看到BP,并且没有指明段地址,那我们这条指令的段地址是SS。
基址是BP,变址是SI,组合起来就是基址变址寻址方式,
实质上这条debug后是等于:[BP + SI + 1010H],当然ARR会变成地址数值。
比例变址寻址方式
这个用途就是:假设我们的数据段每一个数据都是占好几个字的时候比如我们一个元素就占4个字,我们变址形式可以每次都加+4,但是这太麻烦了, 我们直接SI * 4,每次SI只需要增加1就完成了跳跃性的寻址,不用SI每次加4这么麻烦。
首先抓住字眼,比例+变址,那就是使用变址寄存器和比例因子就行了
MOV AX, ARR[SI * 4]
这个指令实质是等于:[ARR + SI * 4],SI * 4这里debug中一般都会帮你计算出来结果放在[ this ]里面。
基址比例变址寻址方式
学到这时候,我直接把书本撕掉,选择自己写。
我猜指令格式一定是:MOV AX, ARR[BP][SI*4]
没有书本了,那就看PPT截图答案,他的TABLE和我的ARR意思是一样的,只是一个标号,EBP是32位寄存求,我这里使用了16位寄存器,EBP和BP一样,默认段寄存器是SS,所以我是猜对了,希望复习的我以后还能继续猜对…
总结:最反人类的其实是相对寻址格式是 ARR[SI],这个样子实在是很基址寻址,因为基地址就是找一个基准,这里的相对寻址的ARR太像一个基地址杵在那里,但是后面转念一想,ARR作为标号就是一个地址,不是寄存器不能作为基准,这句话只可意会不可言传,我也不知道怎么说,总之我们基地址需要一个寄存器来表示,所以后面学习基址变址寻址方式的时候我才恍然大悟说原来基地址是需要一个寄存器作为基准。
还有一个让我掉大坑的是:我一直以为段地址是基址寻址方式,但是我们这里用的都是在段内的,我后知后觉,现在才搞懂,一切都是因为ARR这个长得太像基地址了,搞得我以为CS:IP这种才是基地址寻址方式。
学到这里,虽然说很反人类,其实想到指令系统的话,他甚至没有给你很明确的细分什么什么方式之类的,更头痛,有人帮你分类号这种是什么寻址方式其实更容易让我学习了。
总之,希望我以后不会再搞混了…
80x86汇编—寻址方式的更多相关文章
- 80x86汇编小站站长简单介绍-2014年08月23日
[序言] 旧版的"80x86汇编小站站长简单介绍"已经过时了, 因此于2013年10月01日花费1个小时又一次更新和排版一次. [人生格言] 1] 一生都用头脑而不是情绪解决这个 ...
- 80x86汇编小站站长简单介绍
[人生格言] 1] 一生都用头脑而不是情绪解决这个问题 2] 仅仅有偏执狂才会成功 3] 在最困难时都要保持一份幽默感 4] 吾生也有涯,而知也无涯,以有涯随无涯,殆已 [简历] 我的生日: 1981 ...
- 清华操作系统实验--80x86汇编基础
前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...
- ARM 汇编寻址方式
ARM支持9种寻址方式:立即数寻址,寄存器寻址,寄存器偏移寻址,寄存器间接寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址,块拷贝寻址. 立即数寻址 将数据直接存放的指令中发给CPU,首先由于AR ...
- 学习linux内核时常碰到的汇编指令(1)
转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...
- Delphi 关键字详解[整理于 "橙子" 的帖子]
absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: ]; StrLen: Byte absolute Str; //这个声明指定了变量 ...
- Delphi常用关键字用法详解
本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...
- 【转】Delphi 关键字详解
absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[32]; StrLen: Byte absolute Str; //这个声明 ...
- 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发
[序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...
- windows驱动开发推荐书籍
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
随机推荐
- #状压dp#洛谷 3959 [NOIP2017 提高组] 宝藏
题目 选定一个起点 \(S\),找到一棵生成树,最小化 \[\sum_{i=1}^n dep_i\times dis_i \] \(n\leq 12\) 分析 设 \(dp[d][S]\) 表示当前树 ...
- #背包#AT2037 [ARC060A] 高橋君とカード / Tak and Cards
题目 有一个长度为\(n\)的数组\(a\),选择若干个数使它们的平均数为\(A\),问共有多少种方案 分析 设\(dp[i][j]\)表示选择\(i\)个数总和为\(j\)的方案数,那么答案就是\( ...
- jcmd:JDK14中的调试神器
目录 简介 jcmd的语法 列出运行的JVM 打印stack信息 打印heap info 打印heap dump 统计heap使用情况 JFR功能 总结 简介 jcmd是JDK自带的调试工具,具有非常 ...
- OpenHarmony——内核IPC机制数据结构解析
一.前言 OpenAtom OpenHarmony(以下简称"OpenHarmony")是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是 ...
- 深入理解 Java 循环结构:while、do while、for 和 for-each 循环
Java 循环 循环可以执行一个代码块,只要达到指定的条件.循环很方便,因为它们节省时间,减少错误,并使代码更易读. Java While 循环 while 循环会循环执行一个代码块,只要指定的条件为 ...
- C++ 编程必备:对象生命周期管理的最佳实践
在C++中,对象的生命周期是指对象存在的时间段,从对象创建到对象销毁的整个过程.正确地管理对象的生命周期是编写高效.可靠C++代码的关键之一 对象的创建 在C++中,对象可以通过三种方式创建:静态分配 ...
- C# Dev GridControl小结
1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...
- 实践指南:EdgeOne与HAI的梦幻联动
在当今快速发展的数字时代,安全和速度已成为网络服务的基石.EdgeOne,作为腾讯云提供的边缘安全加速平台,以其全球部署的节点和强大的安全防护功能,为用户提供了稳定而高效的网络体验.而HAI(Hype ...
- Spring源码 19 IOC getBean方法
前面实现了 ClassPathXmlApplicationContext 的构造,接下来分析其调用的 getBean 方法. 以 getBean(UserDao.class) 为例. 1 Abstra ...
- windows下配置mask2former(facebook版)
1.安装Anaconda 2.安装PyCharm 3.创建python3.8环境(最高3.8因为有一个依赖包最高支持python3.8) 4.安装GCC 下载地址:https://sourceforg ...