Download - 第三章 CPU 與組合語言
1
第三章 CPU 與組合語言
組合語言之指令行常數與記憶體變數
程式風格指令集與指引指令
2
組合語言之指令行基本組合語言指令行為四欄式
標籤(選用, 視情況需要使用)運算子:指令助憶符號(必要)運算元(通常需要)註解(選用, 最好養成說明程式習慣)
2
標籤欄 :標籤欄 : 運算子欄運算子欄 運算元欄運算元欄 ; 註解欄; 註解欄繼續
3
標籤標 籤 ( Label ) 是 一 種 識 別碼,做為程式或資料的標的。
程式碼標籤( Code Label ) :程式位址 , 以 : 結束。 (MASM範例)
資料標籤( Data Label ) : 變數位址 , 不可加 :標籤需獨特,一程式中不能有兩個相同之標籤。
運算子欄運算子欄 運算元欄運算元欄 ; 註解欄; 註解欄標籤欄 :標籤欄 :
4
標籤(masm範例 )
程式碼標籤以 : 結束Target:
mov ax,bxjmp Target
資料標籤 , 不可加 :First BYTE 10
5
運算子指定 CPU 之動作,
以 指令助憶符號 (instruction
Mnemonic) 表示。依指令用途運算元有 0~3 個。CPU指令集格式:學習指令功能與用法。
運算元欄運算元欄 ; 註解欄; 註解欄標籤欄 :標籤欄 : 運算子欄運算子欄
6
指令助憶符號指 令 助 憶 符 號 (instruction Mnemonic) : CPU 指令集 , 用簡短之英文字幫助記憶。以 MASM 為例,如 :
mov(move 搬移、複製 ) 、 add (addition 加 ) 、 sub(substration減 ) 、 mul( multply乘 ) 、 jmp(jump 跳 至 位址 ) 、 call(call 呼叫程序 )
7
CPU 指令集指令說明格式與要點
指令說明格式與要點指令名稱:簡單說明影響旗標 ( 狀態暫存器 )
功能與用途指令格式
學組合語言要件 瞭解指令集指令集: MASM指令集、指引指令
8
運算元可以是常數、記憶體變數、暫存器。
暫存器可直接使用。常數分常數符號與數字
常數符號需以指引指令先定義記憶體變數,需使用資料定義指引指令定義後,才可使用。
運算子欄運算子欄 ; 註解欄; 註解欄標籤欄 :標籤欄 : 運算元欄運算元欄
9
運算元定義定義運算元
定 義 記 憶 體 變 數 運 算 元 變數之MASM範例。定 義 常 數 符 號 運 算 元 常數符號之MASM範例。定義暫存器運算元使用 CPU內建之暫存器保留字。
10
變數之 MASM 範例位元組定義:
BYTE及SBYTE、 DB、字串。字組定義:
WORD 及 SWORD 、 DW 、字組陣列
初 值 宣 告 : 多重初值 、未初始資料、 data&data?比較
11
常數符號之 MASM 範例=指引( 等號 )
( 範例)
EQU指引 ( 範例)
TEXTEQU=與EQU比較
12
註解註解( comments ):用於說明程式 , 不會執行單列註解,各種組合語言有不同之規定 , 以MASM為例
12
運算子欄運算子欄 運算元欄運算元欄標籤欄 :標籤欄 : ; 註解欄; 註解欄
13
MASM 之註解由分號(;)起始。或區段註解,由 COMMENT xx 設定符號 xx 開始 , 至 xx 結束 。如 : inc EAX ; EAX=EAX+1
COMMENT $ ( 此例 xx 為 $)this line is a commentthis line also is a comment
$13
14
常數與記憶體變數基本定義語法
記憶體 資料變數定義語法 定義記憶體變數。常數符號之定義 語法 定 義 常數符號。
繼續
15
資料變數定義語法
資 料 定 義 敘 述 (data definition statement ) :以組譯器內建資料型態,建立變數。語法 (MASM) :
初始設定式 : 給定該變數初值 , 使用 ? 代表不定初值 ( 可能為任意數值 )變數在記憶體之格式(MASM範例)。
資料籤欄資料籤欄 指引指引 初始設定式初始設定式 ; 註解欄; 註解欄
16
資料變數在記憶體之格式( 以 MASM 為例 )
位元組定義:BYTE及SBYTE、 DB、字串。
字組定義:WORD及SWORD、 DW、字組陣列
資料在記憶體中之排列順序:小印地安排序(MASM使用) :( 範例)大印地安排序:( 範例)初值宣告:多重初值、未初始資料、data&data?比較
17
BYTE 及 SBYTE
BYTE ( 定義位元組)及 SBYTE(定義有號位元組) 如 :
Value1 BYTE 10hValue2 SBYTE -100
變數名稱 : 上例之 Value1, Value2資料 10h(16 進位 )資料 100( 十進位 )
18
BYTE 及 SBYTE 早期為 DB
DB 指引 : BYTE, SBYTE 早期可以 DB 取代
Value1 DB 10hValue2 DB -100
19
多重初始值一個變數也可同時給與一段位址( 陣列型態 ), 如 :List BYTE 10,20,30,40
位移值 數值List+00List+1List+2List+3
10203040
20
以 BYTE 定義字串建立字串資料定義,以引號包住一串字元,最常見的字串以空白位元結尾,也就是位元組值為 0 ,如 :
Greeting1 BYTE“Good”, 0等於Greeting1 BYTE‘G’,‘o’,‘o’,‘d’, 0
若太長可以以 \ 將兩行連接為一行Greeting1 \
BYTE “Good”, 0
21
WORD及 SWORD
WORD ( 定 義 字 組 ) 及SWORD (定義有號字組)指引建立一個或多個十六位元的整數。
Word1 WORD 65535Word2 SWORD –32768
22
WORD及 SWORD早期版本 DW
Word1 WORD 65535Word2 SWORD –32768
早期版本 DWWord1 DW 65535Word2 DW –32768
23
字組陳列字組陳列( Array of Words )
myList WORD 1,2,3,4,5
位移值 數值myList+00myList+02myList+04myList+06
1234
24
小印地安排序Intel 處理器從記憶體存取資料使用稱為小印地安排序( little endian order )的方式,表 示 最 小 有 意 義 的 位 元 組(LSB) 資料存在最低的位址,其餘的位元組 (MSB) 就接著存放在相鄰的位置。
25
小印地安排序 ( 例 )
如 :
d1 DWORD 12345678h
位移值 數值d1+01d1+02d1+03d1+04
78h56h34h12h
MSB LSB
26
大印地安排序有些其他的電腦系統使用大印地 安 排 序 ( big endian order )(高到低)表 示 最 大 有 意 義 的 位 元 組(MSB) 資料存在最低的位址,其餘的位元組 (LSB) 就接著存放在相鄰的位置。
27
大印地安排序 ( 例 )
如:d1 DWORD 12345678h
位移值 數值d1+01d1+02d1+03d1+04
12h34h56h78h
MSB LSB
28
宣告未初始資料DATA ?指引可以用來宣告未初始資料,特別是在宣告大區塊的未初始資料特別好用。
.dataSmallarray DWORD 10 DUP(0)
.data ?Bigarray DWORD 5000 DUP(?)
29
宣告未初始資料 ( 比較 ).dataSmallarray DWORD 10 DUP(0).data ?Bigarray DWORD 5000 DUP(?)下面的程式碼產生的編譯後程式會比上的程式多 20000 位元組
.dataSmallarray DWORD 10 DUP(0)Bigarray DWORD 5000 DUP(?)
30
符號常數符 號 常 數 (symbolic constant) 、 符 號 定 義(symbol definition)
一個符號 ( 識別碼 )或是一個整數運算式或一些文字符號常數不使用任何儲存空間,不像變數定義,會保留儲存體空間。
31
符號常數與變數比較所有運算之數值計算方式:
符號常數:在組譯時完成。變數:在執行階段由程式完成,且記得給初始值。
是否執行時是否改變是否使用儲存空間
變數常數符號
?
?
,
32
常數之定義方式 (MASM 語法 )
=指引( 等號 )
( 範例)
EQU指引 ( 範例)
TEXTEQU=與EQU比較
33
程式風格程式區資料區程式架構
基本架構混合式簡易程式架構經驗繼續
34
程式區組合與言一行一指令,且相鄰指令會組譯在相鄰之記憶體 ( 指令或變數皆是如此 ) 。因此 指 令 最 好 有 一專屬之 區塊。編輯可執行之指令。MASM 範例:
.CODE、 SEGMENT。
35
資料區組合語言之資料最好依使用特性設定不同之資料區。編輯相關之資料變數定義。
如 :堆疊 (STACK) 、 一般資料。
MASM 範例:.DATA、 .STACK、 SEGMENT。
36
程式架構需包含
程式說明、常數定義、變數定義 ( 資料區 ) 、堆疊定義 ( 資料區 ) 、程式指令與副程式 ( 程式區 ) 及其他相關定義。
37
基本架構至少需 有 下 列 定義 程 式 才 能 執行:
變數 ( 資料區 ) 。堆疊 ( 資料區 ) 。程 式 指 令 與副程式 ( 程式區 )
右圖為 MASM 範例。
.STACK
DB 100 DUP(?)
.DATA
A DB 12, 44, 55
NUM DB 3
.CDOE
MOV AX, @DATA
…..
38
混合程式碼與資料一些組譯器,可讓你在程式中程式碼與資料自由來回切換,程式宣告變數時很方便。如:
.codemov eax,ebx
.data temp DWORD ?.code
mov temp, eax
沒有錯 , 但
不建議使用
39
簡易之程式經驗使用常數符號MASM 之組譯,
16bit32bit16bit32bit
40
使用常數符號為何使用符號?經驗告訴我們,使用符號會讓程式容易閱讀及維護。容易閱讀重新定義
41
容易閱讀 鍵盤定義Esc_key =27LF =0AhCR =0dh
可以將不易記憶之各種數字定義為所代表之文字意義,如上列定義,就是將鍵盤按鍵值定義為一般使用之文字。
42
重新定義常數count=6000array db count DUP(0)count=5
mov al, countcount=10
mov al, countmov al, 5mov al,10
Count 0,0,0….共 6000 個 0
43
16bit
基本程式架構需含:INCLUDE Ivrin16.inc 。
mov AX, @data mov DS, AX組譯及連結你的程式的批次檔名為make16.bat。資 料 及 程 式 碼 標 籤 的 位 移 值 ( 位址)是十六位元。
44
32-bit
基本程式架構需含:INCLUDE Ivrin32.inc 。
組譯及連結你的程式的批次檔名為make32.bat。資 料 及 程 式 碼 標 籤 的 位 移 值(位址)是三十二位元。
45
32-bit16bit三十二位元程式轉換成十六位元程式,只有少數的地方需要改變:
INCLUDE 指 引 對 應 不 同 的 函 數庫 ,Ivrin32.inc Ivrin16.inc 。16bit 之資料區段需有
mov AX, @data mov DS, AX
組 譯 及 連 結 你 的 程 式 的 批 次 檔 名 為make32.batmake16.bat。
資料及程式碼標籤的位移值(位址)是是三十二位元十六位元。
46
指引指令舉幾個 MASM 常用指引為例:include等號指引: ( 範例)
EQU指引: ( 範例)
SEGMENT、ENDS
.CODE、 .STACK、 .DATA
47
等號指引等 號 指 引 ( equal-sign directive )連結符號名稱到整數運算式名稱 = 運算式例 :count=500
48
等號指引 ( 範例 )
例 :count=500
mov al,count
組譯後產生 mov al, 500
49
EQU指引EQU 指引連結符號名稱、整數常數或是任意文字定義為某運算式值
定義為另一個符號
定義為某< 文字 >
名稱 EQU 運算式
名稱 EQU < 文字… ..>
名稱 EQU 符號
50
EQU範例Matrix1 equ10*10Matrix2 equ<10*10>.dataM1 WORD Matrix1M2 WORD Matrix2
M1 WORD 100M2 WORD “10*10”
運算式 ( 數值 )
文字 <>
51
=與 EQU比較= 與 EQU皆可定義常數。以 = 定義之常數,可以以 = 號重新定義,但不可以其他方式改變。以 EQU 定義則不可改變,改變時會產生 error ,因為 EQU 是屬於符號定義 ( 不只是數值 ) ,因此改變會造成重複定義變符號。
52
TEXTEQU
TEXTEQU 指 引 ,類似 EQU , 會建立 Microsoft 所稱的文字巨集第一種指定文字,
第二種指定既有文字巨集的內容,
第三種指定常數整數運算式。
名稱 TEXTEQU < 文字… ..>
名稱 TEXTEQU 文字巨集
名稱 TEXTEQU % 常數運算式
53
include
指令功能:組 譯 時 , 將 filename 內容,插入目前原始檔中 。 若filename 包含反斜線、分號、大於、小於、單引號、雙引號,則需以方括號包住。
相關指令IFDEFIFNDEFENDIF
指令格式:Include filename
filename 為欲含入組譯之檔案名稱
指令範例:INCLUDE my_file.inc// 載入 my_file.inc…
54
SEGMENT 、 ENDS
指令功能:定義一個區段,其擁有屬性align (byte, word, dword, para, Page), combine (PUBLIC, STACK, COMMON, …), use, class 。
相關指令.DATA?.STACKSEGMENT ENDS.MODEL
指令格式:Name SEGMENT [[READONLY]][[align]][[combine]][[use]][[‘class’]]…Name ENDS
指令範例:Test SEGMENT word// 敘述…Test ENDS
55
.CODE
指令功能:當與 .MODEL 一起使用時,表示名為 name 的程式區段開始。預設為 _TEXT( 與 model有關 ) 。
相關指令.DATA?.STACKSEGMENT ENDS.MODEL
指令格式:.STACK [[name]]
name 為程式區名稱
指令範例:.MODEL small….code test// 開始 test 程式區段
56
.SATCK
指令功能:當與 .MODEL 一起使用時,定 義 一堆疊區 段 。 .STACK會自動關閉堆疊敘述。
相關指令.DATA?.CODESEGMENT.MODEL
指令格式:.STACK [[size]]
size 為 堆 疊 大 小 , 內 定1024
指令範例:.MODEL small.STACK 512// 設定堆疊 512byte
57
.DATA
指令功能:當與 .MODEL 一起使用時,為已初始化之資料,開啟一鄰近資料區段( _DATA ),可定義資料變數於此區。
相關指令.DATA?.STACKSEGMENT.MODEL
指令格式:.DATA
指令範例:.MODEL small.dataA word 01hNum byte 3h
58
MASM 指令集每一種 CPU 有其特殊之指令集,以IA-32 CPU 為例:
ADD:加法指令。MOV:資料複製。CALL:呼叫副程式。JMP:跳躍至 某位址繼續執行。CMP : 比 較 兩 運 算 元 , 設 定STATUS 。INT:軟體中斷。
59
ADD
指令功能:將來源運算元和目的運算元相加,再存到目的運算元,其中運算元的位元數必須相同。
影響之 STATUS 位元O D I S Z A P C
* * * * * *
指令格式:ADD 目的 , 來源
目的 : reg, mem. Accum來源 : reg, mem. Accum, imm不可以 ADD mem, mem
指令範例:ADD ax, 01h
// AX=AX+1
60
MOV
指令功能:將來源運算元,複製一個位元 組 或 字 元 組 到目的 運 算元。
影響之 STATUS 位元O D I S Z A P C
指令格式:MOV 目的 , 來源
目的 : reg(16), mem(16). 來源 : reg(16), mem(16). imm
指令範例:MOV AX,@DATA
//AX=DATA 之 offset
MOV AL,01h//AL=01h
61
CALL
指令功能:將下個指令位址推入堆疊,並轉往目的 運 算原位 址 執行。如只近程呼叫,只壓入偏移值,否則區段與偏移皆壓入。
影響之 STATUS 位元O D I S Z A P C
指令格式:CALL 目的
目的 : nearlabel, mem16,farlabel , mem32, reg
指令範例:CALL Sub1…
Sub1: … // 副程式ret
62
JMP
指令功能:藉由完成隱含之減法運算,將目的運算元減去來源運算元,將兩運算元作比較。
影響之 STATUS 位元O D I S Z A P C
指令格式:JMP 目的
目的 : nearlabel, mem16,farlabel , mem32, reg
指令範例:CMP ax, 01hJMP equal_1
notequ: ……
equal_1:
63
CMP
指令功能:藉由完成隱含之減法運算,將目的運算元減去來源運算元,將兩運算元作比較。
影響之 STATUS 位元O D I S Z A P C
* * * * * *
指令格式:CMP 目的 , 來源
目的 : reg, mem. Accum來源 : reg, mem. Accum, imm
指令範例:CMP ax, 01hje equal_1
notequ: …
64
INT
指令功能:產生一個依序呼叫作業系統副程式之軟體中斷,這指令會 在 分支執 行 到 中斷程 式前,清除中斷旗 標並並STATUS,CS,IP推入堆疊。
影響之 STATUS 位元O D I S Z A P C
0
指令格式:INT 目的
目的 : imm
指令範例:MOV AH, 0AhINT 21h
// 呼叫 MS-DOS 中斷服務// 緩衝之鍵盤輸入功能