linux源码阅读笔记 jmpi指令(转)
jmpi是段間跳轉(zhuǎn)指令,用于x86實(shí)模式下,
如:BOOTSEG = 0x0c70
jmpi 4, #BOOTSEG
假如當(dāng)前段CS==00h,那么執(zhí)行此指令后將跳轉(zhuǎn)到段CS==0x0c70,當(dāng)然段cs的值也變?yōu)?x0c70,接下來(lái)將執(zhí)行指令0x0c70:0004處的指令。
實(shí)模式下尋址是為了兼容8086處理器,8086是16位CPU(是ALU的數(shù)據(jù)寬度),20位地址總線可尋址1M內(nèi)存空間。其尋址方式:段基址+偏移 的方式,段基址保存在CS、DS、ES等段寄存器內(nèi),相當(dāng)于尋址的高16位,而偏移是內(nèi)部16位總線提供,在送往外部地址總線時(shí),段基址和偏移合成20位地址,來(lái)尋址1M的物理地址空間。
合成方式:段基址左移4位,然后加上偏移地址。但還不是一般的相加,由于相加前段基址已經(jīng)左移4位,變成20位了(最低4位是0),而偏移還是16位,所以,其實(shí)是段基址和偏移的高12位相加,偏移的低4位不變。
如:段基址左移4位后: 0x 8880:0
偏移地址(0x0440):+0x 044 0
________________
外部總線20位地址:0x88c4 0
可看出,這個(gè)所謂段式內(nèi)存管理,并不是純粹的基址加偏移的方式,據(jù)說(shuō)這是Intel當(dāng)時(shí)欺騙了大家。以下是,我看到的一篇文章中的說(shuō)法:
8086/8088的尋址問(wèn)題
===============
8088和80286都是16位CPU,Intel當(dāng)初為什么會(huì)警告IBM和蓋茨呢?到底發(fā)生了什么?
要了解發(fā)生了什么,我們要看看處理器的內(nèi)部,會(huì)看到巨大的差異。首先,你找一片8088CPU,把包裝磨掉,磨到CPU硅片,放到顯微鏡下,你會(huì)看到8086/88的內(nèi)部結(jié)構(gòu),它根本不是一個(gè)新的設(shè)計(jì),而是兩個(gè)并聯(lián)運(yùn)行的8085(8位)微處理器再多那么一點(diǎn)點(diǎn)。
每個(gè)8085有它自己的8位數(shù)據(jù)和16位尋址能力。結(jié)合2個(gè)8位數(shù)據(jù)寄存器假裝16位寄存器很容易。事實(shí)上這沒(méi)有任何新東西,RCACOSMAC微處理器就使用16個(gè)8位寄存器,可作為內(nèi)部的8位或16位寄存器使用,你可以有多達(dá)16個(gè)8位寄存器或8個(gè)16位寄存器或兩者的任何組合。現(xiàn)在,一個(gè)中國(guó)的普通IC廠都可以輕易設(shè)計(jì)的出來(lái)。
可能由于受當(dāng)時(shí)生產(chǎn)工藝所限,8088只能有40個(gè)腳,intel的設(shè)計(jì)“精英”左思右想,確定了20條地址線(1M的尋址空間),而且16條數(shù)據(jù)線還要和20條地址線中的16條復(fù)用(分時(shí)復(fù)用,即一會(huì)是地址線,一會(huì)是數(shù)據(jù)線,對(duì)此要想了解,可看8088芯片手冊(cè)的時(shí)序部分,也可看8052單片機(jī)書籍,它的地址線和數(shù)據(jù)線也是復(fù)用的)。
到了問(wèn)題的實(shí)質(zhì)了,8088內(nèi)的兩個(gè)8085各有一套16位尋址寄存器,如何讓他們尋址20位的1M地址呢?其實(shí)把他們并在一起形成32位尋址很簡(jiǎn)單,如果是那樣后來(lái)的很多麻煩可能就都沒(méi)有了(如A20門),但當(dāng)時(shí)那些“精英”可能認(rèn)為32位尋址(4G地址空間)那是扯淡,估計(jì)地球消失了也用不到那么多的內(nèi)存吧?再說(shuō)了老板逼的又緊,于是他們采用了在一個(gè)硬件上使用兩個(gè)8085非常好實(shí)現(xiàn)的方法--分段:
他們把1024K地址空間分成16字節(jié)的段,共64K個(gè)段,用一個(gè)8085的16位尋址寄存器作地址偏移寄存器(故段的長(zhǎng)度是64K),而另一個(gè)8085的16位尋址寄存器作16字節(jié)段的段地址寄存器,注意,他保存的不是16字節(jié)段的地址,而是16字節(jié)段的序號(hào)(0,1,...65535)。
這樣做的好處是:只要在兩8085CPU之間加一個(gè)移位器和一個(gè)20位的加法器,就可以完成20位的地址尋址--一個(gè)8085的地址寄存器(段地址--就是16字節(jié)段的序號(hào))左移4位(*16 = 16字節(jié)小段的首地址),加上另一個(gè)8085的地址寄存器就可以啦,哈哈!可以向老板交差了,制作成本低,設(shè)計(jì)速度快,有錢不搶是孫子!至于以后,。。。。
總結(jié)
以上是生活随笔為你收集整理的linux源码阅读笔记 jmpi指令(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (四)RabbitMQ消息队列-服务详细
- 下一篇: 给pdf文件加水印(aspose)