基礎(chǔ)知識
匯編語言,有 3 類指令組成:
- 匯編指令:機(jī)器碼的助記符,有對應(yīng)的機(jī)器碼显沈。
- 偽指令:沒有對應(yīng)機(jī)器碼隘截,由編譯器執(zhí)行,計算機(jī)并不執(zhí)行。
- 其他符號:如+、-、*浪慌、\,由編譯器識別朴则,沒有對應(yīng)機(jī)器碼权纤。
核心是編譯指令。每一種 cpu 都有自己的匯編指令集乌妒。
存儲器就是內(nèi)存汹想,存儲器被劃分為多個存儲單元,從 0 開始順序編號撤蚊,一個存儲單元就是一個字節(jié)(Byte)古掏。存儲器中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息侦啸。
cpu 有 3 類總線:地址總線槽唾、數(shù)據(jù)總線丧枪、控制總線。
一個 cpu 有 n 根地址總線庞萍,則可以尋找 2 的 n 次方個內(nèi)存單元拧烦。
n 根數(shù)據(jù)總線一次能傳輸 n 位,即 n bit钝计。
控制總線是一些不同控制線的集合恋博,有多少根控制總線,就意味著 cpu 提供了對外部器件的多少種控制私恬。
內(nèi)存地址空間:對 cpu 來說债沮,系統(tǒng)中的所有存儲器中的存儲單元都處于一個統(tǒng)一的邏輯存儲器中,它的容量受 cpu 尋址能力的限制践付。這個邏輯存儲器即是所說的內(nèi)存地址空間秦士。
寄存器
一個典型的 cpu 由運(yùn)算器缺厉、控制器永高、寄存器
等器件構(gòu)成,這些器件靠內(nèi)部總線相連提针。前一章說的總線命爬,相對于 cpu 內(nèi)部來說是外部總線。
不同 cpu辐脖,寄存器的個數(shù)饲宛、結(jié)構(gòu)都不同。
通用寄存器
8086cpu 所有寄存器都是 16 位嗜价。AX艇抠、BX、CX久锥、DX 這 4 個寄存器通常用來存放一般性數(shù)據(jù)家淤,被稱為通用寄存器。都可分為類似 AH 和 AL瑟由,BH 和 BL...
由于 8086 有 20 位地址總線絮重,但 8086 是 16 位的,即在內(nèi)部一次性處理歹苦、傳輸青伤、暫時存儲的地址只有 16 位,所以 8086 采用在內(nèi)部用 2 個 16 位地址合成的方法來形成一個 20 位的物理地址殴瘦。
地址加法器采用 物理地址=段地址x16+偏移地址
來合成物理地址狠角。(也即左移 4 位,也即 x10H)蚪腋。本質(zhì)就是基礎(chǔ)地址+偏移地址=物理地址
擎厢。
cpu 可以用不同的段地址和偏移地址形成同一個物理地址究流。
段寄存器
段地址存放在段寄存器中,8086 有 4 個段寄存器:CS动遭、DS芬探、SS、ES
CS 和 IP 是 8086 中兩個最關(guān)鍵的寄存器厘惦,它們共同表示了 cpu 當(dāng)前要讀取指令的地址偷仿。CS 為代碼段寄存器,IP 為指令指針寄存器宵蕉。
問:cpu 根據(jù)什么將內(nèi)存中的信息看做是指令酝静?
答:cpu 將 CS:IP 指向的內(nèi)存單元中的內(nèi)容看做是指令。
在 cpu 中羡玛,程序員能用指令讀寫的部件只有寄存器别智。8086 大部分寄存器的值,都可以用mov
來修改稼稿,mov
稱為傳送指令薄榛。但不能用來設(shè)置 CS、IP 的值让歼。
若想修改 CS敞恋、IP,可以用jmp
指令谋右,形如jmp 段地址:偏移地址
硬猫。
若僅想修改 IP 的內(nèi)容,可用形如jmp 某一合法寄存器
改执,如jmp ax
啸蜜,可修改 IP 為 ax 中的值。
mov可以操作的有:寄存器和寄存器辈挂,立即數(shù)到寄存器衬横,寄存器和段寄存器,寄存器和內(nèi)存單元呢岗,段寄存器和內(nèi)存單元
代碼段
我們可以根據(jù)需要冕香,將一組內(nèi)存單元定義為一個段。我們可以將長度為 N(N<=64KB后豫,因是 16 位)的一組代碼悉尾,存在一組地址連續(xù)、起始地址為 16 的倍數(shù)的內(nèi)存單元中挫酿,從而定義了一個代碼段构眯。那么代碼段是如何被執(zhí)行呢?只要將 CS:IP 指向代碼段中第一條指令的首地址早龟。