彙編語言學習小結

彙編語言是僅次於機器語言的底層語言,學習彙編語言可以讓我們更好的理解CPU的工作方式和原理,可以幫我們更好的寫好高級語言
我們通常使用的C,C++,C#語言都是基於彙編語言的高級語言。通常這些高級語言在機器中變爲可執行文件的時候,都會經歷以下幾個步驟

  1. 預處理(頭文件引入,宏替換,內聯函數替換等)
  2. 編譯(編譯器會對文件進行語法檢查)
  3. 彙編(會將上述高級語言轉換爲彙編語言
    mov,add,sub,jmp等彙編指令和相關的僞指令:定義相關代碼段,指令段)
  4. 鏈接(將程序需要的所有庫文件鏈接起來,讓所有的symbol都能夠referenced到)

彙編語言中涉及到 CPU如何工作和CPU如何和外部部件進行溝通交換數據(顯卡,網卡,鍵盤),學習了

小甲魚的相關彙編語言零基礎 課程後,講知識點歸納如下
課程視頻地址(youtube都是免費的):https://www.youtube.com/watch?v=JfOO6SFF2t4&index=21&list=PLjriMw8NCUVbKxnRdjbKz1fs2Nx2FXMa4&spfreload=1

CPU如何區分存儲單元裏面的是數據 還是 指令?

Answer: CPU和外部部件之間有三個通道,數據總線,地址總線,控制總線
1. 數據總線出去的我們認爲是數據,
2. 地址總線出去的我們認爲是尋址(地址總線的大小決定了尋址大小,一般來說8086有20位地址總線,所有能夠尋找到2^20=1 MB 的地址 ,每隔存儲單位默認是8個bit)
3. 控制總線出去的我們認爲是具體操作(讀或者寫,控制總線的大小決定了控制能力,可以控制多少個外部器件)

CPU中的寄存器是什麼,有什麼用?

Answer: CPU中寄存器是最接近於CPU的元器件,速度極快(比一級緩存,二級緩存,內存都要快很多),8086處理器有16個寄存器,這些寄存器中的值往往決定了CPU下一個要執行的指令,或者數據是什麼。8086寄存器都是16位寄存器(字的概念由此而來word=2byte)
通用寄存器 AX BX CX DX
bx  ——-> 數據偏移地址的寄存器
cx ——-> loop 循環的次數

mov ax, 1000H
mov ds, ax
mov bx, 0020H
mov ax, [bx]  # 將 1000H:0020H的物理地址的內容送入ax  (ax) = ((ds)*16 + (bx))

段寄存器 CS SS DS ES
指令寄存器IP, 棧寄存器SP
SI DI —>功能和BX相近,用來表示偏移,但是不能拆分兩個8位的寄存器來使用

CPU中寄存器中的值怎麼賦值?
Answer: 通常來講我們使用mov 指令來給寄存器賦值
mov ax,2 # 將 2, 二進制 0000000000000010賦值給ax通用寄存器
mov cs,ax # 將ax內容複製非指令段寄存器cs中

段寄存器內容不能直接賦值,只能通過通用寄存器來間接賦值,
代碼段寄存器 CS : IP 確定下一條指令的物理地址
數據段寄存器 DS: 【offset】確定數據存取的物理地址, offset 通常放在bx寄存器中
棧段寄存器 SS: SP 確定棧頂位置

CPU中寄存器值如何映射到20位地址的物理空間?

Answer: 由於8086的CPU內部總線只有16位(所有寄存器都是一個字,16比特)但是8086外部的地址總線卻有20位,如何通過段寄存器和相應的偏移量寄存器來確定物理地址呢?
答案是 段寄存器左移4位,然後相加偏移地址===》 物理地址
CS: IP === 1000H: 0001H =====》 10001H 物理地址
計算機會從10001H 的物理地址去獲取這個位置上的指令(可能是mov, push, pop, sub, add)然後執行,執行完畢後,IP寄存器會自動加上相關指令的字節數(mov 3 個字節,IP = IP +3)然後再從 10004H的物理地址上去獲取下一個指令。

CPU中棧用來做什麼?

CPU中SS:SP確定棧頂位置,每次push 或者pop指令時,都會移動相應的棧頂位置。
push—》 棧頂位置 SP = SP -2, 放入數據(字)
pop —-> 從SP所指位置讀取數據(字),SP =SP +2
通常我們程序中函數調用的時候就會涉及到壓棧操作,將函數所用的參數從右到左依次壓棧,函數指針壓棧,函數中的局部變量壓棧,函數執行完畢後,再出棧(反方向),局部變量最先出棧。調用這個函數的地方又回到了之前調用前的上下文(寄存器值又恢復到了之前)

loop 如何執行,【cx】

例如我們需要做2^12的計算
分析: 2^12 = 2*2*【11次】*2
loop會先將cx-1,判斷如果不爲零,則調到相關代碼

assume cs:code

code segment
    move ax,2
    mova cx,11
 s: add ax, ax
    loop s

    move ax,4c00H
    int 21h
code ends

end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章