當我們看了暫存器的詳解後,及了解算術中的變數,下面我們來看一下,在8086cpu中一些計算法則規則的講解。
先來看一下記憶體中字的儲存、傳送。
字儲存
cpu中,用16位暫存器來儲存乙個字。高8位存放高位位元組,低8位存放低位位元組。由於記憶體單元是以位元組單位,則乙個字需要兩個連續的記憶體單元來存放。字的高低位於記憶體單元高低位址單元對應。先前以了解到8086cpu中記憶體位址有段位址和偏移位址組成,cpu在讀取內容時通過記憶體單元訪問內容,所以8086cpu中有乙個ds暫存器,通常用來儲存要訪問的資料段位址。
例如:mov bx, 1000h mov ds,bx mov al,[0]
上例中mov 指令的作用為暫存器和記憶體之間進行位元組型資料的傳送,「[...]」表示乙個記憶體單元,"[...]"中的0表示記憶體單元的偏移位址。當讀取內容時cpu將自動取ds中的資料為記憶體單元的段位址。
我們知道8086cpu不支援將資料直接送入段暫存器,例如:mov ds,1000h。因此我們需要使用普通暫存器進行中轉,以達到對ds的負責。
由於8086cpu是16位結構,有16根資料線,所以,可以一次性傳送16位的資料,也就是說可以一次性傳送1個字。只要在mov 指令中給出16位的暫存器就可以進行16位資料的傳送。
指令集
mov
暫存器,資料 例如:mov ax,1000h
mov 暫存器,暫存器 例如:mov ax,bx
mov 暫存器,記憶體單元 例如:mov ax,[0]
mov 記憶體單元,暫存器 例如:mov [0],ax 從暫存器向記憶體單元傳送資料
mov 段暫存器,暫存器 例如:mov ds,ax 從暫存器向段暫存器傳送資料
資料段
此處的資料段與前面講解的**段意思相近,解釋為將一組長度為n(n≤64kb)、位址連續、起始位址位16的倍數的記憶體單元當作專門儲存資料的記憶體空間。
棧段
先來說一下棧,是一種特殊的訪問方式的儲存空間,特殊於遵從資料先進後出。8086cpu提供入棧和出棧指令,最基本的兩個是push(入棧)和pop(出棧)。例如:push ax表示將暫存器ax中的資料送入棧中,pop ax表示從棧頂取出資料送入ax,操作單位為位元組。
資料、**有ds、cs、ip三個暫存器,而棧段有ss、sp暫存器,任意時刻,ss:sp指向棧頂元素。push和pop指令執行時,cpu從ss和sp中得到棧頂的位址。
push命令:執行時將暫存器中的內容放入當前棧頂單元的上方,成為新的棧頂元素。操作步驟:①sp=sp-2②將ax中的內容送入ss:sp指向的單元處,ss:sp此時指向新棧頂。
pop命令:執行時從棧頂單元中取出資料,送入暫存器中。操作步驟:①將ss:sp指向的記憶體單元處的資料送入ax中,②sp=sp+2,ss:sp指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。
push和pop指令的格式可以是如下形式:
push 暫存器/段暫存器/記憶體單元
pop 暫存器/段暫存器/記憶體單元
注意
由於棧容量為16位,在執行push指令後,棧頂超出棧空間是常見的情況。當然棧在沒有資料的情況下,執行pop指令出棧,也會出項同樣的事兒。所以在程式設計時要注意操作是否會超界。
在大多數情況下,棧將作為臨時存放資料的首選。
**段、資料段、棧段區別
不同之處:①資料段存放的是資料,使用ds:ip讀取②**段存放的是**,使用cs:ip讀取③棧段使用ss:sp讀取
發現說的有一點多了,希望通過這些講解,使我們對簡單指令相關的概念與用法有乙個基礎性的了解。
多說無用,做才是王道。
彙編之建立堆疊
定義出所有處理器模式的值,為後面切換處理器做準備 cpu user mode equ 0x10 cpu fiq mode equ 0x11 cpu irq mode equ 0x12 cpu svc mode equ 0x13 cpu abt mode equ 0x17 cpu und mode e...
彙編之函式 堆疊傳參
函式就是一系列指令的集合,為了完成某個會重複使用的特定功能。比如 mov eax,1 mov ecx,1 就相當於乙個函式 指令的集合 1 使用jmp來執行函式 2 使用call來執行函式 以四條指令向普通暫存器儲存值為例 call執行前 call執行後 f8 可以看到call指令把當前指令的下一條...
組合語言資料傳送指令之堆疊操作指令
處理器通常用硬體支援堆疊 stack 資料結構,它是乙個按 先進後出 first in lastout,filo 訪問原則組織的儲存區域,也可以說是 後進先出 last in first out,lifo 訪問原則。堆疊具有兩種基本操作,對應兩條基本指令 資料壓進堆疊操作對應進棧指令push 資料彈...