<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ![](https://img.kancloud.cn/d2/0b/d20b6fe29fc4bb4fc27b3dc9cd4bbf70_984x527.png) 我們知道, CPU訪問內存單元時,要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱為物理地址。 16位結構(16位機、字長為16位等常見說法,與16位結構的含義相同)描述了一個CPU具有下面幾方面的結構特性。 * 運算器一次最多可以處理16位的數據 * 寄存器的最大寬度為16位: * 寄存器和運算器之間的通路為16位。 8086是16位結構的CPU,這也就是說,在8086內部,能夠一次性處理、傳輸、暫時存儲的信息的最大長度是16位的。內存單元的地址在送上地址總線之前,必須在CPU中處理、傳輸、暫時存放,對于16位CPU,能一次性處理、傳輸、暫時存儲16位的地址。 ![](https://img.kancloud.cn/5d/23/5d23bf16c5ce161c78be52ac265748dd_983x506.png) CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。在CPU向地址總線上發出物理地址之前,必須要在內部先形成這個物理地址。不同的CPU可以有不同的形成物理地址的方式。我們現在討論8086CPU是如何在內部形成內存單元的物理地址的。 8086CPU有20位地址總線,可以傳送20位地址,達到1MB尋址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時存儲的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那么它只能送出16位的地址,表現出的尋址能力只有64KB.8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。 ![](https://img.kancloud.cn/f9/48/f9484a08ca60aadb5417372bcc5ab537_979x652.png) | | | | | | | | --- | --- |--- | --- |--- |--- | | | 1 | 2 | 3 | 0 | | | | 0 | 0 | c | 8 | | | 16進制左移一位 | | | | | | | 1 | 2 | 3 | 0 | | | | | 0 | 0 | c | 8 | | 16進制左移一位相當于二進制左移4位 1230=~~000~~1001000110000 00c8=~~00000000~~11001000 | | | | | | | | --- | --- |--- | --- |--- |--- | | | 0001 | 0010 | 0011 | 0000 | | | | 0000 | 0000 | 1100 | 1000 | | | 二進制左移四位 | | | | | | | 0001 | 0010 | 0011 | 0000 | <span style="color:red">0000</span> | | | | ~~0000~~ | ~~0000~~ | 1100 | 1000 | | | 0001 | 0010 | 0011 | 1100 | 1000 | | 1 0010 0011 1100 1000=123c8 段地址就是基地址 二進制向左移4位就是乘以16(左移一位*2,左移2位*4,左移3位*8,左移4位*16) 下圖為2在其二進制(10B)下位移后的數值變化 ![](https://img.kancloud.cn/28/d3/28d3b7120d50b660726b5e898dc05e6e_620x352.png) 一個數據的m進制形式左移1位,相當于該數據乘以m 16進制的段地址\*16左移1位,概念和10進制某個數\*10左移一位一個道理 一個數據的二進制形式左移一位,相當于該數據乘以2 一個數據的二進制形式左移n位,相當于該數據乘以2^n 段地址*16必然是16的倍數,所以一個段的的起始地址也一定是16的倍數 偏移地址為16位,16位地址的尋址能力位64k,所以一個段的長度最大為2^16=64k cpu訪問內存單元時,必須向內存提供內存單元的物理地址 具象例子:比如說傳紙條,信息是2826,一張紙條只能容納3個數字,必須填滿紙條,一次可傳兩張: 在第一張紙上寫上200(段地址),在第二張紙上寫上826(偏移地址)。假設我們事前對,這種情況又有過相關的約定:你得到這兩張紙后,做這樣的運算: 200(段地址)x10+826(偏移地址-2826(物理地址)。8086CPU就是這樣一個只能提供兩張3位數據紙條的CPU. 8086cpu在內部用段地址和偏移地址移位相加的方法形成最終的物理地址 ![](https://img.kancloud.cn/36/8a/368aa71ce5d79ea287b3edb978a90518_772x529.png) ![](https://img.kancloud.cn/c2/84/c284f2f834906059f1bc46503955b29c_585x414.png) ![](https://img.kancloud.cn/d8/fd/d8fd3ce5b4dd7ce79400996dfb17acbc_602x414.png) ![](https://img.kancloud.cn/f5/80/f580d90ccfadfbf41ef89b6a6fab41be_591x425.png) ![](https://img.kancloud.cn/9f/bf/9fbfe0bf2cf715c6d38e8a919280e4eb_578x417.png) ### **8086合成物理地址的過程** 我們說8086CPU的上一代CPU(8080, 8085)等是8位機,而8086是16位機,也可以說8086是16位結構的CPU,那么什么是16位結構的CPU呢? 概括地講, 16位結構(16位機、字長為16位等常見說法,與16位結構的含義相同)描述了一個CPU具有下面幾方面的結構特性。運算器一次最多可以處理16位的數據;寄存器的最大寬度為16位;寄存器和運算器之間的通路為16位。 8086是16位結構的CPU,這也就是說,在8086內部,能夠一次性處理、傳輸、暫時存儲的信息的最大長度是16位的。內存單元的地址在送上地址總線之前,必須在CPU中處理、傳輸、暫時存放,對于16位CPU,能一次性處理、傳輸、暫時存儲16位的地址。 8086CPU有20位地址總線,可以傳送20位地址,達到1MB尋址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時存儲的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那么它只能送出16位的地址,表現出的尋址能h只有64KB. 解決辦法:8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。 ![](https://img.kancloud.cn/77/26/772625c7ac94aef00839ab2c3fa41f6e_975x519.png) 如圖所示,當8086CPU要讀寫內存時: (1) CPU中的相關部件提供兩個16位的地址,一個稱為段地址,另一個稱為偏移地址; (2)段地址和偏移地址通過內部總線送入一個稱為地址加法器的部件 (3)地址加法器將兩個16位地址合成為一個20位的物理地址; (4)地址加法器通過內部總線將20位物理地址送入輸入輸出控制電路; (5)輸入輸出控制電路將20位物理地址送上地址總線; (6) 20位物理地址被地址總線傳送到存儲器。 ![](https://img.kancloud.cn/aa/78/aa781ec4df5b6eb92a18545d4524c685_614x218.png) ![](https://img.kancloud.cn/13/ba/13baa20672c80c0db8fda14064b9eebc_293x194.png) ![](https://img.kancloud.cn/bf/c9/bfc90c2919688eb2d6781a8f26374d70_276x160.png) ![](https://img.kancloud.cn/0f/69/0f69c60370fd18decadd6117de59a4d7_927x548.png) cpu可以用不同的段地址和偏移地址形成同一個物理地址 ![](https://img.kancloud.cn/ab/6a/ab6a007da0c2729b41ed6bd60de4a31e_637x483.png) ![](https://img.kancloud.cn/15/cb/15cbc145cecb32c0ce955b5406c54d76_463x154.png) 如果給定一個段地址,僅通過變化偏移地址來尋址,最多可以定位多少內存單元? 偏移地址16位變化范圍為0~FFFFH(2^16-1),僅通過變化偏移地址來尋址,最多可以定位2^16=64k內存單元 比如給定段地址1000H,用偏移地址尋址,cpu的尋址范圍為10000H~1FFFFH 段地址*16:相當于16進制向左移1位即10000H,范圍就是(0+10000H,FFFFH+10000H) 1000轉換為十進制(4096)\*16+偏移地址范圍(2^16-1) 65536+65535=131071(轉換成16進制后為1ffff) (0+SA,FFFFH+SA)=20000H 在8086pc機中存儲單元的地址用兩個元素拉描述,即段地址和偏移地址 數據在21F60H內存單元中,對于8086pc機的描述: * 數據存在內存2000:1F60單元中 * 數據存在內存的2000段中的1F60H單元中 可更具需要將地址連續、起始地址為16的倍數的一組內存單元定義為1個段 例子: 有一數據存放在內存20000H單元中,現給定段地址為SA,若想要偏移地址尋到此單元,則SA滿足的條件是:最大?(2000H)最小?(1001H)提示,當段地址給定對少cpu無 論怎么變化偏移地址都無法尋到20000H單元 結果:當段地址給定為 1001H 以下和 2000H 以上,CPU無論怎么變化偏移地址都無法尋到20000H單元。 解題過程: 物理地址=SA\*16+EA 20000h=SA\*16+EA SA=(20000h-EA)/16=20000h/16-EA/16=2000h-EA/16 EA取最大值時,SA=2000h-ffffh/16=2000H-fffH=1001h,SA為最小值 EA取最小值時,SA=2000h-0h/16=2000h,SA為最大值 延伸:(不知道對不對) 例子: 有一數據存放在內存21F60H單元中,現給定段地址為SA,若想要偏移地址尋到此單元,則SA滿足的條件是:最大?最小? 解題過程: 物理地址=SA\*16+EA 21F60H=SA\*16+EA SA=(21F60h-EA)/16=21F60/16-EA/16=21F6h-EA/16 EA取最大值時,SA=21F60h-ffffh/16=21F6H-fffH=11F7H,SA(段地址)為最小值11F7H EA取最小值時,SA=21f6h-0h/16=21F6h,SA(段地址)為最大值21F6h 注意:可分段的必須是16的整數,如: 21f00 ... 21f70 21f80 21f90 可知一個物理地址的段地址取值范圍是(舍去右邊一位的xxxxx~舍去右邊一位的xxxxx-fff)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看