最近在讀王爽版的《匯編語言》,把需要記錄的內(nèi)容記錄在這里。
第一章 基礎(chǔ)知識(shí)
- 編譯器:將匯編指令轉(zhuǎn)換成機(jī)器指令的翻譯程序。
- 一個(gè)CPU可以引出3種總線的寬度標(biāo)志了這個(gè)CPU的不同方面的性能:
- 地址總線的寬度決定了CPU的尋址能力;
- 數(shù)據(jù)總線的寬度決定了CPU與其他器件進(jìn)行數(shù)據(jù)傳送時(shí)的一次數(shù)據(jù)傳送量;
- 控制總線的寬度決定了CPU對(duì)系統(tǒng)中的其他器件的控制能力。
- CPU對(duì)外部設(shè)備不能直接控制,直接控制這些設(shè)備進(jìn)行工作的是插在擴(kuò)展插槽上的接口卡。CPU通過總線向接口卡發(fā)送命令,接口卡根據(jù)CPU的命令控制外設(shè)進(jìn)行工作。
-
存儲(chǔ)器分為兩類:隨機(jī)存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM)。
隨機(jī)存儲(chǔ)器可讀可寫,但是必須帶電存儲(chǔ),關(guān)機(jī)后存儲(chǔ)的內(nèi)容丟失;
只讀存儲(chǔ)器只能讀取不能寫入,關(guān)機(jī)后其中的內(nèi)容不丟失。
第二章 寄存器
- 8086cpu所有寄存器都是16位的。
- 進(jìn)行數(shù)據(jù)傳送或運(yùn)算時(shí),指令的兩個(gè)操作對(duì)象的位數(shù)應(yīng)該是一致的。
- 地址加法器將兩個(gè)16位的段地址和偏移地址合成一個(gè)20位的物理地址,物理地址=段地址16+偏移地址*。
- 段寄存器:CS、DS、SS、ES。
- CS為代碼段寄存器,IP為指令指針寄存器。8086機(jī)中,任意時(shí)刻,CPU將CS:IP指向的內(nèi)容當(dāng)作指令執(zhí)行。讀取一條指令后,IP中的值自動(dòng)增加,以使CPU可以讀取下一條指令。
- 在8086CPU加電啟動(dòng)或復(fù)位后(即CPU剛開始工作時(shí))CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機(jī)剛啟動(dòng)時(shí),CPU從內(nèi)存FFFF0H單元中讀取指令執(zhí)行,F(xiàn)FFF0H單元中的指令是8086PC機(jī)開機(jī)后執(zhí)行的第一條指令。
- 修改CS:IP,使用jmp 段地址:偏移地址;修改IP,使用某一合法寄存器
第三章 寄存器(內(nèi)存訪問)
- 字單元:存放一個(gè)字型數(shù)據(jù)(16位)的內(nèi)存單元,起始地址為N的字單元簡(jiǎn)稱為N地址字單元。
- DS寄存器通常用來存放要訪問的數(shù)據(jù)的段地址。
mov bx, 1000H
mov ds, bx
mov al, [0] ;將10000H(1000:0)中的數(shù)據(jù)讀到al中
- 8086CPU不支持將數(shù)據(jù)直接送入段寄存器,需要寄存器進(jìn)行中轉(zhuǎn)。
- 段寄存器SS和寄存器SP,棧頂?shù)亩蔚刂反娣旁赟S中,偏移地址存放在SP中。任何時(shí)刻,SS:SP指向棧頂元素。
- 8086CPU中,入棧時(shí),棧頂從高地址向低地址方向增長(zhǎng)。
- 棧空,SS:SP指向棧空間最高地址單元的下一個(gè)單元。
- push ax的時(shí)候,CPU先將SP=SP-2,使得SS:SP指向新的棧頂單元,然后再將寄存器中的數(shù)據(jù)送入SS:SP指向的內(nèi)存單元處;pop ax是先讀取SS:SP處的數(shù)據(jù),后改變SP=SP+2。
- 如果使用10000H~1FFFFH這段空間當(dāng)作棧段,初始狀態(tài)是空的,此時(shí)SS=1000H,SP=0。
因?yàn)楫?dāng)棧中只有一個(gè)元素的時(shí)候SS=1000H,SP=FFFEH(2的倍數(shù),8086CPU的入棧和出棧操作都是以字為單位進(jìn)行的),唯一一個(gè)元素出棧后,SP=SP+2,SP=0。 - 一個(gè)堆棧最大為64KB,因?yàn)镾P的范圍是0~FFFFH,從棧空時(shí)候SP=0,再到棧滿SP=0。