第三章 cpu 與組合語言

64
1 第第第 CPU 第第第第第 組組組組組組組組 組組組組組 組組 組組組組 組組組 組組組組

Upload: yael

Post on 19-Jan-2016

169 views

Category:

Documents


0 download

DESCRIPTION

第三章 CPU 與組合語言. 組合語言之指令行 常數與記憶體變數 程式風格 指令集 與 指引指令. 組合語言之指令行. 標籤欄 :. 運算子欄. 運算元欄. ; 註解 欄. 繼續. 基本組合語言指令行為四欄式 標籤 (選用, 視情況需要使用) 運算子 :指令助憶符號(必要) 運算元 (通常需要) 註解 (選用, 最好養成說明程式習慣). 2. 標籤. 標籤欄 :. 運算子欄. 運算元欄. ; 註解欄. 標籤( Label ) 是一種 識別碼 , 做為程式或資料的標的。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三章  CPU 與組合語言

1

第三章 CPU 與組合語言

組合語言之指令行常數與記憶體變數

程式風格指令集與指引指令

Page 2: 第三章  CPU 與組合語言

2

組合語言之指令行基本組合語言指令行為四欄式

標籤(選用, 視情況需要使用)運算子:指令助憶符號(必要)運算元(通常需要)註解(選用, 最好養成說明程式習慣)

2

標籤欄 :標籤欄 : 運算子欄運算子欄 運算元欄運算元欄 ; 註解欄; 註解欄繼續

Page 3: 第三章  CPU 與組合語言

3

標籤標 籤 ( Label ) 是 一 種 識 別碼,做為程式或資料的標的。

程式碼標籤( Code Label ) :程式位址 , 以 : 結束。 (MASM範例)

資料標籤( Data Label ) : 變數位址 , 不可加 :標籤需獨特,一程式中不能有兩個相同之標籤。

運算子欄運算子欄 運算元欄運算元欄 ; 註解欄; 註解欄標籤欄 :標籤欄 :

Page 4: 第三章  CPU 與組合語言

4

標籤(masm範例 )

程式碼標籤以 : 結束Target:

mov ax,bxjmp Target

資料標籤 , 不可加 :First BYTE 10

Page 5: 第三章  CPU 與組合語言

5

運算子指定 CPU 之動作,

以 指令助憶符號 (instruction

Mnemonic) 表示。依指令用途運算元有 0~3 個。CPU指令集格式:學習指令功能與用法。

運算元欄運算元欄 ; 註解欄; 註解欄標籤欄 :標籤欄 : 運算子欄運算子欄

Page 6: 第三章  CPU 與組合語言

6

指令助憶符號指 令 助 憶 符 號 (instruction Mnemonic) : CPU 指令集 , 用簡短之英文字幫助記憶。以 MASM 為例,如 :

mov(move 搬移、複製 ) 、 add (addition 加 ) 、 sub(substration減 ) 、 mul( multply乘 ) 、 jmp(jump 跳 至 位址 ) 、 call(call 呼叫程序 )

Page 7: 第三章  CPU 與組合語言

7

CPU 指令集指令說明格式與要點

指令說明格式與要點指令名稱:簡單說明影響旗標 ( 狀態暫存器 )

功能與用途指令格式

學組合語言要件 瞭解指令集指令集: MASM指令集、指引指令

Page 8: 第三章  CPU 與組合語言

8

運算元可以是常數、記憶體變數、暫存器。

暫存器可直接使用。常數分常數符號與數字

常數符號需以指引指令先定義記憶體變數,需使用資料定義指引指令定義後,才可使用。

運算子欄運算子欄 ; 註解欄; 註解欄標籤欄 :標籤欄 : 運算元欄運算元欄

Page 9: 第三章  CPU 與組合語言

9

運算元定義定義運算元

定 義 記 憶 體 變 數 運 算 元 變數之MASM範例。定 義 常 數 符 號 運 算 元 常數符號之MASM範例。定義暫存器運算元使用 CPU內建之暫存器保留字。

Page 10: 第三章  CPU 與組合語言

10

變數之 MASM 範例位元組定義:

BYTE及SBYTE、 DB、字串。字組定義:

WORD 及 SWORD 、 DW 、字組陣列

初 值 宣 告 : 多重初值 、未初始資料、 data&data?比較

Page 11: 第三章  CPU 與組合語言

11

常數符號之 MASM 範例=指引( 等號 )

( 範例)

EQU指引 ( 範例)

TEXTEQU=與EQU比較

Page 12: 第三章  CPU 與組合語言

12

註解註解( comments ):用於說明程式 , 不會執行單列註解,各種組合語言有不同之規定 , 以MASM為例

12

運算子欄運算子欄 運算元欄運算元欄標籤欄 :標籤欄 : ; 註解欄; 註解欄

Page 13: 第三章  CPU 與組合語言

13

MASM 之註解由分號(;)起始。或區段註解,由 COMMENT xx 設定符號 xx 開始 , 至 xx 結束 。如 : inc EAX ; EAX=EAX+1

COMMENT $ ( 此例 xx 為 $)this line is a commentthis line also is a comment

$13

Page 14: 第三章  CPU 與組合語言

14

常數與記憶體變數基本定義語法

記憶體 資料變數定義語法 定義記憶體變數。常數符號之定義 語法 定 義 常數符號。

繼續

Page 15: 第三章  CPU 與組合語言

15

資料變數定義語法

資 料 定 義 敘 述 (data definition statement ) :以組譯器內建資料型態,建立變數。語法 (MASM) :

初始設定式 : 給定該變數初值 , 使用 ? 代表不定初值 ( 可能為任意數值 )變數在記憶體之格式(MASM範例)。

資料籤欄資料籤欄 指引指引 初始設定式初始設定式 ; 註解欄; 註解欄

Page 16: 第三章  CPU 與組合語言

16

資料變數在記憶體之格式( 以 MASM 為例 )

位元組定義:BYTE及SBYTE、 DB、字串。

字組定義:WORD及SWORD、 DW、字組陣列

資料在記憶體中之排列順序:小印地安排序(MASM使用) :( 範例)大印地安排序:( 範例)初值宣告:多重初值、未初始資料、data&data?比較

Page 17: 第三章  CPU 與組合語言

17

BYTE 及 SBYTE

BYTE ( 定義位元組)及 SBYTE(定義有號位元組) 如 :

Value1 BYTE 10hValue2 SBYTE -100

變數名稱 : 上例之 Value1, Value2資料 10h(16 進位 )資料 100( 十進位 )

Page 18: 第三章  CPU 與組合語言

18

BYTE 及 SBYTE 早期為 DB

DB 指引 : BYTE, SBYTE 早期可以 DB 取代

Value1 DB 10hValue2 DB -100

Page 19: 第三章  CPU 與組合語言

19

多重初始值一個變數也可同時給與一段位址( 陣列型態 ), 如 :List BYTE 10,20,30,40

位移值 數值List+00List+1List+2List+3

10203040

Page 20: 第三章  CPU 與組合語言

20

以 BYTE 定義字串建立字串資料定義,以引號包住一串字元,最常見的字串以空白位元結尾,也就是位元組值為 0 ,如 :

Greeting1 BYTE“Good”, 0等於Greeting1 BYTE‘G’,‘o’,‘o’,‘d’, 0

若太長可以以 \ 將兩行連接為一行Greeting1 \

BYTE “Good”, 0

Page 21: 第三章  CPU 與組合語言

21

WORD及 SWORD

WORD ( 定 義 字 組 ) 及SWORD (定義有號字組)指引建立一個或多個十六位元的整數。

Word1 WORD 65535Word2 SWORD –32768

Page 22: 第三章  CPU 與組合語言

22

WORD及 SWORD早期版本 DW

Word1 WORD 65535Word2 SWORD –32768

早期版本 DWWord1 DW 65535Word2 DW –32768

Page 23: 第三章  CPU 與組合語言

23

字組陳列字組陳列( Array of Words )

myList WORD 1,2,3,4,5

位移值 數值myList+00myList+02myList+04myList+06

1234

Page 24: 第三章  CPU 與組合語言

24

小印地安排序Intel 處理器從記憶體存取資料使用稱為小印地安排序( little endian order )的方式,表 示 最 小 有 意 義 的 位 元 組(LSB) 資料存在最低的位址,其餘的位元組 (MSB) 就接著存放在相鄰的位置。

Page 25: 第三章  CPU 與組合語言

25

小印地安排序 ( 例 )

如 :

d1 DWORD 12345678h

位移值 數值d1+01d1+02d1+03d1+04

78h56h34h12h

MSB LSB

Page 26: 第三章  CPU 與組合語言

26

大印地安排序有些其他的電腦系統使用大印地 安 排 序 ( big endian order )(高到低)表 示 最 大 有 意 義 的 位 元 組(MSB) 資料存在最低的位址,其餘的位元組 (LSB) 就接著存放在相鄰的位置。

Page 27: 第三章  CPU 與組合語言

27

大印地安排序 ( 例 )

如:d1 DWORD 12345678h

位移值 數值d1+01d1+02d1+03d1+04

12h34h56h78h

MSB LSB

Page 28: 第三章  CPU 與組合語言

28

宣告未初始資料DATA ?指引可以用來宣告未初始資料,特別是在宣告大區塊的未初始資料特別好用。

.dataSmallarray DWORD 10 DUP(0)

.data ?Bigarray DWORD 5000 DUP(?)

Page 29: 第三章  CPU 與組合語言

29

宣告未初始資料 ( 比較 ).dataSmallarray DWORD 10 DUP(0).data ?Bigarray DWORD 5000 DUP(?)下面的程式碼產生的編譯後程式會比上的程式多 20000 位元組

.dataSmallarray DWORD 10 DUP(0)Bigarray DWORD 5000 DUP(?)

Page 30: 第三章  CPU 與組合語言

30

符號常數符 號 常 數 (symbolic constant) 、 符 號 定 義(symbol definition)

一個符號 ( 識別碼 )或是一個整數運算式或一些文字符號常數不使用任何儲存空間,不像變數定義,會保留儲存體空間。

Page 31: 第三章  CPU 與組合語言

31

符號常數與變數比較所有運算之數值計算方式:

符號常數:在組譯時完成。變數:在執行階段由程式完成,且記得給初始值。

是否執行時是否改變是否使用儲存空間

變數常數符號

?

?

,

Page 32: 第三章  CPU 與組合語言

32

常數之定義方式 (MASM 語法 )

=指引( 等號 )

( 範例)

EQU指引 ( 範例)

TEXTEQU=與EQU比較

Page 33: 第三章  CPU 與組合語言

33

程式風格程式區資料區程式架構

基本架構混合式簡易程式架構經驗繼續

Page 34: 第三章  CPU 與組合語言

34

程式區組合與言一行一指令,且相鄰指令會組譯在相鄰之記憶體 ( 指令或變數皆是如此 ) 。因此 指 令 最 好 有 一專屬之 區塊。編輯可執行之指令。MASM 範例:

.CODE、 SEGMENT。

Page 35: 第三章  CPU 與組合語言

35

資料區組合語言之資料最好依使用特性設定不同之資料區。編輯相關之資料變數定義。

如 :堆疊 (STACK) 、 一般資料。

MASM 範例:.DATA、 .STACK、 SEGMENT。

Page 36: 第三章  CPU 與組合語言

36

程式架構需包含

程式說明、常數定義、變數定義 ( 資料區 ) 、堆疊定義 ( 資料區 ) 、程式指令與副程式 ( 程式區 ) 及其他相關定義。

Page 37: 第三章  CPU 與組合語言

37

基本架構至少需 有 下 列 定義 程 式 才 能 執行:

變數 ( 資料區 ) 。堆疊 ( 資料區 ) 。程 式 指 令 與副程式 ( 程式區 )

右圖為 MASM 範例。

.STACK

DB 100 DUP(?)

.DATA

A DB 12, 44, 55

NUM DB 3

.CDOE

MOV AX, @DATA

…..

Page 38: 第三章  CPU 與組合語言

38

混合程式碼與資料一些組譯器,可讓你在程式中程式碼與資料自由來回切換,程式宣告變數時很方便。如:

.codemov eax,ebx

.data temp DWORD ?.code

mov temp, eax

沒有錯 , 但

不建議使用

Page 39: 第三章  CPU 與組合語言

39

簡易之程式經驗使用常數符號MASM 之組譯,

16bit32bit16bit32bit

Page 40: 第三章  CPU 與組合語言

40

使用常數符號為何使用符號?經驗告訴我們,使用符號會讓程式容易閱讀及維護。容易閱讀重新定義

Page 41: 第三章  CPU 與組合語言

41

容易閱讀 鍵盤定義Esc_key =27LF =0AhCR =0dh

可以將不易記憶之各種數字定義為所代表之文字意義,如上列定義,就是將鍵盤按鍵值定義為一般使用之文字。

Page 42: 第三章  CPU 與組合語言

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

Page 43: 第三章  CPU 與組合語言

43

 16bit

基本程式架構需含:INCLUDE Ivrin16.inc 。

mov AX, @data mov DS, AX組譯及連結你的程式的批次檔名為make16.bat。資 料 及 程 式 碼 標 籤 的 位 移 值 ( 位址)是十六位元。

Page 44: 第三章  CPU 與組合語言

44

 32-bit

基本程式架構需含:INCLUDE Ivrin32.inc 。

組譯及連結你的程式的批次檔名為make32.bat。資 料 及 程 式 碼 標 籤 的 位 移 值(位址)是三十二位元。

Page 45: 第三章  CPU 與組合語言

45

 32-bit16bit三十二位元程式轉換成十六位元程式,只有少數的地方需要改變:

INCLUDE 指 引 對 應 不 同 的 函 數庫 ,Ivrin32.inc Ivrin16.inc 。16bit 之資料區段需有

mov AX, @data mov DS, AX

組 譯 及 連 結 你 的 程 式 的 批 次 檔 名 為make32.batmake16.bat。

資料及程式碼標籤的位移值(位址)是是三十二位元十六位元。

Page 46: 第三章  CPU 與組合語言

46

指引指令舉幾個 MASM 常用指引為例:include等號指引: ( 範例)

EQU指引: ( 範例)

SEGMENT、ENDS

.CODE、 .STACK、 .DATA

Page 47: 第三章  CPU 與組合語言

47

等號指引等 號 指 引 ( equal-sign directive )連結符號名稱到整數運算式名稱 = 運算式例 :count=500

Page 48: 第三章  CPU 與組合語言

48

等號指引 ( 範例 )

例 :count=500

mov al,count

組譯後產生 mov al, 500

Page 49: 第三章  CPU 與組合語言

49

EQU指引EQU 指引連結符號名稱、整數常數或是任意文字定義為某運算式值

定義為另一個符號

定義為某< 文字 >

名稱 EQU 運算式

名稱 EQU < 文字… ..>

名稱 EQU 符號

Page 50: 第三章  CPU 與組合語言

50

 EQU範例Matrix1 equ10*10Matrix2 equ<10*10>.dataM1 WORD Matrix1M2 WORD Matrix2

M1 WORD 100M2 WORD “10*10”

運算式 ( 數值 )

文字 <>

Page 51: 第三章  CPU 與組合語言

51

=與 EQU比較= 與 EQU皆可定義常數。以 = 定義之常數,可以以 = 號重新定義,但不可以其他方式改變。以 EQU 定義則不可改變,改變時會產生 error ,因為 EQU 是屬於符號定義 ( 不只是數值 ) ,因此改變會造成重複定義變符號。

Page 52: 第三章  CPU 與組合語言

52

TEXTEQU

TEXTEQU 指 引 ,類似 EQU , 會建立 Microsoft 所稱的文字巨集第一種指定文字,

第二種指定既有文字巨集的內容,

第三種指定常數整數運算式。

名稱 TEXTEQU < 文字… ..>

名稱 TEXTEQU 文字巨集

名稱 TEXTEQU % 常數運算式

Page 53: 第三章  CPU 與組合語言

53

include

指令功能:組 譯 時 , 將 filename 內容,插入目前原始檔中 。 若filename 包含反斜線、分號、大於、小於、單引號、雙引號,則需以方括號包住。

相關指令IFDEFIFNDEFENDIF

指令格式:Include filename

filename 為欲含入組譯之檔案名稱

指令範例:INCLUDE my_file.inc// 載入 my_file.inc…

Page 54: 第三章  CPU 與組合語言

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

Page 55: 第三章  CPU 與組合語言

55

.CODE

指令功能:當與 .MODEL 一起使用時,表示名為 name 的程式區段開始。預設為 _TEXT( 與 model有關 ) 。

相關指令.DATA?.STACKSEGMENT ENDS.MODEL

指令格式:.STACK [[name]]

name 為程式區名稱

指令範例:.MODEL small….code test// 開始 test 程式區段

Page 56: 第三章  CPU 與組合語言

56

.SATCK

指令功能:當與 .MODEL 一起使用時,定 義 一堆疊區 段 。 .STACK會自動關閉堆疊敘述。

相關指令.DATA?.CODESEGMENT.MODEL

指令格式:.STACK [[size]]

size 為 堆 疊 大 小 , 內 定1024

指令範例:.MODEL small.STACK 512// 設定堆疊 512byte

Page 57: 第三章  CPU 與組合語言

57

.DATA

指令功能:當與 .MODEL 一起使用時,為已初始化之資料,開啟一鄰近資料區段( _DATA ),可定義資料變數於此區。

相關指令.DATA?.STACKSEGMENT.MODEL

指令格式:.DATA

指令範例:.MODEL small.dataA word 01hNum byte 3h

Page 58: 第三章  CPU 與組合語言

58

MASM 指令集每一種 CPU 有其特殊之指令集,以IA-32 CPU 為例:

ADD:加法指令。MOV:資料複製。CALL:呼叫副程式。JMP:跳躍至 某位址繼續執行。CMP : 比 較 兩 運 算 元 , 設 定STATUS 。INT:軟體中斷。

Page 59: 第三章  CPU 與組合語言

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

Page 60: 第三章  CPU 與組合語言

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

Page 61: 第三章  CPU 與組合語言

61

CALL

指令功能:將下個指令位址推入堆疊,並轉往目的 運 算原位 址 執行。如只近程呼叫,只壓入偏移值,否則區段與偏移皆壓入。

影響之 STATUS 位元O D I S Z A P C

指令格式:CALL 目的

目的 : nearlabel, mem16,farlabel , mem32, reg

指令範例:CALL Sub1…

Sub1: … // 副程式ret

Page 62: 第三章  CPU 與組合語言

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:

Page 63: 第三章  CPU 與組合語言

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: …

Page 64: 第三章  CPU 與組合語言

64

INT

指令功能:產生一個依序呼叫作業系統副程式之軟體中斷,這指令會 在 分支執 行 到 中斷程 式前,清除中斷旗 標並並STATUS,CS,IP推入堆疊。

影響之 STATUS 位元O D I S Z A P C

0

指令格式:INT 目的

目的 : imm

指令範例:MOV AH, 0AhINT 21h

// 呼叫 MS-DOS 中斷服務// 緩衝之鍵盤輸入功能