讀書寫筆記-王爽《組合語言》
第2章 暫存器(CPU工作原理)
2.1 通用暫存器
8086CPU的所有暫存器都是16位,可以存放兩個位元組。AX、BX、CX、DX四個暫存器通常用來存放一般性的資料,被稱為通用暫存器。
一個16位暫存器可以儲存一個16位的資料。
那麼一個16位暫存器所能儲存的資料的最大值為多少呢?
8086CPU的上一代CPU中的暫存器都是8位的,為了保證相容,使原來基於上代CPU編寫的程式稍加修改就可以執行在8086之上,8086CPU的AX、BX、CX、DX四個暫存器都可分為兩個可獨立使用的8位暫存器來使用:
AX可分為AH和AL;
BX可分為BH和BL;
CX可分為CH和CL;
DX可分為DH和DL;
2.3 彙編指令
彙編指令舉例:
mov ax,18 將18送入暫存器AX AX=18
mov ah,78 將78送入積存器AH AH=78
add ax,8 將暫存器AX中的數值加上8 AX=AX+8
mov ax,bx 將暫存器BX中的資料送入暫存器AX AX=BX
add ax,bx 將AX和BX中的數值相加,結果存在AX中 AX=AX+BX
在寫一條彙編指令或一個暫存器的名稱時不區分大小寫,如:mov ax,18和MOV AX,18的含義相同;bx和BX的含義相同。
注意:如果單獨把AH和AL做為兩個獨立的8位暫存器來用,那麼它們兩個就是兩個不相關的暫存器,不要錯誤的認為,諸如add al,93H的指令產生的進位會儲存在ah中,add al,93H進行的是8位運算。
如果執行add ax,93H,低8位的進位會儲存在ah中,CPU在執行這條指令時認為只有一個16位暫存器ax,進行的16位運算。指令add ax,93H執行後,ax中的值為:0158H。此時,使用的暫存器是16位暫存器ax,add ax,93H相當於將ax中的16位資料00c5H和另一個16位資料009CH相加,結果是16位的0158H。
在進行資料傳送或運算時,要注意指令的兩個操作物件的位數應當是一致的,例如:
mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add ax,20000
等都是正確的指令,而
mov ax,bl (在8位暫存器和16位暫存器之間傳送資料)
mov bh,ax (在16位暫存器和8位暫存器之間傳送資料)
mov al,20000 (8位暫存器最大可存放值為255的資料)
add al,100H (將一個高於8位的資料加到一個8位暫存器中)
等都是錯誤的指令,錯誤的原因都是指令的兩個操作物件的位數不一致。
在8086CPU加電啟動或復位後(即CPU剛開始工作時)CS和IP被設定為CS=F000H,IP=FFFFH,即在8086PC機剛啟動時,CPU從記憶體FFFF0H單元中讀取指令執行,FFFFOH單元中的指令是8086PC機開機後執行的第一條指令。
現在,我們更清楚了CS和IP的重要性,它們的內容提供了CPU要執行指令的地址。
mov指令不能用於設定CS、IP的值,原因很簡單,因為8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值。能夠改變CS、IP的內容的指令被統稱為轉移指令。
我們現在介紹一個最簡單的可以修改CS、IP的指令:jmp指令。
若想同時修改CS、IP的內容,可用指令“jmp 段地址: 偏移地址”完成,如:
jmp 2AE3:3,執行後:CS=2AE3H,IP=0003H,CPU將從2AE33H處讀取指令。
jmp 3:0B16,執行後:CS=0003H,IP=0B16H,CPU將從00B46H處讀取指令。
若想僅修改IP的內容,可用指令“jmp 某一合法暫存器”完成,如:
jmp ax,指令執行前:ax=1000H,CS=2000H,IP=0003H
指令執行後:ax=1000H,CS=2000H,IP=1000H
指令“jmp 某一合法暫存器”的功能為:用暫存器中的值修改IP。
jmp ax,在含義上類似於mov IP,ax這樣的指令。
CPU只認被CS:IP指向的記憶體單元中的內容為指令,所以,要讓CPU執行我們放在程式碼段中的指令,必須要將CS:IP指向所定義的程式碼段中的第一條指令的首地址。
對於上面的例子,我們將一段程式碼存放在123BOH-123BAH記憶體單元中,將其定義為程式碼段,如果要讓這段程式碼得到執行,可設CS=123BH,IP=0000H。
段地址在8086CPU的段暫存器中存放。當8086CPU要訪問地址時,由段暫存器提供記憶體單元的段地址。8086CPU有4個段暫存器,其中CS用來存放指令的段地址。
CS存放指令的段地址,IP存放指令的偏移地址。
8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。
8086CPU的工作過程:
1:從CS:IP指向記憶體單元讀取指令,讀取的指令進入指令緩衝器;
2:IP指向下一條指令;
3:執行指令。(轉到步驟1,重複這個過程。)
檢視CPU和記憶體,用機器指令和彙編指令程式設計
1:預備知識:Debug的使用
(1)什麼是Debug?
Debug是DOS,Windows都提供的真實模式(8086方式)程式的除錯工具,使用它,可以檢視 CPU各種暫存器中的內容、記憶體的情況和在機器碼級別跟蹤程式的執行。
(2)我們用到的Debug功能
用Debug的R命令檢視、改變CPU暫存器的內容;
用Debug的D命令檢視記憶體中的內容;
用Debug的E命令改寫記憶體中的內容;
用Debug的U命令將內容中的機器指令翻譯成彙編指令;
用Debug的T命令執行一條機器指令;
用Debug的A命令以彙編指令的格式在記憶體中寫入一條機器指令;
(3)進入Debug
Debug是在DOS方式下使用的程式。我們進入Debug前,應先進入到DOS方式,用以下方式可 以進入DOS:
1:重新啟動計算機,進入DOS方式,此時進入的是真實模式的DOS;
2:在Windows中進入DOS方式,此時進入的是虛擬8086模式的DOS;
下面說明在Windos2000中進入Debug的一種方法,在Windows98中進入的方法與此類似。
開始-執行-輸入command
進入DOS方式後,如果顯示為視窗方式,可以按下Alt+Enter鍵將視窗變成全屏方式,然後 執行Debug程式。
具體使用方法看P46。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=743402
相關文章
- 讀書筆記:組合語言(王爽)實驗七筆記組合語言
- 《組合語言》王爽,學習筆記(子程式呼叫)組合語言筆記
- 《組合語言》王爽,學習筆記(標誌暫存器下)組合語言筆記
- 組合語言學習筆記組合語言筆記
- 天書夜讀:從組合語言到Windows核心程式設計筆記(2)組合語言Windows程式設計筆記
- 讀書筆記《組合語言》——intel8086暫存器的記憶體訪問筆記組合語言Intel記憶體
- C語言深度剖析——讀書筆記C語言筆記
- 組合語言學習筆記(十二)-浮點指令組合語言筆記
- 《論語》讀書筆記筆記
- 《Go 語言程式設計》讀書筆記(四)介面Go程式設計筆記
- 《Go 語言程式設計》 讀書筆記 (八) 包Go程式設計筆記
- 《Go 語言程式設計》讀書筆記(十)反射Go程式設計筆記反射
- 《Go 語言程式設計》讀書筆記 (三) 方法Go程式設計筆記
- C語言程式設計讀書筆記:結構C語言程式設計筆記
- 組合語言1 - 什麼是組合語言?組合語言
- 組合語言組合語言
- swift語法-讀書筆記Swift筆記
- 《Go 語言程式設計》讀書筆記 (二)函式Go程式設計筆記函式
- 組合語言-學習記錄(二)組合語言
- 《Go 語言程式設計》讀書筆記 (一)基礎型別和複合型別Go程式設計筆記型別
- 組合語言 1組合語言
- 組合語言 2組合語言
- 組合語言-棧組合語言
- 《Go 語言程式設計》讀書筆記 (九) 命令工具集Go程式設計筆記
- 【C語言深度剖析】讀書筆記之 signed ,unsignedC語言筆記
- 組合語言零基礎入門學習筆記(一)組合語言筆記
- 組合語言學習筆記03——暫存器(CPU工作原理)組合語言筆記
- 【R語言學習筆記】探索ggplot的排列組合(一)R語言筆記
- 【記】《.net之美》之讀書筆記(一) C#語言基礎筆記C#
- 好語言,就該善用它——《C++語言的設計與演化》讀書筆記C++筆記
- 《Go 語言程式設計》讀書筆記 (五) 協程與通道Go程式設計筆記
- 組合語言指令大全組合語言
- 《寫給大家看的設計書》讀書筆記筆記
- # 2020-10-11 #「組合語言 第 3 版 王爽」- 參考答案:檢測點 11.4組合語言
- 《Go 語言程式設計》讀書筆記(十一)底層程式設計Go程式設計筆記
- 《Java8函數語言程式設計》讀書筆記---類庫Java函數程式設計筆記
- 【R語言學習筆記】探索ggplot的排列組合:線圖(一)R語言筆記
- 讀書筆記...筆記