組合語言 王爽

2021-10-03 14:19:30 字數 3111 閱讀 1319

cpu有三條匯流排:

位址、資料、控制線

位址匯流排確定儲存單元

控制匯流排傳送指令

資料匯流排:傳輸資料

cpu n個位址線 位址匯流排寬度為n 可以尋找2^n個記憶體單元

*儲存單元

0開始編號,乙個儲存單元可以儲存乙個byte

8086cpu有16根位址線

1bit就是一根位址線

注意:儲存器以b為最小單位

********************====第二章 暫存器*************************=

通用暫存器:

ax bx cx dx 

ax -> ah和al

16位暫存器最大能儲存的數 2^16 - 1 = 65536 - 1 轉十六進製制是四位 0~ffffh

8 位暫存器 2^8 = 256 轉十六進製制 0~ffh    

8086cpu在內部採用2個16位位址合成的方法來形成乙個20位的實體地址

位址加法器:

實體地址 = 段位址 x 16 + 偏移位址

段位址 x 16 的說法是左移 4 位    乙個x進製數左移1位,相當於乘以x

段位址 x 16 + 偏移位址 含義是: cpu 在訪問記憶體時,用乙個基礎位址(段位址x16)和乙個相對於基礎位址的偏移位址相加,給出記憶體單元的實體地址。

起始、基礎位址就是段位址

偏移位址16位,0~ffffh, 64kb 

*課後題:    

(1)cpu定址範圍 (0001h+ 0000h x 16 ) ~ (0001h+ffffh x 16 ) = 0010h ~ 1000fh

(2)sa * 16 + 偏移位址 = 2000h  偏移位址範圍 0000h ~ ffffh

sa  * 16 = 2000h - 偏移位址

sa = 2000h / 10h    sa = 10001h / 10h

段暫存器:

cs:**段暫存器   ip:指令指標暫存器

8086中 cs的內容為m,ip的記憶體為n,cpu從 m*16 + n 開始讀取指令執行。

cpu將cs:ip指向的記憶體單元中的內容看做指令,

-jmp指令:修改cs:ip中的值

jmp 段位址 : 偏移位址

jmp 2ae3:3    cs = 2ae3h ip = 0003h ,cpu將從2ae33h

"jmp 段位址 : 偏移位址" 指令的功能為 修改段位址cs 修改 偏移位址ip

執行匯程式設計序步驟

1 t 先讓cs:ip指向指令所在的記憶體單元

2 r 修改cs:ip中的內容

**********====第三章暫存器***********************************==

*記憶體中字儲存

位元組 是乙個記憶體單元, 字 是2個連續的記憶體單元;

ds暫存器:存放要訪問資料的段位址

如何將乙個記憶體單元中的內容送入乙個暫存器呢?

mov 暫存器名, 記憶體單元位址

mov指令如何從10000h中讀取資料,

1000:0

1、先將1000h存入ds暫存器

2、mov al [0] 完成傳送。0表示記憶體單元偏移位址是0 段位址預設放在 ds暫存器

*棧ss:段暫存器  sp:偏移暫存器

ss:sp指向棧頂元素

解釋 push ax 指令:

1、sp = sp - 2 ss:sp指向當前棧頂前面的元素,以此為新棧頂

2、ax 的內容送入ss:sp指向的記憶體單元處。ss:sp指向新棧頂

人話來說就是:先移動棧頂指標 在把資料送入棧頂指標指向的記憶體單元處。

解釋 pop ax 指令:

1、ss:sp指向的記憶體單元的內容送入ax中

2、sp = sp + 2 ss:sp指向當前棧下面的元素,以當前棧頂下面的單元為新的棧頂。

先將棧頂指標的內容送入ax暫存器中,在向下移動棧頂指標。

pop和push指令格式

pop 段暫存器     push 段暫存器

pop 暫存器        push 暫存器  

pop 記憶體單元    push 記憶體單元

**********==第乙個匯程式設計序********************====

偽指令segment    //段開始

**段。。。    

ends    //段結束

end        //匯程式設計序結束標記

assume :假設某一段暫存器和程式中某一segment...ends定義的段相關聯

怎麼寫乙個匯程式設計序呢?

1、定義乙個段

demo segment

mov ax 1000fh

demo ends

end程式返回指令:

mov ax,4c00h

int 21h

*[bx] 表示:乙個記憶體單元,它的偏移位址在bx中。

mov ax,[bx]

//將乙個記憶體單元的內容送入到ax,這個記憶體單元的長度為2位元組,存放乙個字,偏移位址在bx中,段位址在ds中。

inc bx

// bx中的內容加1   類似於 bx 自增

loop指令 迴圈指令

格式:loop 標號

cpu執行loop指令時會 cs- - ;判斷cs中的值,不為0轉至標號處執行程式,為0向下執行。

demo segment

mov ax,2

mov cx,11

s:    add ax,ax

loop s

mov 4c00h

int 21h

demo ends

endloop寫迴圈格式

mov cx 迴圈次數

s:要迴圈的**

loop s

例題:        

加法計算 123*236,結果存在ax中

adds segment

mov ax,0

mov cx,236

s:    add ax,123

loop s

mov 4c00h

int 21h    

adds ends

end    

dw 定義位元組型變數,1個字資料佔2個位元組單元,讀完乙個,偏移量 + 1

組合語言 王爽 筆記

關於pop的知識 1.出棧後,ss sp指向新的棧頂,pop操作前的棧頂元素中的資料仍然存在,但是,它已不再棧中 2.ss和sp只記錄了棧頂的位址,依靠ss和sp可以保證在入棧和出棧時找到棧頂 3.當棧滿的時候再次使用push指令入棧,棧空的時候再次使用pop指令出棧,都將發生棧頂越界問題,它是非常...

組合語言 王爽 筆記

1.乙個組合語言程式從寫出到最終執行的簡要過程 編寫,編譯連線,執行 2.可執行檔案中包含兩部分內容 一是程式 從源程式中的彙編指令翻譯過來的機器碼 和資料 源程式中定義的資料 二是相關的描述資訊 eg 程式的大小,要佔的記憶體空間等 3.彙編指令是指有對應的機器碼的指令,可以被編譯為機器指令,最終...

組合語言 王爽 筆記

1.dos是乙個單任務作業系統,乙個程式a再可執行檔案中,必須要有另乙個正在執行的程式b,將a從可執行檔案中加載入記憶體中,將cpu的控制權交與a,a才能執行,a開始執行後,b停止執行,當a執行完畢後,將cpu控制權再交於b,b再繼續執行 2.程式返回 乙個程式結束後,將cpu的控制權交還給使它得以...