• 沒有找到結果。

本章目標

N/A
N/A
Protected

Academic year: 2022

Share "本章目標"

Copied!
26
0
0

加載中.... (立即查看全文)

全文

(1)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.1

本章目標

• 了解模組化與結構化程式設計技巧

• 了解80x86的程式連結與程式模組宣告方式

• 了解副程式、巢路副程式、與遞回副程式

• 了解副程式的參數傳遞方式

• 了解巨集指令的定義與使用

• 了解巨集指令相關的假指令

微算機原理與應用 第6 模組化程式設計

模組化程式設計

組合語言的模組化程式設計通常由下列幾個層次輔助完成:

1. 副程式(subroutine) 2. 組譯程式假指令 3. 巨集指令(macro)

4. 中斷結構(interrupt structure)

(2)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.3

典型的模組層次圖

主模組

模組 B 模組 C

模組 A

模組 A2

模組 A1 模組 C1

微算機原理與應用 第6 模組化程式設計

6.4

結構化程式設計

基本的模組結構只有下列三種:

1. 循序結構(sequential structure) 2. 選擇性結構(selection structure) 3. 重覆結構(iteration structure)

條件C成立

?

P1 P2

條件C成立

?

P

(a) REPEAT UNTIL 結構 (b) WHILE DO 結構 條件C成立

?

P

(3)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.5

結構化程式假指令

masm6.xx組譯程式的結構化程式設計的假指令:

• .IF… .ENDIF

• .IF … .ELSE … .ENDIF

• .IF … .ELSEIF … .ELSE … .ENDIF

• .REPEAT … .UNTIL

• .WHILE … .ENDW

微算機原理與應用 第6 模組化程式設計

masm結構化程式假指令中的關係與邏輯運算子

運算子 功能 運算子 功能

== 相等 <= 小於或相等

!= 不相等 & 位元測試

> 大於 ! NOT

>= 大於或相等 && AND

< 小於 || OR

(4)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.7

.IF ... .ENDIF結構的使用例

;ex6.1-3.asm

0000 START PROC FAR

0000 B9 0010 MOV CX,10H ;read 16 characters 0003 B4 08 READ_KBY: MOV AH,08H ;read a character 0005 CD 21 INT 21H ;from keyboard

.IF AL >= 'a' && AL <= 'z' 0007 3C 61 * cmp al, 'a'

0009 72 06 * jb @C0001 000B 3C 7A * cmp al, 'z' 000D 77 02 * ja @C0001 000F 2C 20 SUB AL,20H

.ENDIF 0011 *@C0001:

0011 8A D0 UP_CASE: MOV DL,AL ;display character 0013 B4 02 MOV AH,02H

0015 CD 21 INT 21H 0017 E2 EA LOOP READ_KBY

0019 B4 4C MOV AH,4CH ;return to MS-DOS 001B CD 21 INT 21H

001D START ENDP

微算機原理與應用 第6 模組化程式設計

6.8

.IF … .ELSEIF … .ELSE … .ENDIF結構的使用例

;ex6.1-4.asm ....

0005 B4 08 READ_KBY: MOV AH,08H ;read a character 0007 CD 21 INT 21H ;from keyboard

.IF AL >= 'a' && AL <= 'f' 0009 3C 61 * cmp al, 'a'

000B 72 08 * jb @C0001 ....

0011 2C 57 SUB AL,57H

.ELSEIF AL >= 'A' && AL <= 'F' 0013 EB 0E * jmp @C0004

0015 3C 41 *@C0001: cmp al, 'A' ....

001B 77 04 * ja @C0005 001D 2C 37 SUB AL,37H

.ELSE 001F EB 02 * jmp @C0008 0021 2C 30 *@C0005: SUB AL,30H

.ENDIF 0023 *@C0008:

0023 *@C0004:

0023 A2 0000 R MOV TEMP,AL ;store it

(5)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.9

.WHILE … .ENDW結構的使用例

;ex6.1-5.asm

0000 START PROC FAR

0000 32 C0 XOR AL,AL ;guarantee AL != 0DH .WHILE AL != 0DH

0002 EB 14 * jmp @C0001

0004 B4 08 *@C0002: READ_KBY: MOV AH,08H ;read a character 0006 CD 21 INT 21H ;from keyboard

.IF AL >= 'a' && AL <= 'z' 0008 3C 61 * cmp al, 'a'

....

0010 2C 20 SUB AL,20H .ENDIF

0012 0012 *@C0003:

0012 8A D0 UP_CASE: MOV DL,AL ;display character 0014 B4 02 MOV AH,02H

0016 CD 21 INT 21H .ENDW

0018 3C 0D *@C0001: cmp al, 00Dh 001A 75 E8 * jne @C0002

001C B4 4C MOV AH,4CH ;return to MS-DOS 001E CD 21 INT 21H

微算機原理與應用 第6 模組化程式設計

使用者程式執行的處理過程

原始程 式

目的程 組譯程式 式

載入程式 目的程 連結程式

式 載入記憶器中

的目的程式

程式模 組 程式模

...

執行時間 載入時間 連結時間

組譯時間

(6)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.11

堆疊節區宣告例

模組A 模組B

STACK_SEG SEGMENT STACK STACK_SEG SEGMENT STACK DW 40 DUP(0) DW 20 DUP(0)

TOP_STACK LABEL WORD TOP_STACK LABEL WORD STACK_SEG ENDS STACK_SEG ENDS

模組 A與模組 B 合併後之STACK 節區 (60個語句) STACK_SEG

TOP_STACK

微算機原理與應用 第6 模組化程式設計

6.12

程式模組宣告方式

模組A 模組B

DATA SEGMENT PUBLIC ‘DATA’ DATA SEGMENT PUBLIC ‘DATA_A’

DATA ENDS DATA ENDS

TEXT SEGMENT PUBLIC ‘CODE’ TEXT SEGMENT PUBLIC ‘CODE’

TEXT ENDS TEXT ENDS

模組 A與模組 B合併後 之DATA 節區(因兩者的 class名字不相同,因而仍 為兩個節區.)

模組 A 之 TEXT節區 模組 B 之 TEXT節區

模組 A與模組 B合併後 之TEXT節區(因兩者的 class名字相同,因而串接 成一個節區.)

模組 A 之 DATA節區

模組 B 之 DATA節區

(7)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.13

典型的程式模組宣告方式

CODE SEGMENT

ASSUME CS:CODE MAIN: ....

....

CALL NEAR PTR SUBT ;主程式模組 ....

SUBT PROC NEAR

.... ;副程式模組 SUBT ENDP

CODE ENDS

(a) 宣告方式一:主程式不視為一個副程式模組

 

}

12 4 3 4

可以省略

微算機原理與應用 第6 模組化程式設計

典型的程式模組宣告方式

CODE SEGMENT

ASSUME CS:CODE MAIN: PROC FAR ....

....

CALL NEAR PTR SUBT ....

....

SUBT PROC NEAR ....

....

SUBT ENDP MAIN ENDP CODE ENDS

(b) 宣告方式二:主程式視為一個副程式模組並採用巢路 宣告方式

 

 

 

 

副程式

主程式

12 4 3 4

可以省略

(8)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.15

典型的程式模組宣告方式

CODE SEGMENT

ASSUME CS:CODE MAIN: PROC FAR ....

....

CALL NEAR PTR SUBT ....

....

MAIN ENDP SUBT PROC NEAR ....

....

SUBT ENDP CODE ENDS

(c) 宣告方式二:主程式視為一個副程式模組但不採用巢 路宣告方式

 

 

副程式

主程式 可以省略

12 4 3 4

微算機原理與應用 第6 模組化程式設計

6.16

.model模組宣告方式

最常用的三種模式為:tiny、small、與flat。

1. tiny模式 2. small模式 3. medium模式 4. compact模式 5. large模式 6. huge模式 7. flat模式

.model 記憶器模式 [,模式選項]

(9)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.17

.model tiny模組宣告方式的使用例

;ex6.2-5.asm .model tiny

0000 .code ;code segment .startup

0100 *@Startup:

0100 START PROC FAR

0100 B9 0010 MOV CX,10H ;read 16 characters 0103 B4 08 READ_KBY: MOV AH,08H ;read a character 0105 CD 21 INT 21H ;from keyboard

.IF AL >= 'a' && AL <= 'z' 010F 2C 20 SUB AL,20H

.ENDIF

0111 8A D0 UP_CASE: MOV DL,AL ;display character 0113 B4 02 MOV AH,02H

0115 CD 21 INT 21H 0117 E2 EA LOOP READ_KBY

.EXIT ;return to MS-DOS 011D START ENDP

END

微算機原理與應用 第6 模組化程式設計

外部變數

• EXTRN <name>[,<name>....] :宣告<name>是在其它模組中定義

• PUBLIC <name>[,<name>....]:宣告<name>是在這模組中定義

的,但是允許其它模組使用。

(10)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.19

PUSH與POP動作

AX 65H

SP

堆疊 低位址

23H

SP

堆疊 低位址

23H AX 65H

65H

(a) PUSH AX

(b) POP AX AX 65H

SP

堆疊 低位址

23H SP

堆疊 低位址

23H AX 45H

45H 45H

微算機原理與應用 第6 模組化程式設計

6.20

80x86堆疊運算指令

指令 動作 OF SF ZF AF PF CF

PUSH imm8/16 PUSH imm32 (80386↑)

stkptr  stkptr - 2/4 (stkptr)  imm8/16/32

- - - - - -

PUSH reg16

PUSH reg32 (80386↑)

stkptr  stkptr - 2/4 (stkptr)  reg16/reg32

- - - - - -

PUSH sreg stkptr  stkptr - 2 (stkptr)  sreg

- - - - - -

PUSH m16

PUSH m32 (80386↑)

stkptr  stkptr - 2/4 (stkptr)(mem16)/(mem32)

- - - - - -

PUSHF stkptr  stkptr - 2

(stkptr)  FLAGS

- - - - - -

PUSHFD (80386↑) stkptr  stkptr - 4 (stkptr)  EFLAGS

- - - - - -

PUSHA (80286↑) 將 AX,CX,DX,BX,及原先的 SP,BP, SI,DI 存入堆疊。

- - - - - -

PUSHAD (80386↑) 將 EAX,ECX,EDX,EBX,及原先的 ESP,EBP,ESI,EDI 存入堆疊。

- - - - - -

(11)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.21

80x86堆疊運算指令

POP reg16

POP reg32 (80386↑)

reg16/reg32  (stkptr) stkptr  stkptr + 2/4

- - - - - -

POP sreg sreg  (stkptr) stkptr  stkptr + 2

- - - - - -

POP m16

POP m32 (80386↑)

(m16)/(m32)  (stkptr) stkptr  stkptr + 2/4

- - - - - -

POPF FLAGS  (stkptr)

stkptr  stkptr + 2

除了 VM 與 RF 兩個旗號位 元之外,其他旗號位元均會 受影響。

POPFD (80386↑) EFLAGS  (stkptr) stkptr  stkptr + 4

除了 VM 與 RF 兩個旗號位 元之外,其他旗號位元均會 受影響。

POPA (80286↑) 自堆疊依序取出 DI,SI,BP,SP,及 BX, DX,CX,AX 。

- - - - - -

POPAD (80386↑) 自堆疊依序取出 EDI,ESI,EBP, ESP, 及 EBX, EDX,ECX, EAX 。

- - - - - -

註:PUSH CS 為成立的指令,但是 POP CS 則為不成立的指令; stkptr 為 SP 或 ESP ,由位址 長度為 16 位元或 32 位元決定; reg32/m32 只能在 80386↑中使用。

微算機原理與應用 第6 模組化程式設計

堆疊區宣告

;ex6.3-2.asm

0000 STACK SEGMENT STACK 'STACK' 0000 0014 [ 0000 ] DW 20 DUP(0)

0028 STKTOP LABEL WORD 0028 STACK ENDS

;

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,SS:STACK

0000 B8 ---- R START: MOV AX,STACK ;initialize SS 0003 8E D0 MOV SS,AX ;and SP

0005 BC 0028 R MOV SP,OFFSET STKTOP 0008 CODE ENDS

END

(12)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.23

堆疊運算例

;ex6.3-3.asm

0000 CODE SEGMENT 'CODE' 0000 SRREGS PROC NEAR 0000 50 PUSH AX ;push ax 0001 53 PUSH BX ;push bx 0002 51 PUSH CX ;push cx 0003 52 PUSH DX ;push dx

; .

; .

; .

0004 5A POP DX ;restore dx 0005 59 POP CX ;restore cx 0006 5B POP BX ;restore bx 0007 58 POP AX ;restore ax 0008 C3 RET

0009 SRREGS ENDP 0009 CODE ENDS

END

微算機原理與應用 第6 模組化程式設計

6.24

堆疊運算例

SP

堆疊 低位址

23H AX 25H

BX 98H CX 3AH DX 6CH

(a) 四個 PUSH 指令執行前

SP

堆疊 低位址

23H 25H 98H 3AH 6CH AX 25H

BX 98H CX 3AH DX 6CH

(b) 四個 PUSH 指令執行後

SP

堆疊 低位址

23H AX 25H

BX 98H CX 3AH DX 6CH

(c) 四個 POP 指令執行前

SP

堆疊 低位址

23H A3H 29H 73H 13H AX A3H

BX 29H CX 73H DX 13H

(d) 四個 POP 指令執行後 A3H

29H 73H 13H

(13)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.25

80x86節區內副程式呼叫與歸回指令

指令 動作 OF SF ZF AF PF CF

CALL rel16 CALL rel32(80386↑)

若運算元長度為 16 位元則

儲存 IP 於堆疊; (80x86) IP  IP + rel16

EIP(EIP + rel16) ∧ 0000FFFFH (80386↑)

否則(運算元長度為 32 位元) (80386↑) 儲存 EIP 於堆疊;

EIP  EIP + rel32

- - - -

CALL reg16 CALL m16 CALL reg32 (80386↑)

CALL m32 (80386↑)

若運算元長度為 16 位元則

儲存 IP 於堆疊; (80x86) IP  reg16/(m16)

EIPEIP ∧ 0000FFFFH (80386↑) 否則(運算元長度為 32 位元) (80386↑) 儲存 EIP 於堆疊;

EIP  reg32/(m32)

- - - -

微算機原理與應用 第6 模組化程式設計

80x86節區內副程式呼叫與歸回指令

RET 若運算元長度為 16 位元則 (80x86) 自堆疊取回 IP;

EIP EIP ∧ 0000FFFFH (80386↑) 否則(運算元長度為 32 位元)

自堆疊取回 EIP;

- - - -

RET imm16 若運算元長度為 16 位元則 (80x86) 自堆疊取回 IP;

SP  SP + imm16

EIP  EIP ∧ 0000FFFFH (80386↑) 否則(運算元長度為 32 位元)

自堆疊取回 EIP;

ESP  ESP + imm16

- - - -

(14)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.27

80x86節區間副程式呼叫與歸回指令

指令 動作 OF SF ZF AF PF CF

(直接遠程呼叫) CALL ptr16:16 CALL ptr16:32 (80386↑)

若運算元長度為 16 位元則

儲存 CS 與 IP 於堆疊; (80x86) CS:IP  ptr16:16;

EIP  EIP ∧ 0000FFFFH; (80386↑) 否則(運算元長度為 32 位元) (80386↑) 儲存 CS 與 EIP 於堆疊;

CS:EIP  ptr16:32;

- - - -

(間接遠程呼叫) CALL m16:16 CALL m16:32 (80386↑)

若運算元長度為 16 位元則

儲存 CS 與 IP 於堆疊; (80x86) CS:IP  (m16:16);

EIP  EIP ∧ 0000FFFFH; (80386↑) 否則(運算元長度為 32 位元) (80386↑) 儲存 CS 與 EIP 於堆疊;

CS:EIP  (m16:32);

- - - -

微算機原理與應用 第6 模組化程式設計

6.28

80x86節區間副程式呼叫與歸回指令

RET 若運算元長度為 16 位元則

自堆疊取出 IP; (80x86) 自堆疊取出 CS;

EIP EIP ∧ 0000FFFFH; (80386↑) 否則(運算元長度為 32 位元) (80386↑) 自堆疊取出 EIP;

自堆疊取出 CS;

- - - -

RET imm16 若運算元長度為 16 位元則

自堆疊取出 IP; (80x86) 自堆疊取出 CS;

SP  SP + imm16

EIP EIP ∧ 0000FFFFH; (80386↑) 否則(運算元長度為 32 位元) (80386↑) 自堆疊取出 EIP;

自堆疊取出 CS;

ESP  ESP + imm16

- - - -

(15)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.29

副程式的使用例

;ex6.3-5.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 BCOUNT EQU 08H ;bit number 0000 47 TDATA DB 47H ;test data 0001 00 COUNT DB 00H ;result 0002 DATA ENDS

0000 STACK SEGMENT STACK ;stack segment 0000 0014 [ 0000 ] DW 20 DUP(0)

0028 STKTOP LABEL WORD 0028 STACK ENDS

....

微算機原理與應用 第6 模組化程式設計

副程式的使用例

0000 MAIN PROC NEAR

0000 B8 ---- R MOV AX,STACK ;initialize SS 0003 8E D0 MOV SS,AX ;and SP 0005 BC 0028 R MOV SP,OFFSET STKTOP 0008 B8 ---- R MOV AX,DATA ;initialize DS 000B 8E D8 MOV DS,AX

000D A0 0000 R MOV AL,TDATA ;pass parameter 0010 E8 0004 CALL NEAR PTR B1CNTS;to B1CNTS 0013 A2 0001 R MOV COUNT,AL ;save result 0016 C3 RET

0017 MAIN ENDP

;subroutine starts here.

0017 B1CNTS PROC NEAR ....

0026 C3 RET 0027 B1CNTS ENDP

(16)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.31

不同節區間的副程式使用例

;ex6.3-6.asm

;main program starts here.

0000 MAIN PROC NEAR

0000 B8 ---- R MOV AX,STACK ;initialize SS ....

0008 B8 ---- R MOV AX,DATA ;initialize DS 000B 8E D8 MOV DS,AX

000D A0 0000 R MOV AL,TDATA ;pass parameter 0010 9A ---- 0000 R CALL FAR PTRB1CNTS;to B1CNTS 0015 A2 0001 R MOV COUNT,AL ;save result 0018 C3 RET

...

;subroutine starts here.

;(another segment)

0000 CODE_A SEGMENT PUBLIC 'CODE_A' ASSUME CS:CODE_A,DS:DATA,SS:STACK 0000 B1CNTS PROC FAR

0000 B9 0008 MOV CX,BCOUNT;get count ....

000F CB RET 0010 B1CNTS ENDP

微算機原理與應用 第6 模組化程式設計

6.32

巢路副程式

主程式

RET

RET 1

2

3,5 4

6 7

主程式 (MAIN)

副程式 (W1CNTS)

副程式 (B1CNTS)

CALL W1CNTS 1

7 3

5 2

CALL B1CNTS 4

CALL B1CNTS 6

RET

RET RET

RET B1CNTS

W1CNTS

(17)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.33

巢路副程式例

;ex6.3-7.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 BCOUNT EQU 08H ;bit number 0000 7647 TDATA DW 7647H ;test data 0002 00 COUNT DB 00H ;result 0003 DATA ENDS

;

0000 STACK SEGMENT STACK 'STACK' 0000 0014 [ 0000 ] DW 20 DUP(0)

0028 STKTOP LABEL WORD 0028 STACK ENDS

;

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,SS:STACK

;

微算機原理與應用 第6 模組化程式設計

巢路副程式例

;main program starts here.

0000 MAIN PROC NEAR

0000 B8 ---- R MOV AX,STACK ;initialize SS ....

0008 B8 ---- R MOV AX,DATA ;initialize DS . ....

000D A1 0000 R MOV AX,TDATA ;pass parameter 0010 E8 0004 CALL NEAR PTR W1CNTS;to W1CNTS 0013 A2 0002 R MOV COUNT,AL ;save result 0016 C3 RET

....

0017 W1CNTS PROC NEAR

0017 E8 0008 CALL NEAR PTR B1CNTS 001A 86 C4 XCHG AL,AH ;exchange AL and AH 001C E8 0003 CALL NEAR PTR B1CNTS 001F 02 C4 ADD AL,AH

0021 C3 RET ;return to main program

;count the number of 1 bits in a byte 0022 B1CNTS PROC NEAR

0022 B9 0008 MOV CX,BCOUNT;get count ...

002F 8A C3 MOV AL,BL ;return result 0031 C3 RET

(18)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.35

副程式參數傳遞方式

在組合語言中,最常用的參數傳遞方式為:

1. 利用微處理器內部的暫存器;

2. 利用共同的記憶器區域;

3. 內線參數區(in-line parameter area);

4. 利用堆疊。

微算機原理與應用 第6 模組化程式設計

6.36

四種參數傳遞方式

類型 傳遞方法 特性

暫存器 利用微處理器內部暫存器 1. 參數數目受到限制。

2. 動態方式。

共同記憶器區 (參數區)

利用一塊公用的記憶器區域 1. 靜態方式:若該區域在組譯時即確

定時。

2. 動態方式:若該區域的基底位址是 由暫存器傳遞時。

內線參數區 參數儲存於 CALL 指令後,副程式

再計算出參數的位址。

1. 靜態方式。

2. 歸回位址必須處理。

堆疊 利用堆疊 動態方式。

(19)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.37

副程式的共用

(a) 可重入副程式方法 副程式 A 程式 1

程式 2 程式 3

程式 1, 2, 與 3 可共 用副程式 A

記憶器

(b) 普通副程式方法 程式 1, 2, 與 3 必須各自 擁有一份副程式 A之副本

副程式 A 程式 1

程式 2 程式 3

副程式 A 副程式 A 記憶器

微算機原理與應用 第6 模組化程式設計

遞回呼叫期間堆疊框的增長

局部變數 歸回位址

參數 堆疊

局部變數 歸回位址

參數 第一次呼叫

之堆疊框 第二次呼叫

之堆疊框

 

 

(20)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.39

遞迴副程式─N!計算程式

(a) 遞回呼叫 BP RET_ADR1

AX(1) 堆疊

第一次呼叫 第二次呼叫

BP RET_ADR1

AX(2) BP RET_ADR

AX(3) 第三次呼叫

 

 

 

(b) 反算過程 BP RET_ADR1

AX(1) 堆疊

BP RET_ADR1

AX(2) BP RET_ADR

AX(6) 第一次歸回

第二次歸回

第三次歸回

 

 

 

微算機原理與應用 第6 模組化程式設計

6.40

計算N! (N<=8)的程式例

;ex6.3-11.asm

;recursive and reentrant subroutine example

;----calculates N! (N factorial)

;assumes 0 < N <= 8 (i.e. the length of

;product is less than one word).

;parameters are passed on the stack

;

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0003 NUMBER DW 03H ;test data 0002 0000 RESULT DW 00H ;result 0004 DATA ENDS

;

0000 STACK SEGMENT STACK 'STACK' 0000 0032 [ 0000 ] DW 50 DUP(0)

0064 STKTOP LABEL WORD 0064 STACK ENDS

;

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,SS:STACK

(21)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.41

計算N! (N<=8)的程式例

;

;main program starts here.

;

0000 MAIN PROC NEAR

0000 B8 ---- R MOV AX,STACK ;initialize SS 0003 8E D0 MOV SS,AX ;and SP 0005 BC 0064 R MOV SP,OFFSET STKTOP 0008 B8 ---- R MOV AX,DATA ;initialize DS 000B 8E D8 MOV DS,AX

;the parameters are passed to and from

;subroutine on the stack

000D A1 0000 R MOV AX,NUMBER;pass parameter 0010 50 PUSH AX ;to FACTOR on the 0011 E8 0005 CALL NEAR PTR FACTOR;stack 0014 58 RET_ADR: POP AX ;get result and 0015 A3 0002 R MOV RESULT,AX ;save it 0018 C3 RET

0019 MAIN ENDP

微算機原理與應用 第6 模組化程式設計

計算N! (N<=8)的程式例

;

;subroutine starts here.

;

0019 FACTOR PROC NEAR

0019 55 PUSH BP ;make a stack frame 001A 8B EC MOV BP,SP ;and get parameter 001C 8B 46 04 MOV AX,[BP+4] ;from the stack 001F 83 E8 01 SUB AX,01 ;subtract 1 0022 75 02 JNE F_CONT ;if zero than 0024 EB 0B JMP SHORT RETURN ;return 0026 50 F_CONT: PUSH AX ;else call FACTOR 0027 E8 FFEF CALL NEAR PTR FACTOR 002A 58 RET_ADR1: POP AX ;backwards calculate 002B F7 66 04 MUL WORD PTR [BP+4];N! and save 002E 89 46 04 MOV [BP+4],AX;result in stack 0031 5D RETURN: POP BP ;pop BP and return 0032 C3 RET

0033 FACTOR ENDP 0033 CODE ENDS

END MAIN

(22)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.43

80286高階語言支援指令

指令 動作 OF SF ZF AF PF CF

ENTER imm16,0 產生副程式堆疊框(見內文說明)。 - - - -

ENTER imm16,1 產生副程式堆疊框(見內文說明)。 - - - -

ENTER imm16,imm8 產生副程式堆疊框(見內文說明)。 - - - -

LEAVE(16 位元位址) 儲存 BP 於 SP ,然後自堆疊取回 BP 。

- - - -

LEAVE(32 位元位址) (80386↑)

儲存 EBP 於 ESP ,然後自堆疊取回 EBP 。

- - - -

SETcc r8/m8

(80386↑) (cc 條件與 Jcc相同)

若 cc 條件滿足,則設定 r8/(m8) 為 1;

否則清除 r8/(m8) 為 0 。

- - - -

微算機原理與應用 第6 模組化程式設計

6.44

巨集指令定義

巨集指令名稱 MACRO 虛擬參數

ENDM

雛型碼

(23)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.45

巨集指令定義

例題 6.4-1 (巨集指令定義)

  定義一個巨集指令執行下列表式:

     X ← X+Y-3 解

解 解

解::::完整的巨集指令定義如程式 6.4-1 所示。

程式 6.4-1 定義巨集指令: X ← X+Y-3 ;ex6.4-1.asm

CAL_EXP MACRO X,Y ;X <- X+Y-3 MOV AX,X

ADD AX,Y SUB AX,3 MOV X,AX ENDM

微算機原理與應用 第6 模組化程式設計

巨集指令使用例

;ex6.4-2.asm

CAL_EXP MACRO X,Y ;X <- X+Y-3 MOV AX,X

ADD AX,Y SUB AX,3 MOV X,AX ENDM

;

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0012 OPR1 DW 12H

0002 0034 OPR2 DW 34H 0004 0056 OPR3 DW 56H 0006 0000 RESULT DW 00H 0008 DATA ENDS

;

(24)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.47

巨集指令使用例

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA 0000 START PROC NEAR 0000 B8 ---- R MOV AX,DATA 0003 8E D8 MOV DS,AX

CAL_EXP OPR1,OPR2 0005 A1 0000 R 1 MOV AX,OPR1 0008 03 06 0002 R 1 ADD AX,OPR2 000C 83 E8 03 1 SUB AX,3 000F A3 0000 R 1 MOV OPR1,AX 0012 A1 0000 R MOV AX,OPR1

CAL_EXP OPR3,OPR2 0015 A1 0004 R 1 MOV AX,OPR3 0018 03 06 0002 R 1 ADD AX,OPR2 001C 83 E8 03 1 SUB AX,3 001F A3 0004 R 1 MOV OPR3,AX 0022 03 06 0004 R ADD AX,OPR3 0026 C3 RET

0027 START ENDP 0027 CODE ENDS END START

微算機原理與應用 第6 模組化程式設計

6.48

不當的巨集指令使用

;ex6.4-3.asm ....

0000 B8 ---- R MOV AX,DATA 0003 8E D8 MOV DS,AX

CAL_EXP OPR1,54H 0005 A1 0000 R 1 MOV AX,OPR1 0008 83 C0 54 1 ADD AX,54H 000B 83 E8 03 1 SUB AX,3 000E A3 0000 R 1 MOV OPR1,AX 0011 A1 0000 R MOV AX,OPR1

CAL_EXP 23,OPR2 0014 B8 0017 1 MOV AX,23 0017 03 06 0002 R 1 ADD AX,OPR2 001B 83 E8 03 1 SUB AX,3

1 MOV 23,AX

ex643.asm(23): error A2001: immediate operand not allowed 001E 03 06 0004 R ADD AX,OPR3 0022 C3 RET

(25)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.49

標記重複定義問題

;ex6.4-5.asm

ABS_V MACRO X ;find absolute CMP X,00H ;value

JGE NEXT NEG X

NEXT: NOP

ENDM ....

ABS_V OPR1 ;macro call 0005 83 3E 0000 R 00 1 CMP OPR1,00H ;value 000A 7D 04 1 JGE NEXT

000C F7 1E 0000 R 1 NEG OPR1 0010 90 1 NEXT: NOP

0011 A1 0000 R MOV AX,OPR1 ABS_V OPR2 ;macro call 0014 83 3E 0002 R 00 1 CMP OPR2,00H ;value 0019 7D F5 1 JGE NEXT

001B F7 1E 0002 R 1 NEG OPR2 001F 90 1 NEXT: NOP

ex645.asm(22): error A2005: symbol redefinition : NEXT ABS_V(4): Macro Called From

微算機原理與應用 第6 模組化程式設計

局部標記宣告

;ex6.4-6.asm

ABS_V MACRO X ;find absolute LOCAL NEXT

CMP X,00H ;value JGE NEXT NEG X

NEXT: NOP

ENDM ....

ABS_V OPR1 ;macro call 0005 83 3E 0000 R 00 1 CMP OPR1,00H ;value 000A 7D 04 1 JGE ??0000

000C F7 1E 0000 R 1 NEG OPR1 0010 90 1 ??0000: NOP

0011 A1 0000 R MOV AX,OPR1 ABS_V OPR2 ;macro call 0014 83 3E 0002 R 00 1 CMP OPR2,00H ;value 0019 7D 04 1 JGE ??0001

001B F7 1E 0002 R 1 NEG OPR2 001F 90 1 ??0001: NOP

....

(26)

林銘波編著 --- 全華科技圖書公司

第6 模組化程式設計

6.51

巢路巨集指令

;ex6.4-7.asm

PSH_REG MACRO ;save registers PUSH AX

PUSH DX ENDM

;

POP_REG MACRO ;restore registers POP DX

POP AX ENDM

;

DIF_SQR MACRO X,Y,ERR ;find SQR(X-Y) PSH_REG ;call macro

MOV AX,X SUB AX,Y IMUL AX MOV ERR,AX

POP_REG ;call macro ENDM

微算機原理與應用 第6 模組化程式設計

6.52

巢路巨集指令

;

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0025 OPR1 DW 25H

0002 0047 OPR2 DW 47H 0004 0000 RESULT DW 00H 0006 DATA ENDS

....

0000 START PROC NEAR 0000 B8 ---- R MOV AX,DATA 0003 8E D8 MOV DS,AX

DIF_SQROPR1,OPR2,RESULT 0005 50 2 PUSH AX

0006 52 2 PUSH DX 0007 A1 0000 R 1 MOV AX,OPR1 000A 2B 06 0002 R 1 SUB AX,OPR2 000E F7 E8 1 IMUL AX

0010 A3 0004 R 1 MOV RESULT,AX 0013 5A 2 POP DX

0014 58 2 POP AX 0015 C3 RET

....

參考文獻

相關文件

第四章 直角座標與二元一次方程式.

第四章 直角座標與二元一次方程式.

觀念學習一 速率公式的變化 對應能力指標. 6-n-08

微算機基本原理與應用 第15章

高等電腦輔助設計與製造 (Advanced Computer Aided Design and Manufacturing).

貼近學生生活 增加學習興趣 善用應用機會 提升表達能力 借用同儕協作 提升學習動機 豐富學習經歷

應用閉合電路原理解決生活問題 (常識) 應用設計循環進行設計及改良作品 (常識) 以小數加法及乘法計算成本 (數學).

也就是設定好間隔時間(time slice)。所有的 程序放在新進先出的佇列裡面,首先CPU