彙編學習筆記:CPU內部組成,寄存器講解

==============CPU內部組成,寄存器講解===========================
一個典型的CPU由控制器、運算器、寄存器等器件構成,這些器件通過【內部總線】相連!


運算器進行信息處理、
寄存器進行信息存儲、
控制器控制各種器件進行工作。


8086CPU的寄存器都是16位的,可以存放兩個字節。


字在寄存器中的存儲:
字節 Byte:一個字節由8個Bit組成,可以存在8位寄存器中。
字 Word:一個字由兩個字節組成,這兩個字節分別稱爲這個字的高八位和低八位。
eg: 01101101   11000110
   -高位字節- -低位字節-




一個16位寄存器所能存儲的數據最大值是多少?(這裏求的是最大值,不是能存儲的個數!)
解答:因爲最小值是0,最大值是2^16-1=65535,可以表示的總數據有2^16=65536個(0-65535)
疑惑:16位寄存器不是能存儲2byte數據嗎?那這裏怎麼是65535呢?
解惑:一個16位寄存器可以存儲一個16位二進制的數據,8位二進制是1個字節,16位也就是2個字節,但這16位二進制數可以表示很多不同的數值,
比如說0000000000000000和0000000000000001同樣是16位,但表示的數值是不一樣的!
那麼怎麼計算這個16位數據所能表示的最大值呢?根據這個公式就可以計算了:N位二進制數所能表示的最大數值爲(2^N)-1


幾條簡單的彙編指令(彙編指令是控制CPU的):


彙編指令      控制CPU完成的操作      高級語言的描述方法
mov ax,18     將18送入寄存器ax        ax=18;
mov ah,78     將78送入寄存器ah        ah=18;
add ax,8      將ax寄存器的數值加上8   ax=ax+8;
mov ax,bx     將bx中的數據送入ax      ax=bx;
add ax,bx     將ax和bx中的數值相加,結果存在ax中      ax=ax+bx;
這裏需要注意的是進行數據傳送或運算時,要注意指令的兩個操作對象的位數應當是一致的。


物理地址:
CPU要訪問內存單元,就要給出內存單元的物理地址。
CPU通過地址總線送入存儲器的必須是一個內存單元的物理地址,CPU在向地址總線發出物理地址之前,必須要在內部生成這個物理地址,不同的CPU有着不同的形成物理地址的方式,現在討論一下8086CPU如何在內部形成內存單元物理地址的。


16位結構的CPU:
運算器一次可以最多處理16位的數據;
寄存器的最大寬度爲16位;
寄存器與運算器之間的通路是16位的;


8086是16位結構的CPU,也就是說在8086內部能一次性處理、傳輸、暫時存儲的信息長度是16位的。(注意這裏講的是CPU內部)
8086有20位地址總線,尋址能力是2^20=1MB,但是8086內部又是16位的,只能一次性處理、傳輸、暫時存儲16位的信息長度,尋址能力只有64kb。
爲了解決這個衝突,8086CPU採用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
具體做法是:
地址加法器採用 物理地址=段地址x16+偏移地址 的方法合成物理地址;


段地址x16,其實就是數據左移4位(二進制位);
一個數據的二進制形式左移N位,相當於該數據乘以2的N次方;一個X進制的數據左移1位,相當於乘以X;


☆問題一:給定段地址0001H,僅通過變化偏移地址尋址,CPU的尋址範圍爲___到___;
解答:首先明白,物理地址=SAx16+EA,現在SA=0001H,EA的變化範圍是0H~FFFFH,所以尋址範圍爲0001Hx16+0H(0010H) ~ 0001Hx16+FFFFH(1000FH);


☆問題二:數據放在內存20000H單元中,現給定段地址SA,若想用偏移地址尋到此單元,則SA應滿足的條件是:最小爲___,最大爲___
已知:物理地址爲20000H,16=0010H=10H,求SA的公式爲:SA=(20000H-EA)/10H;
當EA取最大值時,SA可取最小值。即20000H - FFFFH = 10001H;
但10001H不是10H的倍數,所以,偏移地址只能取到FFF0H時才能是段地址x16的爲10H的倍數;
所以求得SA=(20000H-FFF0H)/10H=1001H;
當EA取最小值時,SA可取最大值。即20000H - 0000H = 20000H / 10H = 2000H;
所以,SA應滿足的條件是:最小爲1001H,最大爲2000H;


8086CPU提供4個【段寄存器】,CS、DS、SS、ES;段寄存器負責提供內存單元的地址。
CS(代碼段寄存器)跟IP(指令指針寄存器)


在8086PC機中,任意時刻,設CS中的內容爲M,IP中的內容爲N,8086CPU將從內存 MX16+N 單元開始,讀取一條指令並執行;
具體的工作流程請看書中插圖。P26.


【小的分析總結】
編程!到底是在做什麼???


計算機的基本組成:運算器,控制器,存儲器,輸入輸出設備。
軟件:就是計算機數據跟指令的集合!【必須明白】
CPU:解釋計算機指令以及處理計算機軟件中的數據。
進一步說明,編寫程序,就是讓CPU去執行我們寫的一段實現某個功能的代碼[數據跟指令]。


彙編語言是面向機器的程序設計語言。


存儲器,被劃分爲若干個存儲單元,每個存儲單元能存儲一個字節(byte),等於8位(bit)。
字節是計算機存儲容量的基本單位。能存多大呢?
能存8bit,8bit能表示多少個數呢?2^8=256個數。00000000 - 11111111 FF




段寄存器與通用寄存器的區別:
段寄存器 - 一般用來存儲地址信息,這些地址信息一般都指向一段代碼
通用寄存器 - 一般用來存儲臨時數據


這僅僅是從編程角度看來,在內存角度看,沒有任何區別,都是二進制數據
網友詳細解答:
寄存器集成在cpu中,是cpu能夠直接訪問的存儲設備吧。其容量極小,但是訪問速度是最快的。
當cpu執行指令的時候,它根據代碼寄存器和IP往內存中找到相關的機器碼來執行指令,
代碼段寄存器CS存放的是代碼段的基址,ip存放的是偏移,它指向當前執行代碼的偏移地址。當執行一條指令後,它會加一。
寄存器由於容量小,不可能存放什麼變量什麼的,它一般就存放一些地址作爲索引,cpu執行指令的時候根據它的地址去內存找相關內容來完成當前的執行。包括變量的內容什麼的。
至於通用寄存器ax之類,通常就用來暫存中間的結果,比如從內存取出的變量,先用一寄存器保存,然後執行指令,這樣寄存器的內容會發生變化(指令是直接作用於寄存器對象的),
然後把它的內容可以傳給內存保存下來。ax,bx,cx,dx在一般情況下可以通用,只是要注意它們的特殊用法,
比如在loop指令的時候默認的就是操作cx,還有bx是唯一能夠當指針寄存器來用的通用寄存器,ax一般用於dos功能調用等等。其他場合你可以隨便用哪個啊。


修改CS跟IP中的內容,可用“jmp 段地址:偏移地址”的指令完成,如:
jmp 2AE3:3,執行後,CS=2AE3H,IP=0003H,CPU將從2AE33處讀取指令。
若只想修改IP中的內容,可用“jmp 某一合法寄存器”的指令完成,如:
jmp ax,執行指令前:ax=1000H,CS=2000H,IP=0003H;
        執行指令後:ax=1000H,CS=2000H,IP=1000H;
“jmp 某一合法寄存器”指令完成的功能是:用寄存器中的值修改IP;


檢測點:下面的3條指令執行後,CPU幾次修改IP?都是在什麼時候?最後IP中的值是多少? 
mov ax,bx 
sub ax,ax 
jmp ax 


解答:
讀入mov ax,bx指令到指令緩衝器 IP進行第一次修改 執行mov ax,bx   
讀入sub ax,ax指令到指令緩衝器 IP進行第二次修改 執行sub ax,ax   
讀取jmp ax   指令到指令緩衝器 IP進行第三次修改 執行jmp ax   IP進行第四次修改


Debug調試指令:
R命令查看、修改CPU寄存器中的內容;
  查看-R,修改-R[寄存器代號]
D命令查看內存中的內容;
  查看-D,查看具體地址中的信息-D 段地址:偏移地址,查看一個範圍-D 段地址:偏移地址 結尾偏移地址
E命令修改內存中的內容;
  批量修改-E 起始地址 數據 數據 數據 數據 數據 數據 數據 數據
  單個修改-E 起始地址 [回車]
  寫入字符串-E 1000:0 1 'a' 2 'b' 3 'c' 4 'd' 5 'e'
U命令將內存中的機器指令翻譯成彙編指令;
  -U 1000:0
T命令執行一條機器指令;


A命令以彙編指令的格式在內存中寫入一條機器指令;

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章