术语解释

  • 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. JDK11的新特性:HTTP API和reactive streams

    目录 简介 怎么在java中使用reactive streams POST请求的例子 总结 JDK11的新特性:HTTP API和reactive streams 简介 在JDK11的新特性:新的HT ...

  2. OpenHarmony—应用间HSP开发指导

     应用间HSP用于不同应用间的代码.资源共享. 应用间HSP的宿主应用是一种特殊状态的应用,只能由一个HSP组成,不会独立运行在设备上,而是被普通应用模块的依赖项引用.当普通应用运行时,通过动态调用的 ...

  3. 30分钟成为Contributor|共建测试子系统,赋能提升项目代码质量

    如何优雅地参与开源贡献,向顶级开源项目提交 PR(Pull Request),跟着大咖30分钟成为OpenAtom OpenHarmony(以下简称"OpenHarmony") C ...

  4. 为什么使用gs_probackup执行全量备份时,提示无法连接到数据库?

    为什么使用 gs_probackup 执行全量备份时,提示无法连接到数据库? 背景介绍: 在使用 gs_probackup 执行全量备份时,提示无法连接到数据库. 报错内容: [ommdoc@host ...

  5. Linux&Ubuntu之更换服务器

    前言 更换网卡.主板上的板载网卡.主板是服务器硬件维护的常规操作.通常新换(板载)网卡的MAC地址会变更,而部分服务器更换主板也会导致板载网卡MAC地址变化.由于CAS(Ubuntu)系统会将新MAC ...

  6. 前端与 HTML

    0x1 前端 什么是前端 解决图形用户界面(GUI)人机交互的问题 跨终端 PC/移动浏览器 客户端/小程序 VR/AR 等 Web 技术栈 一句话总结前端工程师的工作:使用 Web 技术栈解决多端 ...

  7. 重学c#系列——索引器(十)

    前言 对于索引器,我们肯定不会陌生.为什么会有索引器这个东西呢?我们发现这东西很像是属性,只是通过索引方式去调用,那就慢慢揭开他的面纱吧. 正文 假设我们要对外暴露一个数组,为了体现其封装性,我们使用 ...

  8. szfpga 详细:高云1N1开发板高云gowin软件使用教程

      1.概述 国产FPGA是最近几年起来的产品,具有性价比高特点.高云FPGA,大多用在LED,电机控制,PLC设备上. 高云1N1开发板采用GW1N-LV1QN48C6/I5 FPGA器件.具有低功 ...

  9. Résumé Review 二分方法题解

    一道非常好的数学题,不愧是CF的题,跟某些网站上的水题.恶心题没法比~ 题意 这里就要夸一下某谷了,翻译的很好,不像我,在CF上用deepl翻译,不够清晰(←全是废话) 分析 先不考虑 bi ,考虑转 ...

  10. 力扣609(java&python)-在系统中查找重复文件(中等)

    给你一个目录信息列表 paths ,包括目录路径,以及该目录中的所有文件及其内容,请你按路径返回文件系统中的所有重复文件.答案可按 任意顺序 返回. 一组重复的文件至少包括 两个 具有完全相同内容的文 ...