• 沒有找到結果。

本章目標

N/A
N/A
Protected

Academic year: 2022

Share "本章目標"

Copied!
24
0
0

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

全文

(1)

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

第4章 基本組合語言程式設計

4.1

本章目標

• 了解80x86的定址方式與指令使用

• 了解80x86的資料轉移指令與程式設計

• 了解80x86的算術運算指令與程式設計

• 了解80x86的分歧(跳躍)指令與程式設計

• 了解組合語言程式的迴路設計方法

• 了解組合語言程式的迴路指令與應用

微算機原理與應用 第4章 基本組合語言程式設計

4.2

80x86各種定址方式的格式

定址方式 格式 有效位址

立即資料定址 exp

暫存器定址 reg

直接定址 Var + exp/Var-exp Var + exp/Var-exp

暫存器間接定址 [reg] reg

暫存器相對定址 Var[reg + disp]或[reg + disp] Var + reg + disp 或 reg + disp

基底指標定址 [reg1][reg2] reg1 + reg2

基底指標相對定址 Var[reg1 + disp1][reg2 + disp2]

或[reg1 + disp1][reg2 + disp2]

Var + reg1 + disp1 + reg2 + disp2 或 reg1 + disp1 + reg2 + disp2

倍率指標定址 [reg*SF] reg*SF

倍率指標相對定址 Var[reg*SF + disp] Var + reg*SF + disp 倍率基底指標定址 [reg1][reg2*SF] reg1 + reg2*SF 倍率基底指標相對定址 Var[reg1 + dsip1][reg2*SF + disp2]或

[reg1 + dsip1][reg2*SF + disp2]

Var + reg1 + disp1 + reg2*SF + disp2 或 reg1 + disp1 + reg2*SF + disp2

註: 1. disp, disp1, disp2 在 16 位元有效位址時可以為 8 位元或 16 位元;在 32 位元有效位 址時可以為 8 位元或 32 位元。

2. SF 可以為 1,2,4,或 8 。 3. reg, reg1,與 reg2 之選用,請參第 3.4 節。

(2)

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

第4章 基本組合語言程式設計

4.3

定址方式與各種運算元長度

;ex4.1-1.asm ....

.386

;32-bit operand size data segment

0000 DATA32 SEGMENT PUBLIC 'DATA' USE16 0000 0047 OPR1 DW 0047H

0002 00000047 OPR2 DD 0047H 0006 DATA32 ENDS

;32-bit addressing size code segment

0000 CODE32 SEGMENT PUBLIC 'CODE' USE16 ASSUME CS:CODE32,DS:DATA32

0000 ADD_MODE PROC NEAR

;16-bit addressing and 16-bit operand size.

0000 B8 0034 MOV AX,034H ;immediate 0003 8B D8 MOV BX,AX ;register 0005 A1 0000 R MOV AX,OPR1;direct 0008 8B 0F MOV CX,[BX] ;register indirect 000A 8B 87 0000 R MOV AX,OPR1[BX];register-relative 000E 8B 01 MOV AX,[BX][DI] ;based-indexed

;based-indexed-relative 0010 8B 81 0000 R MOV AX,OPR1[BX][DI]

微算機原理與應用 第4章 基本組合語言程式設計

4.4

定址方式與各種運算元長度

;32-bit addressing and 32-bit operand size.

0014 67& 66| 8B 1C CD MOV EBX,[ECX*8] ;scaled-indexed 00000000

;scaled-based-indexed

001D 67& 66| 8B 1C 78 MOV EBX,[EAX][EDI*2];based-indexed

;scaled-based-indexed-relative

0022 67& 66| 8B 9C B9 MOV EBX,OPR2[ECX][EDI*4]

00000002 R

;Mixed use of 16/32-bit operand size

;and addressing.

;16-bit addressing and operand size 002B 8B 07 MOV AX,[BX]

;32-bit addressing and 16-bit operand size 002D 67&8B 03 MOV AX,[EBX]

;16-bit addressing and 32-bit operand size 0030 66|8B 07 MOV EAX,[BX]

0033 ADD_MODE ENDP 0033 CODE32 ENDS

END

(3)

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

第4章 基本組合語言程式設計

4.5

定址方式與各種運算元長度

;ex4.1-2.asm

;Some examples of the notations of

;addressing modes .386

;32-bit operand size data segment

00000000 DATA32 SEGMENT PUBLIC 'DATA' USE32 00000000 00000047 OPR2 DD 0047H

0004 DATA32 ENDS

;32-bit addressing size code segment

00000000 CODE32 SEGMENT PUBLIC 'CODE' USE32 ASSUME CS:CODE32,DS:DATA32

00000000 ADD_MODE PROC NEAR

;32-bit addressing and 32-bit operand size.

00000000 B8 00000034 MOV EAX,034H ;immediate 00000005 8B D8 MOV EBX,EAX ;register 00000007 A1 00000000 R MOV EAX,OPR2;direct 0000000C 8B 1B MOV EBX,[EBX] ;register indirect 0000000E 8B 9B 00000000 R MOV EBX,OPR2[EBX];register-relative 00000014 8B 1C 07 MOV EBX,[EAX][EDI] ;based-indexed

微算機原理與應用 第4章 基本組合語言程式設計

4.6

定址方式與各種運算元長度

;based-indexed-relative

00000017 8B 9C 0F MOV EBX,OPR2[ECX][EDI]

00000000 R

0000001E 8B 1C CD MOV EBX,[ECX*8] ;scaled-indexed 00000000

;scaled-based-indexed

00000025 8B 1C 78 MOV EBX,[EAX][EDI*2];based-indexed

;scaled-based-indexed-relative

00000028 8B 9C B9 MOV EBX,OPR2[ECX][EDI*4]

00000000 R

;Mixed use of 16/32-bit operand size

;and addressing.

;16-bit addressing and operand size 0000002F 67& 66|8B 07 MOV AX,[BX]

;32-bit addressing and 16-bit operand size 00000033 66|8B 03 MOV AX,[EBX]

;16-bit addressing and 32-bit operand size 00000036 67&8B 07 MOV EAX,[BX]

00000039 ADD_MODE ENDP 0039 CODE32 ENDS

END

(4)

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

第4章 基本組合語言程式設計

4.7

80x86資料轉移指令

指令 動作 OF SF ZF AF PF CF

MOV mem,ACC (mem) ACC - - - -

MOV ACC,mem ACC(mem) - - - -

MOV reg1,reg2 reg1reg2 - - - -

MOV mem,reg (mem) reg - - - -

MOV reg,mem reg(mem) - - - -

MOV reg,data regdata - - - -

MOV mem,data (mem) data - - - -

MOV sreg,reg16 sreg reg16 - - - -

MOV sreg,m16 sreg (m16) - - - -

MOV reg16,sreg reg16 sreg - - - -

MOV m16,sreg (m16) sreg - - - -

微算機原理與應用 第4章 基本組合語言程式設計

4.8

80x86資料轉移指令

XCHG ACC,reg ACC ↔ reg - - - - - -

XCHG mem,reg (mem) ↔ reg - - - - - -

XCHG reg1,reg2 reg1 ↔ reg2 - - - -

BSWAP r32 TEMP  r32

r32(7:0) ↔ TEMP(31:24) r32(15:8) ↔ TEMP(23:16)

- - - -

LEA r16/32,m16/32 r16/32  (m16/32) - - - -

Lsreg r16,m16:16 r16  (m16:16) sreg  (m16:16 + 2)

- - - -

Lsreg r32,m16:32 r32  (m16:32) sreg  (m16:32 + 4)

- - - -

(5)

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

第4章 基本組合語言程式設計

4.9

MOV 指令與直接定址

;ex4.2-2.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

;Exchange two words in memory

;using absolute addressing mode 0000 CODE SEGMENT PUBLIC 'CODE'

ASSUME CS:CODE,DS:DATA 0000 SWAP PROC NEAR

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

0005 A1 0000 R MOV AX,OPR1 ;get opr1 0008 8B 1E 0002 R MOV BX,OPR2 ;get opr2 000C A3 0002 R MOV OPR2,AX ;save opr1 000F 89 1E 0000 R MOV OPR1,BX ;save opr2 0013 C3 RET

0014 SWAP ENDP 0014 CODE ENDS END SWAP

微算機原理與應用 第4章 基本組合語言程式設計

4.10

MOV指令與暫存器間接定址

;ex4.2-3.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

....

....

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

0005 8D 36 0000 R LEA SI,OPR1 ;set up pointers 0009 8D 3E 0002 R LEA DI,OPR2

000D 8B 04 MOV AX,[SI] ;get opr1 000F 8B 1D MOV BX,[DI] ;get opr2 0011 89 05 MOV [DI],AX ;save opr1 0013 89 1C MOV [SI],BX ;save opr2 0015 C3 RET

0016 SWAP ENDP 0016 CODE ENDS END SWAP

(6)

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

第4章 基本組合語言程式設計

4.11

MOV指令與暫存器相對定址

;ex4.2-4.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

....

....

0000 SWAP PROC NEAR

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

0005 BE 0000 MOV SI,00H ;zero SI 0008 8B 84 0000 R MOV AX,OPR1[SI] ;get opr1 000C 8B 9C 0002 R MOV BX,OPR2[SI] ;get opr2 0010 89 84 0002 R MOV OPR2[SI],AX ;save opr1 0014 89 9C 0000 R MOV OPR1[SI],BX ;save opr2 0018 C3 RET

0019 SWAP ENDP 0019 CODE ENDS END SWAP

微算機原理與應用 第4章 基本組合語言程式設計

4.12

MOV指令與基底指標定址

;ex4.2-5.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

....

....

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

0005 8D 36 0000 R LEA SI,OPR1 ;set up pointers 0009 8D 3E 0002 R LEA DI,OPR2

000D BB 0000 MOV BX,00H ;zero BX 0010 8B 00 MOV AX,[BX][SI] ;get opr1 0012 8B 09 MOV CX,[BX][DI] ;get opr2 0014 89 01 MOV [BX][DI],AX ;save opr1 0016 89 08 MOV [BX][SI],CX ;save opr2 0018 C3 RET

0019 SWAP ENDP 0019 CODE ENDS END SWAP

(7)

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

第4章 基本組合語言程式設計

4.13

MOV指令與基底指標相對定址

;ex4.2-6.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

....

....

0000 SWAP PROC NEAR

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

0005 BE 0000 MOV SI,00H ;zero SI 0008 8B DE MOV BX,SI ;zero BX

000A 8B 80 0000 R MOV AX,OPR1[BX][SI] ;get opr1 000E 8B 88 0002 R MOV CX,OPR2[BX][SI] ;get opr2 0012 89 80 0002 R MOV OPR2[BX][SI],AX ;save opr1 0016 89 88 0000 R MOV OPR1[BX][SI],CX ;save opr2 001A C3 RET

001B SWAP ENDP 001B CODE ENDS END SWAP

微算機原理與應用 第4章 基本組合語言程式設計

4.14

節區超越前標的使用

;ex4.2-7.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 OPR1 DW 0047H

0002 0023 OPR2 DW 0023H 0004 DATA ENDS

....

....

0000 SWAP PROC NEAR

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

0005 BD 0000 MOV BP,00H ;zero BP

0008 3E: 8B 86 0000 R MOV AX,DS:OPR1[BP] ;get opr1 000D 3E: 8B 9E 0002 R MOV BX,DS:OPR2[BP] ;get opr2 0012 3E: 89 86 0002 R MOV DS:OPR2[BP],AX ;save opr1 0017 3E: 89 9E 0000 R MOV DS:OPR1[BP],BX ;save opr2 001C C3 RET

001D SWAP ENDP 001D CODE ENDS END SWAP

(8)

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

第4章 基本組合語言程式設計

4.15

指令BSWAP的動作

23H 42H 3BH 05H

31 24 23 16 15 8 7 0 位元

位元 05H 3BH 42H 23H

31 24 23 16 15 8 7 0

微算機原理與應用 第4章 基本組合語言程式設計

4.16

加法運算與旗號位元的關係

運算 SF ZF OF CF 帶號數 未帶號數

01000000 + 00101110 01101110 01000110 + 01010000 10010110 01001110 + 10110010 100000000 10110010 + 10100000 101010010

0 0 0 0

1 0 1 0

0 1 0 1

0 0 1 1

+64 + +46 + 110 +70 + +80 - 106(溢位) +78 + -78 + 0 -78 + -96 + 82(溢位)

64 + 46 110 70 + 80 150 78 + 178 256(C=1) 178 + 160 82(C=1)

(9)

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

第4章 基本組合語言程式設計

4.17

80x86二進制加法與減法指令

指令 動作 OF SF ZF AF PF CF

ADD reg1,reg2 reg1  reg1 + reg2 * * * * * *

ADD reg,mem reg  reg + (mem) * * * * * *

ADD mem,reg (mem)  reg + (mem) * * * * * *

ADD reg,data reg  reg + data * * * * * *

ADD mem,data (mem)  (mem) + data * * * * * *

ADD ACC,data ACC  ACC + data * * * * * *

ADC reg1,reg2 reg1  reg1 + reg2 + C * * * * * *

ADC reg,mem reg  reg + (mem) + C * * * * * *

ADC mem,reg (mem)  reg + (mem) + C * * * * * *

ADC reg,data reg  reg + data + C * * * * * *

ADC mem,data (mem)  (mem) + data + C * * * * * *

ADC ACC,data ACC  ACC + data + C * * * * * *

微算機原理與應用 第4章 基本組合語言程式設計

4.18

80x86二進制加法與減法指令

SUB reg1,reg2 reg1  reg1 - reg2 * * * * * *

SUB reg,mem reg  reg - (mem) * * * * * *

SUB mem,reg (mem)  (mem) - reg * * * * * *

SUB reg,data reg  reg - data * * * * * *

SUB mem,data (mem)  (mem) - data * * * * * *

SUB ACC,data ACC  ACC - data * * * * * *

SBB reg1,reg2 reg1  reg1 - reg2 - C * * * * * *

SBB reg,mem reg  reg - (mem) - C * * * * * *

SBB mem,reg (mem)  (mem) - reg - C * * * * * *

SBB reg,data reg  reg - data - C * * * * * *

SBB mem,data (mem)  (mem) - data - C * * * * * *

SBB ACC,data ACC  ACC - data - C * * * * * *

CMP reg1,reg2 reg1 - reg2 * * * * * *

CMP reg,mem reg - (mem) * * * * * *

CMP mem,reg (mem) - reg * * * * * *

CMP reg,data reg - data * * * * * *

CMP mem,data (mem) - data * * * * * *

CMP ACC,data ACC - data * * * * * *

註: 在旗號欄中的“*“表示該旗號的狀態會受指令的影響。

(10)

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

第4章 基本組合語言程式設計

4.19

單精確制加法

;ex4.3-1.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 ADDEND DW 0047H ;addend 0002 0023 AUGEND DW 0023H ;augend 0004 0000 RESULT DW 0000H ;result 0006 DATA ENDS

;single-precision addition

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA 0000 ADD16 PROC NEAR

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

0005 A1 0000 R MOV AX,ADDEND ;get addend 0008 03 06 0002 R ADD AX,AUGEND ;add them 000C A3 0004 R MOV RESULT,AX ;store result 000F C3 RET

0010 ADD16 ENDP 0010 CODE ENDS END ADD16

微算機原理與應用 第4章 基本組合語言程式設計

4.20

雙精確制加法動作

ADDEND+2 ADDEND

AUGEND+2 AUGEND

CF

RESULT+2 RESULT

+

ADC ADD

0023 1547H + 0065 EB23H 0089 006AH

(11)

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

第4章 基本組合語言程式設計

4.21

雙精確制(32位元)加法

;ex4.3-2.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 ADDEND DW 0047H ;addend 0002 0023 DW 0023H

0004 0023 AUGEND DW 0023H ;augend 0006 0065 DW 0065H

0008 0000 RESULT DW 0000H ;result 000A 0000 DW 0000H

....

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

0005 A1 0000 R MOV AX,ADDEND ;get addend(lo) 0008 03 06 0004 R ADD AX,AUGEND ;add them 000C A3 0008 R MOV RESULT,AX ;store result(lo) 000F A1 0002 R MOV AX,ADDEND+2;get addend(hi) 0012 13 06 0006 R ADC AX,AUGEND+2;add them 0016 A3 000A R MOV RESULT+2,AX;save result(hi) 0019 C3 RET

001A ADD32 ENDP 001A CODE ENDS END ADD32

微算機原理與應用 第4章 基本組合語言程式設計

4.22

減法運算與旗號位元的關係

運算 SF ZF OF CF 帶號數 未帶號數

01000000 - 00101110 100010010

01000110 - 01010000 011110110

01001110 - 10110010 010011100

10110010 - 10100000 100010010

0 0 0 0

1 0 0 1

1 0 1 1

0 0 0 0

+64(大) - +46(小) + 18

+70(小) - +80(大) - 10

+78 - -78 - 100(溢位) -78(大) - -96(小) + 18

64(大) - 46(小) 18

70(小) - 80(大) 246(B=1)

78 - 178 156

178(大) - 160(小) 18

10110010 - 11000100 011101110

01100000 - 10110010 010101110

10110010 - 01111111 100110011

1 0 0 1

1 0 1 1

0 0 1 0

-78(小) - -60(大) - 18

+96(大) - -78(小) - 82(溢位) -78(小) - +127(大) + 51(溢位)

178(小) - 196(大) 238(B=1)

96(小) - 178(大) 238(B=1)

178(大) - 127(小) 51

(12)

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

第4章 基本組合語言程式設計

4.23

單精確制減法

;ex4.3-3.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0023 MINUEND DW 0023H ;minuend 0002 0047 SUBEND DW 0047H ;subend 0004 0000 RESULT DW 0000H ;result 0006 DATA ENDS

;single-precision subtraction

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA 0000 SUB16 PROC NEAR

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

0005 A1 0000 R MOV AX,MINUEND ;get minuend 0008 2B 06 0002 R SUB AX,SUBEND ;subtract them 000C A3 0004 R MOV RESULT,AX ;store result 000F C3 RET

0010 SUB16 ENDP 0010 CODE ENDS END SUB16

微算機原理與應用 第4章 基本組合語言程式設計

4.24

雙精確制減法動作

MINUEND+2 MINUEND

SUBEND+2 SUBEND

BF

RESULT+2 RESULT -

SBB SUB

7128 0456H -0100 3450H - 1

7027 D006H

(13)

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

第4章 基本組合語言程式設計

4.25

雙精確制減法

;ex4.3-4.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0023 MINUEND DW 0023H ;minuend 0002 0065 DW 0065H

0004 0047 SUBEND DW 0047H ;subtrahend 0006 0023 DW 0023H

0008 0000 RESULT DW 0000H ;result 000A 0000 DW 0000H

....

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

0005 A1 0000 R MOV AX,MINUEND;get minuend(low) 0008 2B 06 0004 R SUB AX,SUBEND ;subtract them 000C A3 0008 R MOV RESULT,AX ;store result(low) 000F A1 0002 R MOV AX,MINUEND+2;get minuend(high) 0012 1B 06 0006 R SBB AX,SUBEND+2 ;subtract them 0016 A3 000A R MOV RESULT+2,AX;save result(high) 0019 C3 RET

001A SUB32 ENDP 001A CODE ENDS END SUB32

微算機原理與應用 第4章 基本組合語言程式設計

4.26

80x86單運算元指令

指令 動作 OF SF ZF AF PF CF

INC reg reg  reg + 1 * * * * * -

INC mem (mem)  (mem) + 1 * * * * * -

DEC reg reg  reg-1 * * * * * -

DEC mem (mem)  (mem) - 1 * * * * * -

NEG reg reg  0 - reg * * * * * *

NEG mem (mem)  0 - (mem) * * * * * *

NOT reg reg  reg - - - -

NOT mem (mem)  (mem) - - - -

(14)

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

第4章 基本組合語言程式設計

4.27

80x86乘法與除法運算指令

指令 動作 OF SF ZF AF PF CF

MUL r8/m8 AXAL×r8/(m8) * U U U U *

MUL r16/m16 DX:AXAX×r16/(m16) * U U U U * MUL r32/m32 EDX:EAXEAX×r32/(m32) * U U U U *

IMUL r8/m8 AXAL×r8/(m8) * U U U U *

IMUL r16/m16 DX:AXAX×r16/(m16) * U U U U * IMUL r32/m32 EDX:EAXEAX×r32/(m32) * U U U U * IMUL r16,r16/m16 r16r16×r16/(m16) * U U U U * IMUL r32,r32/m32 r32r32×r32/(m32) * U U U U * IMUL r16,r16/m16,imm16 r16r16/(m16)×imm16 * U U U U * IMUL r32,r32/m32,imm32 r32r32/(m32)×imm32 * U U U U * IMUL r16,imm16 r16r16×imm16 * U U U U * IMUL r32,imm32 r32r32×imm32 * U U U U * DIV r8/m8 AH:ALAX÷r8/(m8) U U U U U U DIV r16/m16 DX:AXDX:AX÷r16/(m16) U U U U U U DIV r32/m32 EDX:EAXEDX:EAX÷r32/(m32) U U U U U U

IDIV r8/m8 AH:ALAX÷r8/(m8) U U U U U U

IDIV r16/m16 DX:AXDX:AX÷r16/(m16) U U U U U U IDIV r32/m32 EDX:EAXEDX:EAX÷r32/(m32) U U U U U U 註: 在旗號欄中的”U”表示在指令執行後該旗號為不確定狀態。

微算機原理與應用 第4章 基本組合語言程式設計

4.28

16位元乘法

;ex4.3-5.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0047 MULTER DW 0047H ;multer 0002 0023 MULTEND DW 0023H ;multend 0004 0000 RESULT DW 0000H ;result(low) 0006 0000 DW 0000H ;result(high) 0008 DATA ENDS

;single-precision multiplication

0000 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA 0000 MUL16 PROC NEAR

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

0005 A1 0000 R MOV AX,MULTER ;get multer 0008 F7 26 0002 R MUL MULTEND ;multiply them 000C A3 0004 R MOV RESULT,AX ;save result(lo) 000F 89 16 0006 R MOV RESULT+2,DX;save result(hi) 0013 C3 RET

0014 MUL16 ENDP 0014 CODE ENDS END MUL16

(15)

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

第4章 基本組合語言程式設計

4.29

16位元除法

;ex4.3-6.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 0023 DIVIDEND DW 0023H ;dividend 0002 0010 DW 0010H

0004 0047 DIVISOR DW 0047H ;divisor 0006 0000 QUOTIENT DW 0000H ;result---quotient 0008 0000 REMAINDER DW 0000H ;result---remainder 000A DATA ENDS

....

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

0005 8B 16 0002 R MOV DX,DIVIDEND+2 ;get dividend 0009 A1 0000 R MOV AX,DIVIDEND ;

000C F7 36 0004 R DIV DIVISOR ;divide 0010 A3 0006 R MOV QUOTIENT,AX ;save quotient 0013 89 16 0008 R MOV REMAINDER,DX;save remainder 0017 C3 RET

0018 DIV16 ENDP 0018 CODE ENDS

END DIV16

微算機原理與應用 第4章 基本組合語言程式設計

4.30

併裝BCD加法的調整程序

49 58 +

107

0 1 0 0 0 1 0 1

1 0 0 1 1 0 0 0 +

1 0 1 0 0 0 0 1 AC = 1

0 1 1 0 0 1 1 0 +

0 0 0 0 0 1 1 1 1

進位 1 0 7

因AC = 1所 以加0110 因1010大於

1001所以加0110

總和(有進位)

(16)

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

第4章 基本組合語言程式設計

4.31

併裝BCD減法的調整程序

51 69 -

82

0 1 0 1 1 0 0 1

0 0 0 1 0 1 1 1 +

1 1 1 0 1 0 0 0 AC = 0

1 0 1 0 1 0 1 0 +

1 0 0 0 0 0 1 0 1

借位 = 0 8 2

因AC = 0所 以減0110 因1110大於

1001所以減0110

差(有借位) (69取2補數)

微算機原理與應用 第4章 基本組合語言程式設計

4.32

80x86併裝BCD調整指令

指令 動作 OF SF ZF AF PF CF

DAA 在加算之後調整 AL 內容為十進制。 U * * * * *

DAS 在減算之後調整 AL 內容為十進制。 U * * * * *

(17)

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

第4章 基本組合語言程式設計

4.33

單精確制併裝BCD加法

;ex4.3-9.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 47 ADDEND DB 47H ;addend 0001 23 AUGEND DB 23H ;augend 0002 00 00 RESULT DB 00H,00H ;result 0004 DATA ENDS

....

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

0005 A0 0000 R MOV AL,ADDEND ;get addend 0008 B4 00 MOV AH,00H ;clear AH 000A 02 06 0001 R ADD AL,AUGEND ;add them 000E 27 DAA ;decimal adjust 000F A2 0002 R MOV RESULT,AL ;save result(lo) 0012 80 D4 00 ADC AH,00H ;get carry

0015 88 26 0003 R MOV RESULT+1,AH;save result(hi) 0019 C3 RET

001A BCDADD ENDP 001A CODE ENDS

END BCDADD

微算機原理與應用 第4章 基本組合語言程式設計

4.34

單精確制併裝BCD減法

;ex4.3-10.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 47 MINUEND DB 47H ;minuend 0001 23 SUBEND DB 23H ;subend 0002 00 RESULT DB 00H ;result 0003 DATA ENDS

....

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

0005 A0 0000 R MOV AL,MINUEND ;get minuend 0008 2A 06 0001 R SUB AL,SUBEND ;subtract them 000C 2F DAS ;decimal adjust 000D A2 0002 R MOV RESULT,AL ;store result 0010 C3 RET

0011 BCDSUB ENDP 0011 CODE ENDS

END BCDSUB

(18)

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

第4章 基本組合語言程式設計

4.35

80x86未併裝BCD算術調整指令

指令 動作 OF SF ZF AF PF CF

AAA 在加算之後調整 AL 內容為未併裝 BCD 。 U U U * U *

AAS 在減算之後調整 AL 內容為未併裝 BCD 。 U U U * U *

AAM 在乘算之後調整 AL 內容為未併裝 BCD 。 U * * U * U

AAD 在除算之前調整 AH:AL 的未併裝 BCD 為二進制值。 U * * U * U

微算機原理與應用 第4章 基本組合語言程式設計

4.36

未併裝BCD加法

;ex4.3-11.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 37 ADDEND DB 37H ;ASCII '7' 0001 33 AUGEND DB 33H ;ASCII '3' 0002 0000 RESULT DW 00H ;result 0004 DATA ENDS

....

0000 ASCIIA PROC NEAR

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

0005 A0 0000 R MOV AL,ADDEND ;get addend 0008 B4 00 MOV AH,00H ;clear AH 000A 02 06 0001 R ADD AL,AUGEND ;add them 000E 37 AAA ;decimal adjust 000F A3 0002 R MOV RESULT,AX ;store result 0012 C3 RET

0013 ASCIIA ENDP 0013 CODE ENDS END ASCIIA

(19)

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

第4章 基本組合語言程式設計

4.37

未併裝BCD乘法

;ex4.3-12.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 37 MULTPLR DB 37H ;ASCII '7' 0001 33 MULTEND DB 33H ;ASCII '3' 0002 0000 RESULT DW 00H ;result 0004 DATA ENDS

....

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

0005 A0 0000 R MOV AL,MULTPLR ;get multiplier 0008 24 0F AND AL,0FH ;clear upper nibble 000A 8A 1E 0001 R MOV BL,MULTEND ;get multend 000E 80 E3 0F AND BL,0FH ;clear upper nibble 0011 F6 E3 MUL BL ;multiply them 0013 D4 0A AAM ;adjust result 0015 A3 0002 R MOV RESULT,AX ;store result 0018 C3 RET

0019 ASCIIM ENDP 0019 CODE ENDS END ASCIIM

微算機原理與應用 第4章 基本組合語言程式設計

4.38

未併裝BCD除法

;ex4.3-13.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 3733 DIVIDND DW 3733H ;ASCII '73' 0002 33 DIVISOR DB 33H ;ASCII '3' 0003 RESULT LABEL WORD

0003 00 QUOTIENT DB 00H ;result(18H) 0004 00 REMAINDR DB 00H ;(01H)

....

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

0005 8A 1E 0002 R MOV BL,DIVISOR ;get divisor 0009 80 E3 0F AND BL,0FH ;clear upper nibble 000C A1 0000 R MOV AX,DIVIDND ;get dividend 000F 25 0F0F AND AX,0F0FH;clear upper nibbles 0012 D5 0A AAD ;adjust using AH 0014 F6 F3 DIV BL ;divide BL

0016 A3 0003 R MOV RESULT,AX ;store result 0019 C3 RET

001A ASCIID ENDP 001A CODE ENDS END ASCIID

(20)

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

第4章 基本組合語言程式設計

4.39

80x86條件性分歧指令

指令 動作 OF SF ZF AF PF CF

Jcc rel8 Jcc rel16 Jcc rel32

在 cc 條件成立時

IP ←IP + 符號擴展(rel8)(80286↓) EIP ←EIP + 符號擴展之(rel8/16/32) 若運算元長度為 16 位元則

EIP ←EIP AND 0000FFFFH 否則繼續執行下一個指令。

- - - -

註註

註:cc = Z/E, NZ/NE, S, NS, O, NO, P/PE, NP/PO, B/NAE, C, NB/AE, L/NGE, GE/NL, LE/NG, G/NLE, NC, BE/NA, NBE/A 。

微算機原理與應用 第4章 基本組合語言程式設計

4.40

80x86條件性分歧指令的測試條件(cc)

類型 符號 若…則分岐 條件

單一位元

C NC S NS E/Z NE/NZ O NO P/PE NP/PO

進位 未進位 為負 為正 相等( = )/為零 不相等(≠)/不為零 溢位

未溢位 偶同位 奇同位

CF = 1 CF = 0 SF = 1 SF = 0 ZF = 1 ZF = 0 OF = 1 OF = 0 PF = 1 PF = 0

帶號數

L/NGE NL/GE LE/NG NLE/G

<

>

SF ⊕ OF = 1 SF ⊕ OF = 0 (SF ⊕ OF) ∨ ZF = 1 (SF ⊕ OF) ∨ ZF = 0

未帶號數

B/NAE NB/AE BE/NA NBE/A

<

>

CF = 1 CF = 0 CF ∨ ZF = 1 CF ∨ ZF = 0

(21)

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

第4章 基本組合語言程式設計

4.41

陣列資料搬移

;ex4.4-1.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 12 23 SRCA DB 12H,23H ;source array 0002 24 67 DB 24H,67H

0004 76 98 DB 76H,98H 0006 23 45 DB 23H,45H

0008 0008 [00] DSTA DB 8 DUP(00);destination array 0010 DATA ENDS

....

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

0005 A0 0000 R MOV AL,SRCA ;transfer 1st byte 0008 A2 0008 R MOV DSTA,AL

000B A0 0001 R MOV AL,SRCA+1;transfer 2nd byte 000E A2 0009 R MOV DSTA+1,AL

....

002F A0 0007 R MOV AL,SRCA+7;transfer 8th byte 0032 A2 000F R MOV DSTA+7,AL

0035 C3 RET 0036 BLKMOV ENDP 0036 CODE ENDS

END BLKMOV

微算機原理與應用 第4章 基本組合語言程式設計

4.42

利用迴路的陣列資料搬移

;ex4.4-2.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 LENTH EQU 08H ;bytes of array 0000 12 23 SRCA DB 12H,23H ;source array

....

0006 23 45 DB 23H,45H

0008 0008 [ 00 ] DSTA DB 8 DUP(00);destination array 0010 DATA ENDS

....

0005 B9 0008 MOV CX,LENTH;set count 0008 8D 36 0000 R LEA SI,SRCA ;set source pointer 000C 8D 3E 0008 R LEA DI,DSTA ;set dest. pointer 0010 8A 04 MLOOP: MOV AL,[SI] ;transfer them 0012 88 05 MOV [DI],AL

0014 46 INC SI ;point to next 0015 47 INC DI ;entry 0016 49 DEC CX

0017 75 F7 JNZ MLOOP ;repeat count times 0019 C3 RET

....

END BLKMOV

(22)

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

第4章 基本組合語言程式設計

4.43

旗號迴路

;ex4.4-4.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 12 23 SRCA DB 12H,23H ;source array

....

0006 23 45 DB 23H,45H 0008 FF DB 0FFH ;end flag

0009 0008 [ 00 ] DSTA DB 8 DUP(00);destination array ....

0005 8D 36 0000 R LEA SI,SRCA ;set source pointer 0009 8D 3E 0009 R LEA DI,DSTA ;set dest. pointer 000D 8A 04 MLOOP: MOV AL,[SI] ;transfer them 000F 3C FF CMP AL,0FFH ;end ?

0011 74 06 JE DONE ;yes, done 0013 88 05 MOV [DI],AL 0015 46 INC SI ;point to next 0016 47 INC DI ;entry 0017 EB F4 JMP MLOOP ;continue 0019 C3 DONE: RET

001A BLKMOV ENDP 001A CODE ENDS

END BLKMOV

微算機原理與應用 第4章 基本組合語言程式設計

4.44

80x86無條件分歧與跳躍指令

指令 動作 OF SF ZF AF PF CF

(節區內:直接定址) JMP rel8 JMP rel16

JMP rel32 (80386↑)

IP IP + rel8/16 (80286↓) EIP EIP + rel8/16/32 (80386↑) 若運算元長度為 16 位元則 EIP EIP AND 0000FFFFH

- - - - - -

(節區內:間接定址) JMP r16/m16 JMP r32/m32 (80386↑)

IP r16/(m16) (80286↓)

若運算元長度為 16 位元則 (80386↑) EIP r16/(m16) AND 0000FFFFH 否則 EIP r32/(m32)

- - - - - -

(節區間:直接定址) JMP ptr16:16 JMP ptr16:32 (80386↑)

CS:IPptr16:16 (80286↓) 若運算元長度為 16 位元則 (80386↑) CS:IP ptr16:16

EIP EIP AND 0000FFFFH 否則(運算元長度為 32 位元) CS:EIP ptr16:32

- - - - - -

(節區間:間接定址) JMP m16:16 JMP m16:32 (80386↑)

CS:IP(m16:16) (80286↓) 若運算元長度為 16 位元則 (80386↑) CS:IP (m16:16)

EIP EIP AND 0000FFFFH 否則(運算元長度為 32 位元) CS:EIP (m16:32)

- - - - - -

(23)

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

第4章 基本組合語言程式設計

4.45

整數平方根

2 5 1 -

2 4 - 3

- 5 2 1

1 6 7 -

9 - 9

0 1

2

3

4

5 結果

3 5 1 -

3 4 - 3

- 5 3 1

2 6 7 -

9 - 9

0 1

2

3

4

5 結果

1

1 - 1

1 - 1

微算機原理與應用 第4章 基本組合語言程式設計

4.46

整數平方根

;ex4.4-6.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 007B NUMBER DW 123 ;test number 0002 0000 SQRT DW ? ;square root value 0004 DATA ENDS

....

0005 A1 0000 R MOV AX,NUMBER ;get test number 0008 B9 0001 MOV CX,01H ;start value

000B BB 0000 MOV BX,00H ;clear count 000E 2B C1 AGAIN: SUB AX,CX ;we have done it 0010 72 06 JB DONE ;when AX < CX 0012 43 INC BX ;increase count

0013 83 C1 02 ADD CX,02H ;get next odd number 0016 EB F6 JMP AGAIN ;continue

0018 89 1E 0002 R DONE: MOV SQRT,BX;save result 001C C3 RET

001D SQRT_FD ENDP 001D CODE ENDS

END SQRT_FD

(24)

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

第4章 基本組合語言程式設計

4.47

80x86迴路指令

指令 動作 OF SF ZF AF PF CF

LOOP rel8 LOOPD rel8

計數器計數器 - 1;

若計數器不為零則

IP IP + 符號擴展(rel8) 否則繼續執行下一個指令

- - - - - -

LOOPE rel8 LOOPZ rel8 LOOPED rel8 LOOPZD rel8

計數器計數器 - 1;

若計數器不為零並且 ZF = 1 則 IP IP + 符號擴展(rel8) 否則繼續執行下一個指令

- - - - - -

LOOPNE rel8 LOOPNZ rel8 LOOPNED rel8 LOOPNZD rel8

計數器計數器 - 1;

若計數器不為零並且 ZF = 0 則 IP IP + 符號擴展(rel8) 否則繼續執行下一個指令

- - - - - -

JcounterZ rel8 若計數器不為零則

IP IP + 符號擴展(rel8) 否則繼續執行下一個指令

- - - - - -

註: 若位址長度為 16 位元則計數器為 CX ;若位址長度為 32 位元則計數器為 ECX 並且表中 之 IP 更改為 EIP 。

微算機原理與應用 第4章 基本組合語言程式設計

4.48

LOOP指令的使用例

;ex4.4-7.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 LENTH EQU 08H ;bytes of array 0000 12 23 SRCA DB 12H,23H ;source array

....

0006 23 45 DB 23H,45H

0008 0008 [ 00 ] DSTA DB 8 DUP(00);destination array 0010 DATA ENDS

....

0003 8E D8 MOV DS,AX

0005 B9 0008 MOV CX,LENTH;set count 0008 8D 36 0000 R LEA SI,SRCA ;set source pointer 000C 8D 3E 0008 R LEA DI,DSTA ;set dest. pointer 0010 8A 04 MLOOP: MOV AL,[SI] ;transfer them 0012 88 05 MOV [DI],AL

0014 46 INC SI ;point to next 0015 47 INC DI ;entry

0016 E2 F8 LOOP MLOOP ;repeat count times 0018 C3 RET

0019 BLKMOV ENDP 0019 CODE ENDS

END BLKMOV

參考文獻

相關文件

[r]

莎劇中「弄人」的打諢(見 附錄二)與《史記》優孟故 事、宋代「二聖鐶故事」中 的優伶相類;但「莎劇」中

填表人 簽章欄 負責人 簽章欄 單位 印信欄..

中國白話文學由新文學運動肇始,作家即努力求新求變。第二次世

January/Kindergarten%20space.html.. More than one way: An approach to teaching that supports playful learning. Project Zero: A Pedagogy of Play working paper .Retrieved

[r]

微算機原理與應用 第6

[r]