段间跳转指令jmpi和实模式寻址(转)

本文详细解析了x86实模式下的段间跳转指令jmpi的工作原理,介绍了实模式下的内存寻址机制,以及8086处理器如何通过分段的方式来实现20位地址总线下的内存寻址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jmpi是段间跳转指令,用于x86实模式下,

      如:BOOTSEG = 0x0c70

            jmpi    4, #BOOTSEG

      假如当前段CS==00h,那么执行此指令后将跳转到段CS==0x0c70,当然段cs的值也变为0x0c70,接下来将执行指令0x0c70:0004处的指令。

 

     实模式下寻址是为了兼容8086处理器,8086是16位CPU(是ALU的数据宽度),20位地址总线可寻址1M内存空间。其寻址方式:段基址+偏移  的方式,段基址保存在CS、DS、ES等段寄存器内,相当于寻址的高16位,而偏移是内部16位总线提供,在送往外部地址总线时,段基址和偏移合成20位地址,来寻址1M的物理地址空间。

     合成方式:段基址左移4位,然后加上偏移地址。但还不是一般的相加,由于相加前段基址已经左移4位,变成20位了(最低4位是0),而偏移还是16位,所以,其实是段基址和偏移的高12位相加,偏移的低4位不变。

           如:段基址左移4位后:            0x 8880:0

                 偏移地址(0x0440):     +  0x  044  0

                                                  ________________

                 外部总线20位地址:           0x88c4  0

        可看出,这个所谓段式内存管理,并不是纯粹的基址加偏移的方式,据说这是Intel当时欺骗了大家。以下是,我看到的一篇文章中的说法:

 

8086/8088的寻址问题
===============
  8088和80286都是16位CPU,Intel当初为什么会警告IBM和盖茨呢?到底发生了什么?
  要了解发生了什么,我们要看看处理器的内部,会看到巨大的差异。首先,你找一片8088CPU,把包装磨掉,磨到CPU硅片,放到显微镜下,你会看到8086/88的内部结构,它根本不是一个新的设计,而是两个并联运行的8085(8位)微处理器再多那么一点点。
  每个8085有它自己的8位数据和16位寻址能力。结合2个8位数据寄存器假装16位寄存器很容易。事实上这没有任何新东西,RCA COSMAC微处理器就使用16个8位寄存器,可作为内部的8位或16位寄存器使用,你可以有多达16个8位寄存器或8个16位寄存器或两者的任何组合。现在,一个中国的普通IC厂都可以轻易设计的出来。
  可能由于受当时生产工艺所限,8088只能有40个脚,intel的设计“精英”左思右想,确定了20条地址线(1M的寻址空间),而且16条数据线还要和20条地址线中的16条复用(分时复用,即一会是地址线,一会是数据线,对此要想了解,可看8088芯片手册的时序部分,也可看8052单片机书籍,它的地址线和数据线也是复用的)。
  
  到了问题的实质了,8088内的两个8085各有一套16位寻址寄存器,如何让他们寻址20位的1M地址呢?其实把他们并在一起形成32位寻址很简单,如果是那样后来的很多麻烦可能就都没有了(如A20门),但当时那些“精英”可能认为32位寻址(4G地址空间)那是扯淡,估计地球消失了也用不到那么多的内存吧?再说了老板逼的又紧,于是他们采用了在一个硬件上使用两个8085非常好实现的方法--分段:
  他们把1024K地址空间分成16字节的段,共64K个段,用一个8085的16位寻址寄存器作地址偏移寄存器(故段的长度是64K),而另一个8085的16位寻址寄存器作16字节段的段地址寄存器,注意,他保存的不是16字节段的地址,而是16字节段的序号(0,1,...65535)。
      这样做的好处是:只要在两8085CPU之间加一个移位器和一个20位的加法器,就可以完成20位的地址寻址--一个8085的地址寄存器(段地址--就是16字节段的序号)左移4位(*16 = 16字节小段的首地址),加上另一个8085的地址寄存器就可以啦,哈哈!可以向老板交差了,制作成本低,设计速度快,有钱不抢是孙子!至于以后,。。。。

如何使用Quartus II 13进行该模型机的设计请讲述详细步骤 本次习拟通过机器指令现求数组M中能被4整除的数的,并将结果存入到N地址单元功能(如数组数据求),通过分析,本次设计需要现一个16位的模型机,包括LOAD 指令(加载指令),STORE 指令(存储指令),CMP 指令(比较指令),ADD 指令(加法指令,JMP/JZ 指令(跳指令指令,可现直接寻址寻址方式,控制器采用微程序控制器控制器。 2.开发工具选择 开发平台: Quartus II 13.0 硬件描述语言: Verilog HDL 3.指令系统的设计 1)指令格式 Op:5位 寻址方式:2位 内存地址:9位 2)指令操作码 操作码 指令助记符 功能描述 00001 LOAD 将内存内容加载到寄存器 00010 STORE 将寄存器内容存储到内存 00011 MOV 寄存器间数据传送 00100 LOADI 将立即数加载到寄存器 00101 JMPI 无条件跳 00110 BEQI 相等则跳 00111 INC 寄存器内容加 1 01000 DEC 寄存器内容减 1 01001 ADD 寄存器加法 01010 SUB 寄存器减法 01011 AND 寄存器逻辑与 01100 OR 寄存器逻辑或 01101 XOR 寄存器逻辑异或 01110 NOT 寄存器逻辑非 01111 CMP 寄存器比较(设置标志位) 10000 SHL 逻辑左移 10001 SHR 逻辑右移 10010 SAR 算术右移 10011 JMPR 寄存器间接跳 10100 BNEI 不相等则跳 10101 BGTI 大于则跳 10110 BLTI 小于则跳 10111 HALT 停机指令 三、寻址方式设计 补充完整的寻址方式如下: 寻址寻址方式 功能描述 示例指令 00 直接寻址 地址字直接表示内存地址 LOAD R1, [100] 01 立即寻址 地址字表示立即数 LOADI R1, #100 10 寄存器间接寻址 寄存器内容作为内存地址 LOAD R1, [R2] 11 变址寻址 基址寄存器 + 偏移量 LOAD R1, [R2+5]
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值