B vi x lý 8088/8086 và l p trình h p ng x86

3.1 Thanh ghi (Register)

ầ ử ớ ặ ệ ộ c ướ c này cũng chính là đ r ng c a data bus bên trong b x lý. ủ nh đ c bi ướ ử ộ ộ t bên trong b vi x lý. các thanh ghi luôn có kích th ộ ử c 16 bit. Là các ph n t b ng nhau, kích th ằ 8088 là b vi x lý 16 bit do đó các thanh ghi c a 8088 đ u có kích th ộ ướ ử ủ ề

ệ ư ụ ặ ộ ố t nh nhân hay chia, k t qu b t bu c ph i đ t trong thanh ả ắ ả ặ ế ộ

ộ ố ộ ử ỉ ỉ ụ ơ ớ ộ M t s tác v đ c bi ghi M t s thanh ghi ch dùng đ xác đ nh đ a ch cho b x lý ị ị ể Các tác v trên thanh ghi nhanh h n nhi u so v i các tác v trên b nh ớ ụ ề B vi x lý 8088 có 14 thanh ghi 16 bit chia thành nhóm theo ch c năng nh sau: ử ứ ư ộ

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

0

Nhóm thanh ghi đa d ng (General registers): ụ

AH BH CH DH AL BL CL DL AX BX CX DX

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

0

Nhóm thanh ghi ch m c và con tr (Index & Pointer registers): ỉ ụ ỏ

SI DI BP SP SI DI BP SP

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

0

Nhóm thanh ghi phân đo n (Segment registers): ạ

DS ES SS CS DS ES SS CS

F

E

D

C

5

3

1

Thanh ghi c hi u: ờ ệ

B A O D

9 I

8 T

7 S

6 Z

4 A

2 P

0 C

Flag

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

0

Thanh ghi contr l nh (Instruction Pointer) : ỏ ệ

IP

Flag

3.1.1 Nhóm thanh ghi d li u (Data registers): ữ ệ

ầ ử ớ ơ ả ủ ế ư ể ử ụ AX,BX,CX,DX hay là AH,AL,BH,BL,CH,CL,DH,DL nh c b n trong các quá trình tính Đóng vai trò ch y u nh là các ph n t toán. Tham gia vào các tác v tính toán c a b x lý. Có th s d ng nh là ư ủ ộ ử ụ m t thanh ghi 16 bit ho c hai thanh ghi 8 bit n i li n nhau. ố ề ặ ộ

3.1.2 Nhóm thanh ghi ch m c và con tr (Index & Pointer registers): ỉ ụ ỏ

ụ ỉ SI,DI,BP,SP Có th s d ng nh các thanh ghi đa d ng, ngoài ra còn đóng vai trò làm ch ể ử ụ m c khi xác d nh đ a ch theo offset c a b x lý. ỉ ủ ộ ử ư ị ụ ị

ụ ệ ỗ SI và DI là hai thanh ghi ch m c đ th c hi n các tác v chu i - - BP và SP là hai thanh ghi con tr đ thao tác trên c u trúc STACK ỉ ụ ể ự ỏ ể ấ

3.1.3 Nhóm thanh ghi phân đo n (Segment registers): ạ

ng ch dùng đ xác đ nh ụ ườ ể ỉ ị DS,ES,SS,CS Không th tham gia vào các tác v tính toán, th ể các đ a ch phân đo n. ỉ ạ ị

- DS: Data segment register - ES: Extra segment register SS: Stack segment register - - CS: Code segment register

3.1.4 Thanh ghi con tr l nh (Instruction Pointer register): ỏ ệ

ụ ể IP Không th tham gia vào các tác v tính toán, không th gán giá tr tr c ti p, ị ự ế cùng v i CS t o thành đ a ch mã l nh s th c hi n c a CPU ể ệ ủ ẽ ự ệ ạ ớ ị ỉ

3.1.5 Thanh ghi c hi u (Flag register): ờ ệ

ể Flag Không th tham gia vào các tác v tính toán, không th gán giá tr tr c ti p, ị ự ế ụ ch dùng đ ghi nh n ho c ch đ nh các tr ng thái làm vi c c a CPU. ị ệ ủ ể ể ạ ậ ặ ỉ ỉ

3.2 Đ a ch (Memory address) ỉ ị

ủ ộ ử ố ượ ự ế ị ộ ộ Các l nh c a b x lý thao tác tr c ti p lên các đ i t b nh . Các thanh ghi d ượ ộ xác đ nh b ng đ a ch . Các b x lý thu c dòng h x86 xác đ nh đ a ch b ng hai giá ng ch y u là thanh ghi và ủ ế ớ ượ thu c b nh đ c ầ ử ị c xác đ nh b ng tên , các ph n t ộ ử ệ ớ ị ỉ ằ ằ ộ ằ ọ ị ị ỉ

ng ng đ c tính theo công ỉ ậ ọ ị ươ ứ ượ tr 16 bit g i là segment và offset. Đ a ch v t lý t ị th c :ứ

16 bit

= Segment Memory_Address 20 bit * 10h + Offset 16 bit

ỉ ậ ề ặ ễ 0000:046C 0020:026C M t đ a ch v t lý có th bi u di n thành nhi u c p segment và offset khác nhau. ộ ị Thí d : ụ ể ể 0040:006C là các bi u di n c a d a ch v t lý 20 bit 00046C. ể ễ ủ ị ỉ ậ

3.2.1 Segment:

ộ c t ướ ố i các đ a ch chia ch n cho 16 (10h) trên toàn b vùng nh ớ ỉ ẵ ị i đa 64KB (16 bit offset) và có ớ ộ Segment là m t đo n b nh có kích th ạ ộ th b t đ u t ể ắ ầ ạ 1MB (20 bit).

ầ ế ụ ủ ộ ử c xác đ nh gián ị ượ ế ả

ỉ ượ ể ệ CS:Offset , DS:Offset Trong h u h t các tác v c a b x lý 8088, segment d ti p qua các thanh ghi segment DS , ES , SS , CS . Khi c n s d ng ầ ử ụ ng ng cho các thanh ghi segment . Lúc đó segment nào , ph i gán giá tr t ị ươ ứ các đ a ch đ c th hi n thành d ng Segment:offset ạ ị Thí d : ụ

3.2.2 Offset:

ầ ủ ể ộ Offset là m t c ly (16 bit) so v i đi m đ u c a m t segment. ớ Các cách mô t offset: ộ ự ả

[Const] , [BX] , [BP] , [SI] , [DI] [BX+Const] , [BP+Const] , [SI+Const] , [DI+Const] [BX+SI+Const] , [BX+DI+Const] , [BP+SI+Const] , [BP+DI+Const]

Const là m t h ng s ố ộ ằ

b ng m t t ng c a : H ng s 16 bit và các ậ ộ ổ ả ằ ể ằ ố ủ ặ * Nh n xét: Offset có th mô t thanh ghi ch m c BX, BP, SI, DI . Trong đó các c p BX và BP , SI và DI ỉ ụ c phép cùng xu t hi n không đ ượ ệ ấ

3.3 Các l nh c b n ệ ơ ả

i đây s đ c mô t ệ ẽ ượ ả theo d ng th c: ạ ứ Các l nh c a b vi x lý 8088 d ử ủ ộ Tên_L nhệ ướ [Đích [, Ngu n]]ồ

ộ ị ộ ớ ỉ ộ ng trình (Label) Đích (Dest) có th là tên m t thanh ghi (Reg) , m t đ a ch trong b nh (Mem), ể m t v trí trong ch ươ ộ ị

ộ ị ộ ộ ớ ỉ Ngu nồ (Src) có th là tên m t thanh ghi (Reg) , m t đ a ch trong b nh (Mem), ể m t h ng s (Const) ộ ằ ố

Đích và Ngu n ồ không đ ng th i là hai đ a ch trong b nh (Mem) ồ ờ ộ ớ ị ỉ

MOVE 3.3.1 L nh ệ

MOVE ,

Giá tr c a c gán (assign) vào Dest ị ủ Src d ượ

ố Không th MOVE : ể - Hai thanh ghi segment - H ng s vào thanh ghi segment - B t c gia tr nào vào các thanh ghi IP và Flag ị ằ ấ ứ

XCHG 3.3.2 L nh ệ

XCHG ,

ị ủ Src và Dest đ i ch cho nhau ỗ Giá tr c a ổ  Src và Dest ch có th là Reg ho c Addr/Mem ể ặ ỉ

Không th XCHG gi a các thanh ghi segment v i nhau. ữ ể ớ

INC , ADD và ADC 3.3.3 L nh ệ

INC Dest L y ấ Dest c ng v i ớ 1 r i gán k t qu vào ế ả ộ

ADD Dest L y ấ Dest c ng v i ớ Src r i gán k t qu vào ế ả ộ ,

ADC , Dest L y ấ Dest c ng v i ớ Src và c ng thêm ộ ộ 1 n u ế CF=1 r i gán k t qu vào ế ả ồ

DEC , SUB và SBB 3.3.4 L nh ệ

DEC Dest L y ấ Dest tr đi ừ 1 r i gán k t qu vào ế ả

SUB Src r i gán k t qu vào Dest L y ấ Dest tr đi ừ , ế ả ồ

SBB Dest , Src và tr ti p L y ấ Dest tr đi ừ ừ ế 1 n u ế CF=1 r i gán k t qu vào ồ ế ả

MUL 3.3.5 L nh ệ

MUL

L y ấ AL nhân v i ớ Reg_8bit ho c ặ Mem_8bit K t qu (16 bit) gán vào AX ế ả

MUL

L y ấ AX nhân v i ớ Reg_16bit ho c ặ Mem_16bit K t qu (32 bit) gán vào DX,AX (Theo th t DH,DL,AH,AL) ứ ự ế ả

DIV 3.3.6 L nh ệ

DIV

L y ấ AX chia cho Reg_8bit ho c ặ Mem_8bit K t qu (8 bit) gán vào AL , s d (8 bit) gán vào AH ố ư ế ả

DIV

L y ấ DX,AX (32 bit) chia cho Reg_8bit ho c ặ Mem_8bit DX K t qu (16 bit) gán vào AX , s d (16 bit) gán vào ố ư ế ả

IMUL và IDIV 3.3.7 L nh ệ

ư ự ấ ị Gi ng MUL và DIV, nh ng th c hi n trên các giá tr có d u và cho ra k t ế ệ qu có d u ố ả ấ

AND , OR , XOR và NOT 3.3.8 L nh ệ

ADD OR XOR , , ,

Dest L y ấ Dest AND/OR/XOR v i ớ Src r i gán k t qu vào ế ả ồ

NOT

L y NOT c a ủ Dest gán vào Dest ấ

SHL , SHR 3.3.9 L nh ệ

SHL/SHR ,1

ẩ ủ ặ ả ộ Đ y các bit c a thanh ghi sang trái (SHL)ho c sang ph i(SHR) 1 c t (Nhân/ Chia v i 2)ớ

SHL/SHR ,CL

ẩ ủ ặ ả ộ Đ y các bit c a thanh ghi sang trái (SHL) ho c sang ph i (SHR) n c t, v i n ớ là giá tr ch a trong CL (Nhân/Chia v i 2 ớ n ) ị ứ

K t thúc l nh , c hi u CF ch a bit cu i cùng l t ra ngoài. ờ ệ ứ ế ệ ố ọ

 c khi SHL SHL AL,1  ướ Tr 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 CF = 1 SHL AL,1 0 1 1 0 1 1 0 0 CF = 0

 c khi SHR SHR AL,1  ướ Tr 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 CF = 1 SHR AL,1 0 0 1 0 0 1 1 0 CF =1

RCL , RCR 3.3.10 L nh ệ

RCL/RCR ,1

Quay các bit c a thanh ghi và CF sang trái ho c sang ph i 1 c t ủ ặ ả ộ

RCL/RCR ,CL

ủ ặ ả ộ ớ Quay các bit c a thanh ghi và CF sang trái ho c sang ph i n c t, v i n là giá tr ch a trong CL ị ứ

 c khi RCL RCL AL,1  RCL AL,1 ướ 0 0 1 1 0 1 1 0 Tr 1 0 0 1 1 0 1 1 CF = 0 CF = 1 0 1 1 0 1 1 0 1 CF = 0

 c khi RCR RCR AL,1  RCR AL,1 ướ 0 1 0 0 1 1 0 1 Tr 1 0 0 1 1 0 1 1 CF = 0 CF = 1 1 0 1 0 0 1 1 0 CF =1

ROL , ROR 3.3.11 L nh ệ

ROL/ROR ,1

Quay các bit c a thanh ghi sang trái (ROL) ho c sang ph i (ROR) 1 c t ủ ặ ả ộ

ROL/ROR ,CL

ặ ả ộ ớ Quay các bit c a thanh ghi sang trái (ROL) ho c sang ph i (ROR) n c t, v i ủ n là giá tr ch a trong CL ị ứ

 c khi ROL ROL AL,1  ROL AL,1 ướ Tr 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0

 c khi ROR ROR AL,1  ROR AL,1 ướ Tr 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0

3.4 Các l nh so sánh và chuy n đi u khi n c b n ể ơ ả ề ệ ể

JMP 3.4.1 L nh ệ

JMP

CMP và TEST 3.4.2 L nh ệ

c gi , ừ Dest cho Src, k t qu không đ ế ả ượ l ữ ạ ờ ệ i, các c hi u CMP Th c hi n phép tr ệ ự b thay đ i. ổ ị

, c gi i, các c Dest v i ớ Src, k t qu không đ ế ả ượ l ữ ạ ờ Test Th c hi n phép AND ự ệ hi u b thay đ i. ệ ổ ị

ượ c ph i h p cùng v i các l nh chuy n đi u khi n theo ệ ố ợ ể ề ể ớ Hai tác v này đ ụ đi u ki n. ệ ề

3.4.3 Các l nh chuy n đi u khi n theo đi u ki n ệ ể ề ể ề ệ

L nh chuy n đi u khi n theo đi u ki n có d ng th c chung nh sau : ứ ư ệ ể ề ể ề ệ ạ

ộ ấ ề ng trình. Khi đi u i v trí ươ ệ ệ ạ ị ệ ể

ệ ề ề ể ệ S không d u L nh chuy n đi u khi n theo đi u ki n so sánh ể S có d u ố ấ ấ ố

JA JAE , JNB JE , JZ JBE , JNA JB JNE , JNZ JG JGE , JNL JE , JZ JLE , JNG JL JNE , JNZ So sánh > >= = <= < <>

L nh chuy n đi u khi n theo c hi u ờ ệ ệ ề ể ể ổ ờ ệ L nh làm thay đ i c hi u ệ tr c ti p ự ế L nhệ

L nhệ STC CLC STD CLD STI CLI Đi u ki n ệ ề CF = 1 CF = 0 DF = 1 DF = 0 IF = 1 IF = 0

JC JNC JZ JNZ JO JNO JP JNP JS JNS JNS JCXZ Đi u ki n ệ ề CF = 1 CF = 0 ZF = 1 ZF = 0 OF = 1 OF = 0 PF = 1 PF = 0 SF = 0 SF = 0 SF = 0 CX = 0

ng đi theo sau l nh ệ Các l nh chuy n đi u khi n theo đi u ki n th ề Các l nh chuy n đi u khi n không làm thay đ i giá tr c a các c hi u. ệ CMP ờ ệ ườ ổ ị ủ ệ ệ ể ể ể ể ề ề

LOOP 3.4.4 L nh ệ

LOOP

ng trình. ộ ị ấ ươ ng đ ng:

SUB CMP JNE CX,1 CX,0

ệ ự ế ỗ ầ ệ ệ ế ế ệ ệ ự ế ể ẽ ả ự ệ ầ

ng trình v i Assembler 86 3.5 Vi ẽ ự M i l n th c hi n LOOP , CX gi m đi 1 , sau đó n u CX=0 CPU s th c ả i hi n l nh ti p theo , n u CX>0 CPU s chuy n đ n th c hi n l nh t ạ

3.5.1 Thí d 1ụ

Code

segment assume cs,ds,es:code 0100h org

Main proc

near

; Day la ghi chu ; Sau dau cham phay la ghi chu

mov int

ah,1 021h

; ah=1 , Read char function ; ch nh n m t phím ộ

ờ ấ

int

020h

ng trình và quay l

i ạ

; k t thúc ch ươ ế ; d u đ i l nh ấ ợ ệ

Main endp

Code

ends end Main

t các ch ng trình đ u tiên b ng cách dùng thí d 1 làm m u, ch c n thay ể ế ằ ỉ ầ ầ ẫ Có th vi th các các dòng l nh màu xanh b ng ph n ch ng trình c a mình ươ ệ ế ằ ầ ươ ụ ủ

3.5.2 Thí d 2ụ

Code

segment assume cs,ds,es:code 0100h org

Main proc

near

lea mov int int

dx,chuoi ah,9 021h 020h

ng trình và quay l

i ạ

; n p đ a ch c a chuoi vào dx ỉ ủ ; ah=9 , Print string ; In chuoi ra màn hình ; k t thúc ch ươ ế ; d u đ i l nh ấ ợ ệ

Main endp

chuoi db 'Chao ban', '$'

Code

ends end Main

3.5.3 Khai báo và s d ng b nh : ớ ử ụ ộ

t cho b vi x lý 8088 là m t t p h p các byte v a mã ừ ế ươ ợ t ả ự ổ ứ ế ng trình đ ch c và s p x p đ ể ắ ườ ế ữ ữ ệ c th c hi n b vi x lý không nh m l n gi a d li u ầ ộ ậ ng trình ph i t ươ ộ ử ẫ ộ i vi ự ử t ch ệ

ng trình dùng đ l u tr d ể ươ ể ư ữ ữ ng trình vi Ch l nh v a d li u. Ng ừ ữ ệ ệ khi ch ượ ươ và mã l nh.ệ Ta có th khai báo m t vùng nh trong ch ớ ộ li u b ng các dòng l nh nh sau: ệ ư ệ ằ

ầ ượ

t có giá tr là 1,2,3,4 4 byte l n l ị a và b 2 byte mã ASCII c a ký t

ả ả

; Mô t ; Mô t

4 byte c a chu i ‘chao’

db db db db

1,2,3,4 'a', 'b' 1,2,'a' 'chao'

; Mô t

2 word (4 byte) 0 và 1 2 dword (8 byte) 0 và 1

ả ả

dw dd

0,1 0,1

; Mô t ; Mô t

c gán trong ị ượ ng các ô nh đ ả c xác đ nh b ng s l ng các giá tr ố ượ các ô nh và giá tr đ ớ ố ượ ằ ị ị

d li u có kích th d li u có kích th d li u có kích th c 1 byte c 2 byte c 4 byte Khai báo ki u d li u ( ch ng trình. S l ươ c li đ ệ ượ ể ữ ệ db n đ nh m i ph n t Ki u d li u ấ ể ữ ệ dw n đ nh m i ph n t Ki u d li u ấ ể ữ ệ dd n đ nh m i ph n t Ki u d li u ấ ể ữ ệ db,dw,dd ) mô t ớ ượ t kê ngay sau khai báo ki u d li u. ể ữ ệ ầ ử ữ ệ ỗ ầ ử ữ ệ ỗ ầ ử ữ ệ ỗ ị ị ị ướ ướ ướ

c các vùng d li u đã khai báo trong ch ượ ữ ệ ươ ể ử ụ ng trình, c khai i ta “đánh d u” các v trí đó b ng cách đ t các nhãn ngay tr ằ ấ ặ ị ướ Đ có th s d ng đ ể ng ườ báo ki u:ể

chuoi tongso dayso

db db db

'chao' 0 5,6,7,8

Sau đó có th khai thác các vùng nh này nh sau: ư ể ớ

ị ủ chuoi vào thanh ghi dx: Gán đ a ch (offset) c a ỉ mov dx, offset chuoi ho cặ lea dx, chuoi

i ô nh Gán giá tr đang l u t ị ớ tongso (1 byte) vào thanh ghi al: ư ạ al, byte ptr tongso mov Gán giá tr trong al vào ô nh ị ớ tongso (1 byte): byte ptr tongso,al mov

dayso vào al: Gán giá tr c a ô nh th 1 trong ớ ứ ẽ ằ al, tongso[0] ; AL s b ng 5 Gán giá tr c a ô nh th 2 trong dayso vào al: ớ ứ ẽ ằ al, tongso[1] ế ớ ị ; AL s b ng 6 t ả ườ ế ng minh v lo i d li u ề ạ ữ ệ ả ợ thì trình h p byte ptr ho c ặ word ptr . N u không mô t ị ủ mov ị ủ mov Khi tham chi u đ n m t vùng nh , nên mô t ộ ế b ng ch đ nh ỉ ằ d ch s l y theo ki u d li u đã khai báo. ẽ ấ ị ể ữ ệ

3.5.4 S d ng các ch c năng h th ng: ệ ố ử ụ ứ

c thi ề ệ t cho PC th ươ ể ể ề ng trình vi ế đ u. Cách th c này đ i t ệ ạ ừ ầ t b đ ế ị ượ ườ ứ t k s n ế ế ẵ ng dùng các đo n ạ c g i là s ượ ọ ệ ử Có nhi u đo n mã l nh dùng đ đi u khi n các thi ạ trong BIOS ho c OS. Các ch ặ mã l nh này h n là ph i th c hi n l ả ự ơ d ng các ch c năng c a h th ng. ủ ệ ố ụ ứ

*M t s ch c năng h th ng đ n gi n c a DOS: ệ ố ộ ố ứ ả ủ ơ

i phím này ra màn hình ờ ọ ạ

ah,1 021h Sau khi th c hi n AL = mã ASCII c a phím đ c gõ vào Ch đ c m t phím, có in l ộ mov int ệ ự ủ ượ

ra màn hình In m t ký t ộ

ự mov mov int dl, ah,2 021h

In m t chu i ký t ra màn hình ộ

ự dx,offset ah,9 021h $, ỗ mov mov int ph i k t thúc b ng ký t ự ả ế ự ằ Chu i ký t ỗ

M t s các ký t ng đ n ch c năng in nh sau: ộ ố ự ề đi u khi n có nh h ể ả ưở ứ ư ế

bên trái ộ ế ự

7 : Bell 8 : Back Space (BS) 10 : Line Feed (LF) 13 : Carriage Return (CR)  beep m t ti ng  xóa ký t  xu ng hàng ố  v đ u dòng ề ầ

*M t s ch c năng h th ng đ n gi n c a BIOS: ệ ố ộ ố ứ ả ủ ơ

Ch đ c m t phím, không in l i phím này ra màn hình ờ ọ ạ

ah,0 016h Sau khi th c hi n AL = mã ASCII c a phím đ c gõ vào ộ mov int ệ ự ượ

c b m ủ AH = scan code c a phím AL b ng 0 khi m t s các phím ch c năng đ ộ ố ủ ứ ằ ượ ấ

Đ c tr ng thái c a bàn phím ọ ạ

ủ ah,2 016h Sau khi th c hi n AL = byte tr ng thái c a bàn phím mov int ệ ự ủ ạ

v i thu c tính màu, b t đ u t i v trí row và col: In chu i ký t ỗ ự ớ ắ ầ ạ ị

; 0 - 24 ; 0 - 79 ộ ax,01301h bh,0 bl, bp,offset cx, dh, dl, 010h mov mov mov mov mov mov mov int

Màn hình PC trong text mode có 25 dòng, m i dòng 80 ký t ỗ . ự

đ c t o thành t màu n n (Background color) và màu ký t ự ượ ạ ừ ề ự ứ Màu c a ký t ủ (Foreground/Text color) theo công th c sau: Color_code = Foreground_Color + 16*Background_Color

Hãy dùng Tech Help đ tham kh o các ch c năng c a BIOS và DOS ủ ứ ể ả