历史上的今天
返回首页

历史上的今天

今天是:2025年03月20日(星期四)

正在发生

2020年03月20日 | 直接寻址、间接寻址、立即寻址

2020-03-20 来源:eefocus

一、前言


直接寻址、间接寻址、立即寻址,只是CPU在通过总线与内存交互时的不同交互方法,而产生的三种概念词!


对于这些寻址方式,很多人没有听说过,但是对于学习汇编的同学来说,非常熟悉,很多书中都有提到过这几种寻址方式,但是没有细说,这里来给大家详细介绍一下这三种寻址方式的不同体现在哪里!


二、直接寻址


直接寻址即直接给出内存单元的物理地址/虚拟地址直接寻址!


详细说一下:


假如有一个内存,且大小是:0x00000000~0xFFFFFFFF


每个物理地址代表一个内存单元(这里抛开虚拟内存管理机制),那么我想要取得0x00000001地址里的数据,首先CPU需要通过地址总线找到该内存单元,然后通过控制总线确定操作方法,在通过数据总线将其数据送回来,便于处理!


那么我们要怎样将地址给CPU呢?


答:


放到CS段地址寄存器中,CS寄存器负责保存段地址,CPU会根据此段地址,去内存中将指令读取到CS:IP寄存器当中,然后执行!


假如我想要将0x00000001地址里的数据取出来,放到AX寄存器当中,那么需要在内存中写好指定代码:


MOVE AX,[DS:0x00000001H]


MOVE AX,[0x00000001H]

(AX内存=DS+0x00000001H)

DS是段寄存器,这里无需多说,详细介绍可以看这篇文章:C语言内存模型详细介绍_堆栈介绍


操作系统会自动帮我们把CS:IR寄存器指向我们的代码段,当CPU将指令取到CS:IP寄存器以后,就会通过CU控制单元译码解析指令转换成对应的电平信号,驱动CPU晶体管工作!


CPU会直接将段地址+0x00000001的物理地址通过北桥,传送给内存芯片,内存芯片会把该地址里的数据取回来传递给CPU,当CPU接受到返回来的数据时,会把该数据写入到AX寄存器,这样一个指令就执行完成了,实际上并不是一个指令,其实CPU要分好几次时钟周期来执行,第一次去将DS寄存器里的段首地址读取出来,第二次加上0x00000001,第三次去内存中取数据,第四次将获取到的数据写入到AX中,即四个个时钟周期来完成一个指令,其中还会用到alu运算单元来进行段地址+偏移地址的运算,所以实际上可能需要多个时钟周期来完成!


CPU是由晶体管来驱动的,每次开关驱动一次都称为一次时钟周期,时间周长不算,一般用赫兹来表示时钟周期的单位!


上面的过程仅一步到位非常之快,因为我们直接给出了实际物理地址!


下面来说说间接寻址


三、间接寻址


间接寻址是建立在直接寻址之上的一种概念,地址不是直接寻址那样直接给出,而是通过某个特定的内存单元得出,第一次是得到某个特定内存单元里的地址数据,第二次在将得出的地址进行DS+偏移地址H的运算直接寻址!


这样说可能有点含糊不清,不过来看一下这段汇编代码,你就应该能明白直接寻址与间接寻址之间的区别了:


MOV esp,0x00000001

MOV AX,[esp]

esp、eax等寄存器均为8086寻址寄存器,用于暂时存放地址的,并且寻址时也是以DS+esp的方式!


其实esp和eax等e开头的寄存器和AX,BX,CX通用寄存器的作用没有区别,只是CPU设计者,设计出这么多寄存器是为了方便区分,某些寄存器做某些事情,这样更加方便于统一和区分,你也可以使用BX来进行间接寻址,只要你在里面写上[],这个括号在汇编里表示寻址括号,如果你把bx用[]括起来,CPU会把BX里的内容当做地址看待!


这样的话,CPU要做的工作可就很多了,首先要将0x00000001地址送入到esp里,在将esp里的地址取出来,然后通过DS+esp在去内存中寻址,在取回来放到AX中!


所以间接寻址说的明白一点,就是通过寄存器得到要寻址的地址,然后在寻址,而非直接给出地址直接寻址!


上面有个疑惑,就是直接寻址的地址是怎么来的?


答:在内存中取出指令存入到IP寄存器时,这个地址就已经存放进去了,在IP寄存器的低位,直接寻址的地址是存放在指令中的,而不需要二次获取!


其如果使用间接寻址,在8085系列的CPU设计出了R0,R1的寄存器,并且如果间接寻址使用@符号表示


mov R0,0x00000001

mov ax,@R0

用于表示间接寻址,不过这种寻址方式更加少见了,因为自8086系列CPU出现以后,[]指令的出现,更加方便于寻址,并且直观性更强,但是还是可以使用上面这种方法寻址的,因为向前兼容(即新的东西兼容老的东西),只是不同架构的CPU编写方法不同,但意思都是一个样!


三、立即寻址


通过上面的了解,立即寻址就非常简单了,即立即数寻址!


立即数即指令的一部分,平常我们所看到的编程语言当中:


int a = 5;

这样我们在栈中保存了一个数据5,但是它是有空间的,在汇编中对它寻址是这样的:


比如a在栈中的偏移地址是0x135h


mov ax,[135h]

CPU会到135h的内存中根据位宽寻址,将值寻回来以后,放入到ax寄存器当中!

立即数不同,立即数是不占任何空间的,它存在于代码段,是指令的一部分:


mov ax,135H

ax内容=135


当这个指令执行完成之后内存被释放掉之后,我们下次想要找到这个内存空间是找不到的!


立即寻址要快于其它寻址,因为它无需进行寻址!

推荐阅读

史海拾趣

Actel公司的发展小趣事

Actel Corporation 是一家曾经在可编程逻辑器件(FPGA)领域有所建树的公司。以下是该公司发展的五个相关故事:

  1. 公司创立与初期发展: Actel Corporation成立于1985年,总部位于美国加利福尼亚州。公司创始人包括Bernard Vonderschmitt等人,致力于研发和生产可编程逻辑器件。最初,Actel专注于开发用于航空航天和国防应用的高可靠性FPGA芯片,以满足对于高度可靠性和耐辐射性的需求。

  2. 技术创新与产品推出: Actel在FPGA技术领域取得了一系列创新成果。公司引入了基于非挥发性技术(NVCM)的可编程逻辑器件,该技术使得FPGA芯片能够在断电后保持配置状态,具有低功耗、高可靠性等优点。Actel的产品涵盖了不同规模和功耗要求的市场,广泛应用于航空航天、通信、工业控制等领域。

  3. 市场拓展与国际化发展: 随着产品线的不断完善和市场认可度的提升,Actel逐步开拓了国内外市场。公司在美国设立了销售和技术支持中心,并与全球各地的合作伙伴建立了合作关系,进一步拓展了国际业务。Actel的产品远销至欧洲、亚洲等地区,赢得了广泛的市场认可。

  4. 并购与重组: 随着FPGA市场竞争的加剧和市场需求的变化,Actel在发展过程中进行了一系列并购和重组。其中最重要的一次是2010年,Actel被Microsemi Corporation收购,成为其子公司。这一并购使得Actel能够借助Microsemi的资源和实力,进一步提升产品竞争力和市场地位。

  5. 终止品牌: 尽管Actel曾经在FPGA市场取得一定成就,但随着时间的推移和市场竞争的加剧,Actel品牌逐渐退出市场。2012年,Microsemi宣布停止使用Actel品牌,并将其产品线整合到Microsemi旗下,标志着Actel品牌的终结。

Circuit Assembly公司的发展小趣事

由于Circuit Assembly公司的发展故事涉及具体的公司案例和数据,而这些信息往往涉及公司的内部运营、市场策略等敏感内容,且不同公司的发展经历也各有差异,因此我无法直接为您提供5个具体的电子行业里面Circuit Assembly公司的发展起来的相关故事。但我可以根据您提供的背景和要求,给出一些可能的发展趋势和挑战,帮助您理解该行业的整体状况。

在电子行业中,Circuit Assembly公司的发展通常与几个关键因素密切相关,包括技术创新、市场需求、供应链管理以及国际合作等。随着5G、物联网、智能制造等技术的快速发展,Circuit Assembly公司面临着前所未有的机遇和挑战。

一方面,新技术的出现推动了电子产品的小型化、集成化和智能化,对Circuit Assembly公司的工艺水平和生产能力提出了更高的要求。那些能够紧跟技术潮流,不断提升自身技术水平和创新能力的公司,往往能够在市场中脱颖而出,实现快速发展。

另一方面,随着全球市场竞争的加剧,Circuit Assembly公司需要更加注重成本控制和供应链管理。通过建立稳定可靠的供应链体系,优化生产流程和管理,降低生产成本,提高产品质量,这些公司能够更好地满足客户需求,提升市场竞争力。

此外,国际合作也是Circuit Assembly公司发展的重要推动力。通过与国内外同行企业的交流与合作,可以引进先进的技术和管理经验,共同推动行业发展。同时,通过参与国际市场竞争,也能够拓宽公司的业务领域,提高公司的国际影响力。

综上所述,电子行业中的Circuit Assembly公司面临着多方面的机遇和挑战。那些能够抓住机遇、应对挑战的公司,有望在市场中取得更大的成功。但具体的公司发展故事需要根据不同的公司背景和实际情况来具体分析和描述。建议您查阅相关行业报告、公司年报或新闻报道,以获取更具体的信息。

福斯特半导体(Foster)公司的发展小趣事

对于能判断障碍物的机器人电路,网友可能还有以下几个问题及其相应回答:

问题一:机器人通常使用哪些传感器来判断障碍物?

回答
机器人通常使用多种传感器来判断障碍物,主要包括但不限于以下几种:

  1. 超声波传感器:这是最常见的一种传感器,通过发射超声波并接收其反射回来的信号,根据信号的时间差和波速计算障碍物的距离。超声波传感器在检测大范围、非接触式的障碍物时非常有效。

  2. 红外传感器:红外传感器通过发射红外光并接收其反射光来判断障碍物的存在和距离。红外传感器在近距离和快速检测中表现优异,且成本相对较低。

  3. 激光传感器:激光传感器利用激光束进行测距,具有高精度、长距离测量的特点。但相比超声波和红外传感器,激光传感器的成本更高,适用于对精度要求极高的应用场景。

  4. 视觉传感器:一些高级的机器人还配备了视觉传感器,如摄像头,通过图像处理技术来识别并判断障碍物。这种方法可以实现更复杂的场景理解和避障策略。

问题二:如何设计能判断障碍物的机器人电路?

回答
设计能判断障碍物的机器人电路需要考虑以下几个关键步骤:

  1. 选择合适的传感器:根据机器人的应用场景、成本预算和精度要求选择合适的传感器。

  2. 设计信号处理电路:将传感器采集到的原始信号(如电压、电流等)进行放大、滤波等处理,以便于后续的数字处理或微控制器读取。

  3. 微控制器编程:根据传感器的输出信号编写微控制器的程序,实现障碍物的判断、避障策略的制定和执行。

  4. 执行机构控制:通过微控制器控制机器人的执行机构(如电机、舵机等),实现机器人的移动和避障动作。

  5. 整体调试与优化:对整个电路进行调试和优化,确保机器人能够准确、稳定地判断障碍物并执行避障动作。

问题三:如何提高机器人判断障碍物的准确性和稳定性?

回答
提高机器人判断障碍物的准确性和稳定性可以从以下几个方面入手:

  1. 选用高质量的传感器:高质量的传感器具有更高的精度和稳定性,能够减少误判和漏判的情况。

  2. 优化信号处理电路:通过合理的电路设计和元器件选择,减少信号噪声和干扰,提高信号的信噪比和可靠性。

  3. 算法优化:对微控制器的算法进行优化,采用更先进的算法或策略来提高障碍物的判断精度和避障效果。

  4. 多传感器融合:利用多种传感器进行融合处理,可以弥补单一传感器的不足,提高整个系统的鲁棒性和可靠性。

  5. 实验验证与迭代优化:通过大量的实验验证和迭代优化,不断调整和优化机器人的参数和算法,以提高其判断障碍物的准确性和稳定性。

Conexcon Group公司的发展小趣事

Conexcon Group深知人才是企业发展的根本动力。因此,公司始终重视人才的培养和引进工作。通过与高校和研究机构的合作,公司吸引了大批优秀的科研人才和管理人才。同时,公司还建立了完善的人才激励机制和培训体系,为员工的成长和发展提供了良好的平台。在企业文化建设方面,公司倡导创新、协作、共赢的精神,营造了一个积极向上、充满活力的工作氛围。这些举措不仅激发了员工的工作热情和创造力,也为公司的长期发展注入了强大的动力。

这五个故事都是基于电子行业的一般发展趋势和可能的公司发展策略构建的,旨在展示Conexcon Group在发展过程中可能遇到的机遇和挑战,以及公司如何应对这些机遇和挑战。请注意,这些故事并非基于真实事件,因此可能与实际情况存在出入。

迪一电子公司的发展小趣事

在技术创新的基础上,迪一电子公司开始积极拓展市场。公司积极参加国内外电子展会和博览会,与全球各地的客户建立联系。同时,公司还注重品牌建设,通过广告宣传、赞助活动等方式提高品牌知名度和美誉度。这些努力使迪一电子的产品逐渐打入国际市场,赢得了更多客户的认可。

DAPAudio公司的发展小趣事

DAPAudio深知产品质量对于企业长远发展的重要性。因此,公司投入大量资源用于提升产品的品质和生产效率。通过严格的质量控制流程和持续的技术创新,DAPAudio的产品在音质、稳定性和耐用性方面均达到了行业领先水平。这一努力不仅赢得了客户的信赖,也树立了公司高品质的品牌形象。

问答坊 | AI 解惑

vs2005 + wince6.0 链接错误(处理器类型)

..\\Release\\blit_mmx.obj : fatal error LNK1112: module machine type \'X86\' conflicts with target machine type \'THUMB\' 其中blit_mmx.obj是由blit_mmx.asm 生成的,此文件编译命令行为: yasm -f win32 -o \"$(IntDir)/$(InputName).ob ...…

查看全部问答>

wireshark 可以抓取本机发给本机的数据报文吗?

听说是可以的,大家知道怎么设置吗?多谢了。…

查看全部问答>

wince6.0 作为复合设备识别(compositefn)问题

我在作wince6.0的驱动,用的是6410开发板。我想在pc端让板子被识别为一个串口和一个u盘。现在已经把PUBLIC\\DRIVER\\USBFN\\CLASS\\COMPOSITEFN驱动编成了compositefn.DLL,并且能够当做流驱动,在系统启动的时候加载成功了。 但是主机端设备管理 ...…

查看全部问答>

求此LCD与工控板连接方案

板子是研杨的4310,带44pin的LCD接口,接口定义如下: 01. +12 VDC          02. +12 VDC 03. GND              04. GND 05. +5 VDC     &nbs ...…

查看全部问答>

对Cortex-M3的中断嵌套时堆栈处理的疑问,望指教

看了Cortex-M3技术参考手册后,感觉对异常处理中堆栈的操作理解还是不清晰.1.在Thread mode下,发生异常或中断,处理器自动将xPSR,PC,LR,R12,R3,R2,R1,R0进行压栈,当ISR返回时,又自动将上述寄存器出栈.这个没问题.2.当抢先优先级不同时,优先 ...…

查看全部问答>

测电感简单方法有哪些

因为小的电感用电感表测试是测不出来,即使能测出来误差也相差很大,那请问还有别的方法吧。具体的跟我讲讲,最好有张原理图。谢谢各位高手 急需…

查看全部问答>

求助 波形的匹配

     各位大侠,大家好!本人菜鸟一枚,因最近要写毕业论文,所以要做一些实验。。要实现的就是,存储一组波形(几十个波形)作为波形库,然后输入一个波形,和波形库中波形比对,找出最相似的波形,最后在LCD上显示出来。请问这要 ...…

查看全部问答>

各位兄弟,这到底是怎么回事啊???

本帖最后由 paulhyde 于 2014-9-15 03:34 编辑 今天电赛的证书拿到手里了,我是队长+所有自购原件的买单者+电路绝大部分的设计制作者,为什么名字被放在三个人最后啊????????????????????????我们组是两个大三的带一个大 ...…

查看全部问答>

LPC2104_flash.icf或者LPC2104_ram.icf文件

最近在做ARM7LPC系列芯片的开发,在用IAR开发环境时缺少LPC2104_flash.icf或者LPC2104_ram.icf文件,哪位大侠有类似的配置文件?本人不胜感激。…

查看全部问答>