术语解释

  • 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汇编—寻址方式的更多相关文章

  1. 80x86汇编小站站长简单介绍-2014年08月23日

    [序言] 旧版的"80x86汇编小站站长简单介绍"已经过时了, 因此于2013年10月01日花费1个小时又一次更新和排版一次. [人生格言]  1] 一生都用头脑而不是情绪解决这个 ...

  2. 80x86汇编小站站长简单介绍

    [人生格言] 1] 一生都用头脑而不是情绪解决这个问题 2] 仅仅有偏执狂才会成功 3] 在最困难时都要保持一份幽默感 4] 吾生也有涯,而知也无涯,以有涯随无涯,殆已 [简历] 我的生日: 1981 ...

  3. 清华操作系统实验--80x86汇编基础

    前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...

  4. ARM 汇编寻址方式

    ARM支持9种寻址方式:立即数寻址,寄存器寻址,寄存器偏移寻址,寄存器间接寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址,块拷贝寻址. 立即数寻址 将数据直接存放的指令中发给CPU,首先由于AR ...

  5. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  6. Delphi 关键字详解[整理于 "橙子" 的帖子]

    absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var   Str: ];   StrLen: Byte absolute Str; //这个声明指定了变量 ...

  7. Delphi常用关键字用法详解

    本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...

  8. 【转】Delphi 关键字详解

    absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[32]; StrLen: Byte absolute Str; //这个声明 ...

  9. 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发

    [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...

  10. windows驱动开发推荐书籍

    [作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...

随机推荐

  1. 05 Ajax请求(扩展,延伸)

    05 Ajax请求(扩展,延伸) 首先, 我们用Flask创建一个后台服务器(自己做网站了哈) 目录结构: 服务端: from flask import Flask, render_template, ...

  2. #线性基#CF1100F Ivan and Burgers

    题目传送门 分析 线段树上直接维护线性基是三个log的.(一定要合并) 考虑一种分治做法,在 \([l,mid]\) 和 \((mid,r]\) 的询问分治处理, 跨过 \([mid,mid+1]\) ...

  3. #结论#洛谷 3199 [HNOI2009]最小圈

    题目 求有向图最小平均权值回路. \(n\leq 3*10^3,m\leq 10^4\) 分析 设 \(f_k(x)\) 表示从点 \(x\) 出发恰好走 \(k\) 条边的最短路, 那么答案就是 \ ...

  4. #莫比乌斯反演,整除分块,欧拉定理#U137539 虚伪的最小公倍数

    题目 \[\large\prod_{i_1=1}^n\prod_{i_2=1}^n\dots\prod_{i_k=1}^n\frac{i_1*i_2*\dots*i_k}{gcd(i_1,i_2,\d ...

  5. Ohos-MPChart——支持多种图表绘制的组件

    简介 Ohos-MPChart是OpenAtom OpenHarmony(简称"OpenHarmony")系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视 ...

  6. 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry

    背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP Client──────────►Collect────────►StartRocks (Ag ...

  7. vue3探索——组件通信之v-model父子组件数据同步

    背景 再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源. Vue2写法 在vue2中,我们使用.sync修饰符+自定义事件'update: ...

  8. Kalman滤波器的原理与实现

    Kalman滤波器的原理与实现 卡尔曼滤波器(Kalman Filter)是一个十分强大滤波器,虽然叫做滤波器,卡尔曼滤波器其实可以起到到两个作用,即预测与更新,这与我们在其运行时所关注的环节有关.当 ...

  9. HarmonyOS语言基础类库开发指南上线啦!

      语言基础类库提供哪些功能?多线程并发如何实现?TaskPool(任务池)和Worker在实现和使用场景上有何不同? 针对开发者关注的并发等语言基础类库的相关能力,我们在新推出的语言基础类库开发指南 ...

  10. k8s之helm部署mysql集群

    一.简介 Helm Helm 是 Kubernetes 的包管理器. Chart Helm使用的包格式称为 chart.chart存储在Chart Repository. chart就是一个描述Kub ...