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
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
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
ẩ ủ ặ ả ộ Đ 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
ẩ ủ ặ ả ộ Đ 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
Quay các bit c a thanh ghi và CF sang trái ho c sang ph i 1 c t ủ ặ ả ộ
RCL/RCR
ủ ặ ả ộ ớ 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
Quay các bit c a thanh ghi sang trái (ROL) ho c sang ph i (ROR) 1 c t ủ ặ ả ộ
ROL/ROR
ặ ả ộ ớ 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
ượ 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,
In m t chu i ký t ra màn hình ộ
ự
dx,offset
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,
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 ủ ứ ể ả