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/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
随机推荐
- 3 CSS组合选择器
3 组合选择器 页面元素比较复杂,存在多个嵌套.为了更加灵活选择页面中的元素,CSS中还提供了组合选择器.组合选择器就是将多个基本选择器通过一定的规则连接起来组成一个复杂选择器. 后代子代选择器 &l ...
- 花式栈溢出 CTFshowpwn88
花式栈溢出 在这之前确实对这方面了解很少,一般这种花式栈溢出不仅仅要求你能发现漏洞,最主要的是你要有随机应变的能力 这个题是一个64位的题目看一下保护 canary 和 nx保护都开了,我们用ida打 ...
- #搜索#AT2368 [AGC013B] Hamiltonish Path
题目 求一条简单路径使得路径端点不能再被延伸 分析 一开始想到可能和度数有关,其实没必要, 随便以一个点作为路径中的点深搜两次即可 代码 #include <cstdio> #includ ...
- 网络协议之:memcached text protocol详解
目录 简介 memcached protocol介绍 memcached支持的命令 存储命令 读取命令 常用的其他命令 memcached服务器的返回值 支持UDP协议 总结 简介 用过缓存系统的肯定 ...
- C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础
访问结构体成员 要访问结构体的成员,请使用点语法 (.): // 创建名为 myStructure 的结构体 struct MyStructure { int myNum; char myLetter ...
- 机器学习服务活体检测算法荣获CFCA权威安全认证
随着人脸识别技术在金融.医疗等多个领域的加速落地,网络安全.信息泄露等问题愈为突出,用户对应用稳定性和安全性的要求也更为严格.为保障各行业高效稳定的开展业务,提前发现和应对潜在安全风险,HMS Cor ...
- HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用
原生智能是HarmonyOS NEXT的核心亮点之一,依托HarmonyOS SDK丰富全面的开放能力,开发者只需通过几行代码,即可快速实现AI功能.新浪新闻作为鸿蒙原生应用开发的先行者之一,从有声资 ...
- centos8 \CentOS 9 Stream \Oracle Linux8\Oracle Linux 9 rpm 安装mysql8.0.28 mysql8.0.34
centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...
- 重新整理 .net core 实践篇—————应用分层[二十四]
前言 简单整理一下分层. 正文 应用程序分层,分为: 1.领域模型层 2.基础设施层 3.应用层 4.共享层 共享层 共享层一般包括下面几个类库. 有一个Core 的类库,比如说BLog.Core. ...
- linux系统关闭指定端口
linux系统关闭指定端口 关闭指定端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent systemctl restart f ...