加班再晚裸违,該看的匯編還是得看完借帘。if you're struggling,that means you're progressing.看書時不寫廢話
一個典型的CUP是由運算器惜互、控制器布讹、寄存器等器件構(gòu)成,這些器件靠內(nèi)部總線相連训堆。在CUP中:
- 運算器進行信息處理描验;
- 寄存器進行信息存儲;
- 控制器控制各個器件進行工作坑鱼;
- 內(nèi)部總線連接各種器件膘流,在它們之間進行數(shù)據(jù)的傳送。
8086CPU共有14個寄存器鲁沥,分別是AX呼股、BX、CX黍析、DX卖怜、SI、DI阐枣、SP马靠、BP、IP蔼两、CS甩鳄、SS、DS额划、ES妙啃、PSW。程序員通過改變各種寄存器中的內(nèi)容來實現(xiàn)對CPU的控制俊戳。
通用寄存器(AX揖赴、BX、CX抑胎、DX)
8086CPU的所有寄存器都是16位的燥滑,和數(shù)據(jù)總線一樣同為16位,可以存放兩個字節(jié)AX阿逃、BX铭拧、CX赃蛛、DX用于存放一般的數(shù)據(jù),被稱為通用寄存器搀菩。一個寄存器能存儲的最大值為1111111111111111(二進制)呕臂,65535(十進制)。
每個寄存器都能分為兩個獨立使用的8位寄存器來使用肪跋,例如AX可分為AH和AL歧蒋。
字在寄存器中的存儲
8086CPU可以一次性處理以下兩種尺寸的數(shù)據(jù)。1澎嚣、字節(jié)(byte)疏尿,一個字節(jié)由8個bit組成;2、字(word)易桃,一個字由兩個字節(jié)組成褥琐。
這里說下數(shù)制,通常我們使用十六進制來表示一個數(shù)據(jù)晤郑,因為4位二進制數(shù)代表一位16進制數(shù)敌呈,這樣看起問題來更為直觀。比如二進制0100111000100000可表示為4(0100)造寝、E(1110)磕洪、2(0010)、0(0000)十六進制數(shù)诫龙,如果這個數(shù)據(jù)在AX中析显,那么AH為4E、AL為20
幾條匯編指令
匯編指令 | 控制CPU完成操作 | 用高級語言的語法描述 |
---|---|---|
mov ax,18 | 將18送入寄存器AX | AX=18 |
mov ah,78 | 將78送入寄存器AH | AH=78 |
add ax,8 | 將寄存器AX中的數(shù)值加上8 | AX=AX+8 |
mov ax,bx | 將寄存器BX中的數(shù)據(jù)送入寄存器AX | AX=BX |
add ax,bx | 將AX和BX中的數(shù)值相加 | AX=AX+BX |
注意:
1签赃、當(dāng)ax = 8226;bx = 8226執(zhí)行指令add ax,bx把bx的數(shù)據(jù)加入ax谷异。ax = 8226 + 8226 = 1044C,但是ax為16為寄存器锦聊,只能存放4位十六進制數(shù)據(jù)所以ax的數(shù)據(jù)位944C歹嘹。如果使用的是ah、al8位寄存器孔庭,和十六位也是同理尺上。
2、在使用匯編進行數(shù)據(jù)傳送或運算時圆到,注意指令的兩個操作對象的位數(shù)應(yīng)當(dāng)是一致的怎抛。比如8位寄存器應(yīng)該和8位寄存器或者8位寄存器最大值255的數(shù)據(jù)進行運算;16位寄存器應(yīng)該和16位寄存器或者16位寄存器最大值65535的數(shù)據(jù)進行計算芽淡。
物理地址
每一個內(nèi)存單元在存儲空間中都有唯一的地址抽诉,我們將這個地址稱為物理地址。在CPU向地址總線上發(fā)出物理地址之前吐绵,必須在內(nèi)部形成這個物理地址迹淌。
16位結(jié)構(gòu)的CPU
8086的CPU為16位結(jié)構(gòu)的CPU,特征如下:
- 運算器一次最多可以處理16位數(shù)據(jù)
- 寄存器的最大寬度為16位(如AX)
- 寄存器和運算器之間的通路為16位(數(shù)據(jù)總線16位)
8086CPU給處物理地址的方法
8086有20位地址總線己单,也就是達到2^20*8bit(每個內(nèi)存單元的大小)=1MB的尋址能力唉窃。但是8086又是16位結(jié)構(gòu)在內(nèi)部一次性處理、傳輸纹笼、暫時存儲的地址位16位地址纹份,也就是只達到64KB的殉職能力。
8086CPU采用了地址加法器將2個16位地址合成為一個20位物理地址廷痘。
地址加法器采用物理地址=段地址×16+偏移地址的方法合成物理地址蔓涧。
打比方
從學(xué)校到圖書館的距離位2826米。
當(dāng)同學(xué)A用紙條告訴同學(xué)B距離時候笋额,可以在紙條上寫入2826元暴。但是如果紙條有兩張,但每張紙條只能寫三個數(shù)字的時候兄猩,可以在第一張紙條寫入200,第二張紙條寫入826,然后約定第一張紙條×10后與第二張紙條相加茉盏,200×10+826=2826米。
段地址×16
段地址×16有個更為常用的說話是二進制左移4位枢冤,用二進制舉例如下:
左移位數(shù) | 二進制 | 十六進制 | 十進制 |
---|---|---|---|
0 | 10 | 2 | 2 |
1 | 100 | 4 | 4 |
2 | 1000 | 8 | 8 |
3 | 10000 | 10 | 16 |
4 | 100000 | 20 | 32 |
故地址加法器的工作過程如下圖所示:
段的概念
CPU使用將內(nèi)存分段的方式來管理內(nèi)存鸠姨。例如:10000~100FF內(nèi)存單元組成一個段,該段的段地址為1000H(根據(jù)公式段地址左移4位與偏移地址相加得到的物理地址)大小為100H(0~FF淹真,為FF+1=100)
因為數(shù)據(jù)可以通過不同的段地址和偏移地址指向同一物理地址(段地址2000H讶迁,偏移地址1F60H 或者 段地址2100H,偏移地址0F60H)核蘸,故在描述中可以寫為:
- 數(shù)據(jù)存在內(nèi)存2000:1F60單元中巍糯。
- 數(shù)據(jù)存在內(nèi)存的2000H段中的1F60H單元中。
段寄存器(CS值纱、SS鳞贷、DS、ES)
如要訪問內(nèi)存時需要提供段地址和偏移地址虐唠。段地址在段寄存器中存放搀愧。8086CPU有4個寄存器(CS、SS疆偿、DS咱筛、ES)
CS和IP
CS和IP時8086CPU中最關(guān)鍵的寄存器,CS為代碼段寄存器杆故,IP為指令指針寄存器迅箩,在任意時刻,CPU將CS:IP(CS×16+IP)指向的內(nèi)容當(dāng)作指令執(zhí)行处铛。
運算時運行過程如下:
在8086CPU加電啟動或復(fù)位后饲趋,CS和IP被設(shè)置為CS=FFFFH, IP=0000H,即在開機啟動時拐揭,CPU從內(nèi)存FFFF0H單元中讀取第一條指令開始執(zhí)行。
如果說奕塑,內(nèi)存中的一段信息曾被CPU執(zhí)行過的話堂污,那么,它所在的內(nèi)存單元必然被CS:IP指向過龄砰。
修改CS盟猖、IP的指令
我們通常使用mov指令來修改通用寄存器的值,但是不能用該指令修改CS换棚、IP的值式镐。能夠改變CS、IP的內(nèi)容的指令統(tǒng)稱為轉(zhuǎn)移指令固蚤。
jmp指令
- jmp 2AE3:3娘汞,執(zhí)行后,CS=2AE3H颇蜡,IP=0003H价说,CPU將從2AE33H處讀取指令。
- 若只想修改IP的值风秤,可以“jump 某一合法寄存器”
jmp ax | AX | CS | IP |
---|---|---|---|
執(zhí)行前 | 1000H | 2000H | 0003H |
執(zhí)行后 | 1000H | 2000H | 1000H |
代碼段
將若干地址連續(xù)的內(nèi)存單元看作一個段鳖目,根據(jù)公式“物理地址=段地址×16+偏移地址”那么:
- 段的起始地址一定是16的倍數(shù)。
- 偏移地址為16位缤弦,16位地址的尋址能力為2^16=64KB领迈,所以一個段的最大長度為64KB。
將一段內(nèi)存當(dāng)作代碼段碍沐,僅是我們在編程時的一種安排狸捅,若要讓CPU執(zhí)行我們放在代碼段中的指令,必須將CS:IP指向我們定義代碼段的首地址累提。