• 沒有找到結果。

本章目標

N/A
N/A
Protected

Academic year: 2022

Share "本章目標"

Copied!
22
0
0

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

全文

(1)

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

第5章 組合語言程式設計

5.1

本章目標

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

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

• 了解80x86的移位與循環指令與程式設計

• 了解80x86的符號擴展指令與特殊指令的動作

• 了解80x86的字元串運算指令與程式設計

• 了解80x86的CPU控制與旗號位元指令的動作

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

5.2

邏輯運算指令動作

0 1 0 1 0 0 1 1 XOR 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0

希望取補數的位元 罩網

標的位元組 新標的位元組 不改變的位元

(c) XOR運算 (d) TEST運算

0 0 0 1 0 0 0 0 TEST

1 0 1 1 1 0 0 1

希望檢查的位元 罩網

標的位元組 新標的位元組 受測試的位元 並不改變 1 0 1 1 1 0 0 1

0 1 0 1 0 0 1 1 OR 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 1

希望設定為1的位元 罩網

標的位元組 新標的位元組 不改變的位元 (a) OR運算

1 0 1 0 1 1 0 0 AND 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0

希望清除為0的位元 罩網

標的位元組 新標的位元組 不改變的位元 (b) AND運算

(2)

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

第5章 組合語言程式設計

5.3

80x86邏輯運算指令

指令 動作 OF SF ZF AF PF CF

AND reg1,reg2 reg1  reg2 ∧ reg1 0 * * U * 0

AND reg,mem reg  reg ∧(mem) 0 * * U * 0

AND mem,reg (mem)  reg ∧(mem) 0 * * U * 0

AND reg,data reg  reg ∧ data 0 * * U * 0

AND mem,data (mem)  (mem) ∧ data 0 * * U * 0

AND ACC,data ACC  ACC ∧ data 0 * * U * 0

OR reg1,reg2 reg1  reg2 ∨ reg1 0 * * U * 0

OR reg,mem reg  reg ∨(mem) 0 * * U * 0

OR mem,reg (mem)  reg ∨(mem) 0 * * U * 0

OR reg,data reg  reg ∨ data 0 * * U * 0

OR mem,data (mem)  (mem) ∨ data 0 * * U * 0

OR ACC,data ACC  ACC ∨ data 0 * * U * 0

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

5.4

80x86邏輯運算指令

XOR reg1,reg2 reg1  reg2 ⊕ reg1 0 * * U * 0

XOR reg,mem reg  reg ⊕ (mem) 0 * * U * 0

XOR mem,reg (mem)  reg ⊕ (mem) 0 * * U * 0

XOR reg,data reg  reg ⊕ data 0 * * U * 0

XOR mem,data (mem)  (mem) ⊕ data 0 * * U * 0

XOR ACC,data ACC  ACC ⊕ data 0 * * U * 0

TEST reg1,reg2 reg1 ∧ reg2 0 * * U * 0

TEST reg,mem reg ∧(mem) 0 * * U * 0

TEST mem,reg (mem) ∧ reg 0 * * U * 0

TEST reg,data reg ∧ data 0 * * U * 0

TEST mem,data (mem) ∧ data 0 * * U * 0

TEST ACC,data ACC ∧ data 0 * * U * 0

(3)

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

第5章 組合語言程式設計

5.5

F = AB ⊕ (C + D)

;ex5.1-1.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 7B INPUT_A DB 01111011B ;input a 0001 9D INPUT_B DB 10011101B ;input b 0002 92 INPUT_C DB 10010010B ;input c 0003 F1 INPUT_D DB 11110001B ;input d 0004 00 RESULT_F DB ? ;result f

....

0005 A0 0000 R MOV AL,INPUT_A;get INPUT_A 0008 F6 D0 NOT AL ;complement it

000A 22 06 0001 R AND AL,INPUT_B;AND INPUT_B 000E 8A 0E 0002 R MOV CL,INPUT_C;get INPUT_C 0012 0A 0E 0003 R OR CL,INPUT_D;OR INPUT_D 0016 32 C1 XOR AL,CL ;XOR AL with CL 0018 A2 0004 R MOV RESULT_F,AL;save result 001B C3 RET

001C LGSML ENDP 001C CODE ENDS

END LGSML

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

5.6

邏輯運算指令的使用例

;ex5.1-2.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 05 BYTE1 DB 05H ;bit number 0001 01 BYTE2 DB 01H ;bit value 0002 DATA ENDS

....

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

0005 F6 06 0001 R 20 TEST BYTE2,20H ;test the bit 5 000A 74 07 JZ CLRBIT ;of byte2

000C 80 0E 0000 R 08 SETBIT: OR BYTE1,08H ;set the bit 3 0011 EB 05 JMP SHORT RETURN;of byte1 0013 80 26 0000 R F7 CLRBIT: AND BYTE1,0F7H ;clear the bit 3 0018 C3 RETURN: RET ;of byte1

0019 SETBTV ENDP 0019 CODE ENDS

END SETBTV

(4)

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

第5章 組合語言程式設計

5.7

邏輯運算指令的使用例

;ex5.1-3.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 05 BITNO DB 05H ;bit number 0001 01 VALUE DB 01H ;bit value 0002 00 MEMORY DB 00H ;memory location 0003 01 02 04 08 BMASK DB 01H,02H,04H,08H 0007 10 20 40 80 DB 10H,20H,40H,80H

....

0005 8A 1E 0000 R MOV BL,BITNO ;get bit number 0009 32 FF XOR BH,BH ;zero BH

000B 8A 97 0003 R MOV DL,BMASK[BX];get mask entry 000F 80 3E 0001 R 00 CMP VALUE,00H ;test value 0014 74 06 JZ CLRBIT

0016 08 16 0002 R SETBIT: OR MEMORY,DL ;set the MEMORY 001A EB 06 JMP SHORT RETURN ;bit

001C F6 D2 CLRBIT: NOT DL ;clear the MEMORY 001E 20 16 0002 R AND MEMORY,DL ;bit

0022 C3 RETURN: RET 0023 SETMBT ENDP 0023 CODE ENDS

END SETMBT

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

5.8

計數一個位元組中"1"的個數

;ex5.1-4.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 BCOUNT EQU 08H ;bit bumber 0000 47 TDATA DB 47H ;test data 0001 00 COUNT DB 00H ;result

0002 01 02 04 08 EMASK DB 01H,02H,04H,08H ;mask 0006 10 20 40 80 DB 10H,20H,40H,80H

....

0005 B9 0008 MOV CX,BCOUNT ;put count in CX 0008 BE 0000 MOV SI,00H ;zero index 000B 32 E4 XOR AH,AH ;zero AH

000D A0 0000 R BEGIN: MOV AL,TDATA ;get test data 0010 22 84 0002 R AND AL,EMASK[SI];test bit value 0014 74 02 JZ NEXT ;if not zero

0016 FE C4 INC AH ;increase count 0018 46 NEXT: INC SI ;increase index 0019 49 DEC CX ;repeat until 001A 75 F1 JNZ BEGIN ;CX = 0 001C 88 26 0001 R MOV COUNT,AH ;store result 0020 C3 RET

(5)

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

第5章 組合語言程式設計

5.9

TEST指令的使用例

;ex5.1-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 01 02 04 08 EMASK DB 01H,02H,04H,08H ;mask 0006 10 20 40 80 DB 10H,20H,40H,80H

....

0005 B9 0008 MOV CX,BCOUNT ;put count in CX 0008 BE 0000 MOV SI,00H ;zero index 000B 32 E4 XOR AH,AH ;zero AH 000D A0 0000 R MOV AL,TDATA ;get test data 0010 84 84 0002 R BEGIN: TEST AL,EMASK[SI];test bit value 0014 74 02 JZ NEXT ;if not zero

0016 FE C4 INC AH ;increase count 0018 46 NEXT: INC SI ;increase index 0019 E2 F5 LOOP BEGIN ;repeat until CX=0 001B 88 26 0001 R MOV COUNT,AH ;store result 001F C3 RET

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

5.10

80386 CPU位元運算指令

指令 動作 OF SF ZF AF PF CF

BT r/m16,r16 CF← r16/(m16)中的第 r16 個位元值。 - - - * BT r/m32,r32 CF← r32/(m32)中的第 r32 個位元值。 - - - * BT r/m16,imm8 CF← r16/(m16)中的第 imm8 個位元值。 - - - * BT r/m32,imm8 CF← r32/(m32)中的第 imm8 個位元值。 - - - *

BTC r/m16,r16 CF← r16/(m16)中的第 r16 個位元值;

並將該位元取補數。

- - - *

BTC r/m32,r32 CF← r32/(m32)中的第 r32 個位元值;

並將該位元取補數。

- - - *

BTC r/m16,imm8 CF← r16/(m16)中的第 imm8 個位元值;

並將該位元取補數。

- - - *

BTC r/m32,imm8 CF← r32/(m32)中的第 imm8 個位元值;

並將該位元取補數。

- - - *

(6)

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

第5章 組合語言程式設計

5.11

80386 CPU位元運算指令

BTR r/m16,r16 CF← r16/(m16)中的第 r16 個位元值;

並清除該位元為 0 。

- - - *

BTR r/m32,r32 CF← r32/(m32)中的第 r32 個位元值;

並清除該位元為 0 。

- - - *

BTR r/m16,imm8 CF← r16/(m16)中的第 imm8 個位元值;

並清除該位元為 0 。

- - - *

BTR r/m32,imm8 CF← r32/(m32)中的第 imm8 個位元值;

並清除該位元為 0 。

- - - *

BTS r/m16,r16 CF← r16/(m16)中的第 r16 個位元值;

並設定該位元為 1 。

- - - *

BTS r/m32,r32 CF← r32/(m32)中的第 r32 個位元值;

並設定該位元為 1 。

- - - *

BTS r/m16,imm8 CF← r16/(m16)中的第 imm8 個位元值;

並設定該位元為 1 。

- - - *

BTS r/m32,imm8 CF← r32/(m32)中的第 imm8 個位元值;

並設定該位元為 1 。

- - - *

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

5.12

靜態位元運算指令使用例

;ex5.2-1.asm

.386 ;386/486 and up processor only

0000 DATA SEGMENT PUBLIC 'DATA' USE16 0000 0005 BYTE1 DW 0005H ;control word 1 0002 00FF BYTE2 DW 00FFH ;control word 2 0004 DATA ENDS

....

0000 SETBTV PROC NEAR

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

0005 0F BA 26 0002 R 05 BT BYTE2,5 ;test bit 5 000B 73 08 JNC CLRBIT ;of byte2 000D 0F BA 2E 0000 R 03 BTS BYTE1,3 ;set bit 3 of 0013 EB 06 JMP RETURN ;byte1

0015 0F BA 36 0000 R 03 CLRBIT: BTR BYTE1,3 ;clear bit 3 001B C3 RETURN: RET ;of byte1

001C SETBTV ENDP 001C CODE ENDS

END SETBTV

(7)

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

第5章 組合語言程式設計

5.13

靜態位元運算指令使用例

;ex5.2-2.asm

.386 ;386/486 and up processor only

0000 DATA SEGMENT PUBLIC 'DATA' USE16 0000 0005 BYTE1 DW 05H ;control word 1 0002 0001 BYTE2 DW 01H ;control word 2 0004 DATA ENDS

....

0000 SETBTV PROC NEAR

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

0005 0F BA 2E 0000 R 03 BTS BYTE1,3;set byte1 bit 3 000B 0F BA 26 0002 R 05 BT BYTE2,5;test bit 5 0011 72 06 JC RETURN ;of byte2 0013 0F BA 36 0000 R 03 BTR BYTE1,3 ;clear bit 3 0019 C3 RETURN: RET ;of byte1 001A SETBTV ENDP

001A CODE ENDS END SETBTV

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

5.14

動態位元運算指令使用例

;ex5.2-3.asm

.386 ;386/486 and up processor only 0000 DATA SEGMENT PUBLIC 'DATA' USE16 0000 0005 BITNO DW 0005H ;bit number 0002 0001 VALUE DW 0001H ;bit value 0004 0000 MEMORY DW 0000H ;memory location

....

0000 SETMBT PROC NEAR

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

0005 A1 0000 R MOV AX,BITNO ;get bit number 0008 0F BA 26 0002 R 00 BT VALUE,0 ;test bit 0 of value 000E 73 07 JNC CLRBIT

0010 0F AB 06 0004 R SETBIT: BTS MEMORY,AX ;set the MEMORY 0015 EB 05 JMP SHORT RETURN ;bit

0017 0F B3 06 0004 R CLRBIT: BTR MEMORY,AX ;clear the MEMORY 001C C3 RETURN: RET ;bit

001D SETMBT ENDP 001D CODE ENDS

END SETMBT

(8)

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

第5章 組合語言程式設計

5.15

動態位元運算指令使用例

;ex5.2-4.asm

.386 ;386/486 and up processor only

0000 DATA SEGMENT PUBLIC 'DATA' USE16 0000 0005 BITNO DW 0005H ;bit number 0002 0001 VALUE DW 0001H ;bit value 0004 0000 MEMORY DW 0000H ;memory location

....

0000 SETMBT PROC NEAR

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

0005 A1 0000 R MOV AX,BITNO ;get bit number 0008 0F AB 06 0004 R BTS MEMORY,AX ;set the MEMORY 000D 0F BA 26 0002 R 00 BT VALUE,0 ;test the value 0013 72 05 JC SHORT RETURN

0015 0F B3 06 0004 R BTR MEMORY,AX ;clear the MEMORY 001A C3 RETURN: RET ;bit

001B SETMBT ENDP 001B CODE ENDS

END SETMBT

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

5.16

計數一個位元組中"1"位元的個數

;ex5.2-5.asm

.386 ;386/486 and up processor only 0000 DATA SEGMENT PUBLIC 'DATA' USE16 0000 0047 TDATA DW 0047H ;test data 0002 0000 COUNT DW 0000H ;result

= 0008 BCOUNT EQU 08H ;bit bumber ....

0005 33 DB XOR BX,BX ;zero result 0007 8B CB MOV CX,BX ; and counter 0009 A1 0000 R MOV AX,TDATA ;get test data 000C 0F A3 C8 AGAIN: BT AX,CX ;test bit value 000F 73 03 JNC NEXT ;if not zero 0011 83 C3 01 ADD BX,1 ;increase result 0014 41 NEXT: INC CX ;repeat until 0015 83 F9 08 CMP CX,BCOUNT ;CX=BCOUNT 0018 75 F2 JNE AGAIN

001A 89 1E 0002 R MOV COUNT,BX ;store result 001E C3 RETURN: RET

(9)

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

第5章 組合語言程式設計

5.17

指令BSF與BSR的動作

位元指標(位元位址) 0001xxxx...xxxx

位元

15 0 位址

(a) 指令BSR

位元指標(位元位址) xxxx...xxxx10000

位元

15 0 位址

(b) 指令BSF

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

5.18

80386 CPU位元掃描運算指令

指令 動作 OF SF ZF AF PF CF

BSF r16,r/m16 若 r16/(m16)不為 0,則 ZF = 0 並儲存其最右邊 1 位元之位元位址於 r16 內;否則設定 ZF = 1 。

- - * - - -

BSF r32,r/m32 若 r32/(m32)不為 0,則 ZF = 0 並儲存其最右邊 1 位元之位元位址於 r32 內;否則設定 ZF = 1 。

- - * - - -

BSR r16,r/m16 若 r16/(m16)不為 0,則 ZF = 0 並儲存其最左邊 1 位元之位元位址於 r16 內;否則設定 ZF = 1 。

- - * - - -

BSR r32,r/m32 若 r32/(m32)不為 0,則 ZF = 0 並儲存其最左邊 1 位元之位元位址於 r32 內;否則設定 ZF = 1 。

- - * - - -

(10)

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

第5章 組合語言程式設計

5.19

算術與邏輯移位

0 CF

CF (a) 算術右移位

(c) 邏輯右移位

(b) 算術左移位

(d) 邏輯左移位

CF 0

CF 0

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

5.20

循環移位與連結進位循環移位

(a) 右循環移位

(c) 連結進位右循環移位

(b) 左循環移位

CF CF

CF CF

(d) 連結進位左循環移位

(11)

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

第5章 組合語言程式設計

5.21

80x86移位與循環移位指令

指令 動作 OF SF ZF AF PF CF

SHR r/m,1 SHR r/m,imm8 SHR r/m,CL

0 CF r/(m)

* U U

*

*

*

*

*

* U U U

*

*

*

*

*

*

SHL/SAL r/m,1 SHL/SAL r/m,imm8 SHL/SAL r/m,CL

CF 0 r/(m)

* U U

*

*

*

*

*

* U U U

*

*

*

*

*

*

SAR r/m,1 SAR r/m,imm8 SAR r/m,CL

S CF r/(m)

* U U

*

*

*

*

*

* U U U

*

*

*

*

*

*

ROL r/m,1 ROL r/m,imm8 ROL r/m,CL

CF

r/(m)

* U U

- - -

- - -

- - -

- - -

*

*

*

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

5.22

80x86移位與循環移位指令

ROR r/m,1 ROR r/m,imm8 ROR r/m,CL

CF r/(m)

* U U

- - -

- - -

- - -

- - -

*

*

* RCL r/m,1

RCL r/m,imm8 RCL r/m,CL

CF

r/(m)

* U U

- - -

- - -

- - -

- - -

*

*

* RCR r/m,1

RCR r/m,imm8 RCR r/m,CL

CF r/(m)

* U U

- - -

- - -

- - -

- - -

*

*

*

(12)

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

第5章 組合語言程式設計

5.23

ROR指令的使用例

;ex5.3-1a.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 DATA ENDS

;swap two nibbles in register AL

;using static rotation instruction

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

0000 D0 C8 ROR AL,1 ;rotate register 0002 D0 C8 ROR AL,1 ;AL right 4 bits 0004 D0 C8 ROR AL,1

0006 D0 C8 ROR AL,1 0008 C3 RET 0009 SWAP4B ENDP 0009 CODE ENDS

END SWAP4B

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

5.24

ROR指令的使用例

;ex5.3-1b.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 DATA ENDS

;swap two nibbles in register AL

;using dynamic rotation instruction 0000 CODE SEGMENT PUBLIC 'CODE'

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

0000 B1 04 MOV CL,4 ;rotate register 0002 D2 C8 ROR AL,CL ;AL right 4 bits 0004 C3 RET

0005 SWAP4B ENDP 0005 CODE ENDS

END SWAP4B

(13)

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

第5章 組合語言程式設計

5.25

循環移位指令使用例

;ex5.3-2.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 B1CNTS PROC NEAR

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

0005 B9 0008 MOV CX,BCOUNT ;put count in CX 0008 32 E4 XOR AH,AH ;zero AH

000A A0 0000 R MOV AL,TDATA ;get test data 000D D0 C8 BEGIN: ROR AL,1 ;test bit value 000F 73 02 JNC NEXT ;if not zero 0011 FE C4 INC AH ;increase count

0013 E2 F8 NEXT: LOOP BEGIN ;loop BCOUNT times 0015 88 26 0001 R MOV COUNT,AH ;store result 0019 C3 RET

001A B1CNTS ENDP

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

5.26

動態循環移位指令使用例

;ex5.3-3.asm

0000 DATA SEGMENT PUBLIC 'DATA' 0000 05 BITNO DB 05H ;bit number 0001 01 VALUE DB 01H ;bit value 0002 00 MEMORY DB 00H ;memory location 0003 DATA ENDS

....

0000 SETMBT PROC NEAR

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

0005 8A 0E 0000 R MOV CL,BITNO ;get bit number 0009 80 26 0001 R 01 AND VALUE,01H ;extract bit 0 000E A0 0002 R MOV AL,MEMORY ;get memory 0011 D2 C8 SETIT: ROR AL,CL ;rotate the given 0013 24 FE AND AL,0FEH ;bit to bit 0, 0015 0A 06 0001 R OR AL,VALUE;set its value,then 0019 D2 C0 ROL AL,CL ;rotate it back 001B A2 0002 R MOV MEMORY,AL ;save result 001E C3 RET

001F SETMBT ENDP

(14)

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

第5章 組合語言程式設計

5.27

SHLD與SHRD指令的動作

DST SRC

CF

reg/mem

(a) SHLD 指令

DST

SRC CF

reg/mem (b) SHRD 指令

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

5.28

80386 CPU雙精確制移位指令

指令 動作 OF SF ZF AF PF CF

SHLD r/m16,r16,imm8 r16/(m16)儲存 SHL(r/m16:r16)的結果。 U * * U * * SHLD r/m32,r32,imm8 r32/(m32)儲存 SHL(r/m32:r32)的結果。 U * * U * * SHLD r/m16,r16,CL r16/(m16)儲存 SHL(r/m16:r16)的結果。 U * * U * * SHLD r/m32,r32,CL r32/(m32)儲存 SHL(r/m32:r32)的結果。 U * * U * *

SHRD r/m16,r16,imm8 r16/(m16)儲存 SHR(r/m16:r16)的結果。 U * * U * * SHRD r/m32,r32,imm8 r32/(m32)儲存 SHR(r/m32:r32)的結果。 U * * U * * SHRD r/m16,r16,CL r16/(m16)儲存 SHR(r/m16:r16)的結果。 U * * U * * SHRD r/m32,r32,CL r32/(m32)儲存 SHR(r/m32:r32)的結果。 U * * U * *

(15)

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

第5章 組合語言程式設計

5.29

位元串運算的基本資料結構

N N+4 N+8 N+C N+10 N+14

8 7 0 16 15

24 23 31

位元串長度

位元位移位址

位元位址 基底位址 位元陣列

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

5.30

符號擴展

例題 5.4-1 (符號擴展)

  將下列兩數相加:-28(8 位元)與+96(16 位元)。

解 解解

解::: 8 位元的-28 先做符號擴展為 16 位元後,與 16 位元的+96 相加,得到正確的結果: +68 :

28 +96

68

1 1 1 1 0 0 0 0 +

0 0 0 0

(-28) --- 8 位元 +

-

+

1 1 1 1 0 0 0 0 0 0 0 0

1 1 1 0 0 1 1 0 0 1 0 0

0 1 0 0 0 0 0 0 0 1 0 0 C = 1

(+96) --- 16位元 (+68) --- 16位元   若-28 未做符號擴展為 16 位元的值,即其高序位元組視為 0 ,而直接與 16 位元的 +96 相加,則得到不正確的結果+324 :

28 +96

68

0 0 0 0 0 0 0 0 +

0 0 0 0

(+228) --- 8 位元 +

-

+

0 0 0 0 0 0 0 0 0 0 0 1

1 1 1 0 0 1 1 0 0 1 0 0

0 1 0 0 0 0 0 0 0 1 0 0 C = 1

(+96) --- 16 位元 (+324) --- 16 位元

(16)

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

第5章 組合語言程式設計

5.31

80x86符號擴展指令

指令 動作 OF SF ZF AF PF CF

CBW AH ← AL(7)。 - - - -

CWD DX ← AX(15)。 - - - -

CWDE EAX(31:16) ← AX(15)。 - - - -

CDQ EDX ← EAX(31)。 - - - -

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

5.32

MOVSX與MOVZX指令的動作

(a) MOVSX 指令 S

S S S

SRC

DST

(b) MOVZX 指令

0 0 DST

SRC

(17)

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

第5章 組合語言程式設計

5.33

符號擴展相關運算指令

指令 動作 OF SF ZF AF PF CF

MOVSX r16,r8/m8 r16 ← r8/(m8)之符號擴展後。 - - - - - - MOVSX r32,r8/m8 r32 ← r8/(m8)之符號擴展後。 - - - - - - MOVSX r32,r16/m16 r32 ← r16/(m16)之符號擴展後。 - - - - - -

MOVZX r16,r8/m8 r16 ← r8/(m8)之零值擴展後。 - - - - - - MOVZX r32,r8/m8 r32 ← r8/(m8)之零值擴展後。 - - - - - - MOVZX r32,r16/m16 r32 ← r16/(m16)之零值擴展後。 - - - - - -

ADD r16/m16,imm8 r16/(m16)←r16/(m16) + SE(imm8) * * * * * * ADD r32/m32,imm8 r32/(m32)←r32/(m32) + SE(imm8) * * * * * *

ADC r16/m16,imm8 r16/(m16)←r16/(m16) + SE(imm8) + C * * * * * * ADC r32/m32,imm8 r32/(m32)←r32/(m32) + SE(imm8) + C * * * * * *

SUB r16/m16,imm8 r16/(m16)←r16/(m16) - SE(imm8) * * * * * * SUB r32/m32,imm8 r32/(m32)←r32/(m32) - SE(imm8) * * * * * *

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

5.34

符號擴展相關運算指令

SBB r16/m16,imm8 r16/(m16)←r16/(m16) - SE(imm8) - C * * * * * * SBB r32/m32,imm8 r32/(m32)←r32/(m32) - SE(imm8) - C * * * * * *

CMP r16/m16,imm8 r16/(m16) - SE(imm8) * * * * * *

CMP r32/m32,imm8 r32/(m32) - SE(imm8) * * * * * *

AND r16/m16,imm8 r16/(m16)←r16/(m16) ∧ SE(imm8) 0 * * U * 0 AND r32/m32,imm8 r32/(m32)←r32/(m32) ∧ SE(imm8) 0 * * U * 0

OR r16/m16,imm8 r16/(m16)←r16/(m16) ∨ SE(imm8) 0 * * U * 0 OR r32/m32,imm8 r32/(m32)←r32/(m32) ∨ SE(imm8) 0 * * U * 0

XOR r16/m16,imm8 r16/(m16)←r16/(m16) ⊕ SE(imm8) 0 * * U * 0 XOR r32/m32,imm8 r32/(m32)←r32/(m32) ⊕ SE(imm8) 0 * * U * 0

IMUL r16,imm8 r16←r16 × SE(imm8) * U U U U *

IMUL r32,imm8 r32←r32 × SE(imm8) * U U U U *

IMUL r16,r16/m16,imm8 r16←r16/(m16) × SE(imm8) * U U U U * IMUL r32,r32/m32,imm8 r32←r32/(m32) × SE(imm8) * U U U U * 註: SE 表符號擴展(sign extension)。

(18)

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

第5章 組合語言程式設計

5.35

80x86字元串運算指令

指令 動作 OF SF ZF AF PF CF

MOVS(MOVSB/

MOVSW/MOVSD)

ES:((E)DI) ← DS:((E)SI);

SI←(E)SI ± 運算元長度;

(E)DI←(E)DI ± 運算元長度

- - - -

LODS(LODSB/

LODSW/LODSD)

ACC ← DS:((E)SI);

SI←(E)SI ± 運算元長度

- - - -

STOS(STOSB/

STOSW/STOSD)

ES:((E)DI) ← ACC;

DI←(E)DI ± 運算元長度

- - - -

CMPS(CMPSB/

CMPSW/CMPSD)

DS:((E)SI) - ES:((E)DI);

SI←(E)SI ± 運算元長度;

(E)DI←(E)DI ± 運算元長度

* * * * * *

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

5.36

80x86字元串運算指令

SCAS(SCASB/

SCASW/SCASD)

ACC - ES:((E)DI);

DI←(E)DI ± 運算元長度

* * * * * *

REP(MOVS,LODS, STOS)

重複執行(MOVS,LODS,STOS)指令,直 到(E)CX = 0 。

- - - -

REPE/REPZ(CMPS SCAS)

重複執行(CMPS,SCAS)指令,直到 (E)CX = 0 或 ZF = 0 。

- - - -

REPNE/REPNZ (CMPS,SCAS)

重複執行(CMPS,SCAS)指令,直到 (E)CX = 0 或 ZF = 1 。

- - - -

註: ACC 為 AL 、 AX 、或 EAX ,而運算元長度則為 1 、 2 、或 4 。

(19)

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

第5章 組合語言程式設計

5.37

使用MOVSB指令的資料陣列搬移程式

;ex5.5-1.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 LENTH EQU 08H ;bytes of array 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 ....

0000 BLKMOV PROC NEAR

0000 B8 ---- R MOV AX,DATA ;load DS and ES 0003 8E D8 MOV DS,AX ;ES and DS use 0005 8E C0 MOV ES,AX ;the same segment 0007 B9 0008 MOV CX,LENTH ;get length 000A 8D 36 0000 R LEA SI,SRCA ;set source pointer 000E 8D 3E 0008 R LEA DI,DSTA ;set dest. pointer 0012 FC CLD ;set auto-increment mode 0013 A4 MLOOP: MOVSB ;move data 0014 E2 FD LOOP MLOOP ;repeat until CX = 0 0016 C3 RET

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

5.38

線性搜尋程式

;ex5.5-2.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 LENTH EQU 08H ;array size 0000 0023 0002 TDATA DW 23H,02H ;data array

....

0010 0040 KEYD DW 40H ;data to be searched ....

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

0005 8E C0 MOV ES,AX

0007 B9 0008 MOV CX,LENTH;get length 000A 8D 3E 0000 R LEA DI,TDATA;set pointer 000E A1 0010 R MOV AX,KEYD ;get key data 0011 FC CLD ;set auto-increment mode 0012 AF MLOOP: SCASW ;search key data 0013 E0 FD LOOPNZ MLOOP

0015 74 05 CHECK: JE FOUND ;found ? 0017 B8 FFFF MOV AX,-1 ;no, move -1 to 001A EB 05 JMP SHORT FOUND1 ;keyd

001C B8 0008 FOUND: MOV AX,LENTH;yes,adjust index 001F 2B C1 SUB AX,CX ;value

0021 A3 0010 R FOUND1: MOV KEYD,AX 0024 C3 RET

(20)

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

第5章 組合語言程式設計

5.39

REP前標

例題 5.5-3 (REP 前標)

  試計算下列程式片段(a)與(b)需要的執行時間。

 (a) NEXT: MOVSB       LOOP NEXT  (b) REP MOVSB 解

解解

解:::以 8086 微處理器為例::

  (a) 每次均需 18(MOVSB) + 17(LOOP) = 35 個時脈

  (b) 第一次需要 9 + 17 = 26 個時脈,而第二次以後則每次僅需 17 個時脈。

所以使用 REP 前標不但簡化機器碼也同時縮短執行時間。

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

5.40

REP前標與MOVSB指令

;ex5.5-4.asm

0000 DATA SEGMENT PUBLIC 'DATA'

= 0008 LENTH EQU 08H ;bytes of array 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) ;dest. array 0010 DATA ENDS

....

0000 BLKMOV PROC NEAR

0000 B8 ---- R MOV AX,DATA ;load DS and ES 0003 8E D8 MOV DS,AX ;ES and DS use 0005 8E C0 MOV ES,AX ;the same segment 0007 B9 0008 MOV CX,LENTH;get length 000A 8D 36 0000 R LEA SI,SRCA ;set source pointer 000E 8D 3E 0008 R LEA DI,DSTA ;set dest. pointer 0012 FC CLD ;set auto-increment mode 0013 F3/ A4 MLOOP: REP MOVSB ;transfer data 0015 C3 RET

(21)

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

第5章 組合語言程式設計

5.41

80x86表格轉換指令

指令 動作 OF SF ZF AF PF CF

XLATB AL ← ((E)BX+零位元擴展之 AL) - - - -

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

5.42

80x86 CPU控制指令

指令 動作 OF SF ZF AF PF CF

HLT 令 CPU 停止動作。 - - - -

NOP CPU 不做動作。 - - - -

ESC data,mem 浮點運算處理器指令。 - - - -

ESC data,reg 浮點運算處理器指令。 - - - -

CPUID 讀取 CPU 相關的識別資訊 - - - -

(22)

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

第5章 組合語言程式設計

5.43

軟體延遲程式(8088)

;ex5.6-1.asm

;subroutine to delay a given clocks.

;the delay time is calculated as follow:

;delay time = 4+(3+3+17)(N-1)+(3+3+5)+8

; = 23N (clocks)

0000 CODE SEGMENT PUBLIC 'CODE'

= 0064 N EQU 100 ASSUME CS:CODE 0000 DELAY PROC NEAR 0000 B9 0064 MOV CX,N ; 4 0003 90 KTIME: NOP ; 3 0004 90 NOP ; 3

0005 E2 FC LOOP KTIME ;5(B=0);17(B<>0) 0007 C3 RET ; 8

0008 DELAY ENDP 0008 CODE ENDS

END DELAY

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

5.44

80x86旗號位元運算指令

指令 動作 DF TF IF OF SF ZF AF PF CF

CLC CF ← 0 - - - 0

CMC CF ← CF - - - CF

STC CF ← 1 - - - 1

CLD DF ← 0 0 - - - -

STD DF ← 1 1 - - - -

CLI IF ← 0 - - 0 - - - -

STI IF ← 1 - - 1 - - - -

LAHF AH ← 旗號位元組(7:0) - - - -

SAHF 旗號位元組(7:0)← AH - - - - * * * * *

參考文獻

相關文件

[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]