B vi x lý 8088/8086 và l p trình h p ng x86
3.1 Thanh ghi (Register)
Là các ph n t nh đ c bi t bên trong b vi x lý. các thanh ghi luôn có kích th c ướ
b ng nhau, kích th c này cũng chính là đ r ng c a data bus bên trong b x lý. ướ
8088 là b vi x lý 16 bit do đó các thanh ghi c a 8088 đ u có kích th c 16 bit. ướ
M t s tác v đ c bi t nh nhân hay chia, k t qu b t bu c ph i đ t trong thanh ư ế
ghi
M t s thanh ghi ch dùng đ xác đ nh đ a ch cho b x
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: ư
Nhóm thanh ghi đa d ng (General registers):
F E D C B A 9 8 7 6 5 4 3 2 1 0
AX AH AL
BX BH BL
CX CH CL
DX DH DL
Nhóm thanh ghi ch m c và con tr (Index & Pointer registers):
F E D C B A 9 8 7 6 5 4 3 2 1 0
SI SI
DI DI
BP BP
SP SP
Nhóm thanh ghi phân đo n (Segment registers):
F E D C B A 9 8 7 6 5 4 3 2 1 0
DS DS
ES ES
SS SS
CS CS
Thanh ghi c hi u:
F E D C B A 9 8 7 6 5 4 3 2 1 0
Flag O D I T S Z A P C
Thanh ghi contr l nh (Instruction Pointer) :
F E D C B A 9 8 7 6 5 4 3 2 1 0
Flag IP
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
Đóng vai trò ch y u nh các ph n t nh c b n trong các quá trình tính ế ư ơ
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 ư
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):
DS,ES,SS,CS
Không th tham gia vào các tác v tính toán, th ng ch dùng đ xác đ nh ườ
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 ng ch y u là thanh ghi và ế ượ ế
b nh . Các thanh ghi d c xác đ nh b ng tên , các ph n t thu c b nh đ c ượ ượ
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á
tr 16 bit g i là segment và offset. Đ a ch v t lý t ng ng đ c tính theo công ươ ượ
th c :
Memory_Address = Segment * 10h + Offset
20 bit 16 bit 16 bit
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 0000:046C 0020:026C
là các bi u di n c a d a ch v t lý 20 bit 00046C.
3.2.1 Segment:
Segment là m t đo n b nh kích th c t i đa 64KB (16 bit offset) và có ướ
th b t đ u t i các đ a ch chia ch n cho 16 (10h) trên toàn b vùng nh
1MB (20 bit).
Trong h u h t các tác v c a b x lý 8088, segment d c xác đ nh gián ế ượ
ti p qua các thanh ghi segment DS , ES , SS , CS . Khi c n s d ngế
segment nào , ph i gán giá tr t ng ng cho các thanh ghi segment . Lúc đó ươ
các đ a ch đ c th hi n thành d ng Segment:offset ượ
Thí d : CS:Offset , DS:Offset
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
* Nh n xét: Offset có th mô t b ng m t t ng c a : H ng s 16 bit và các
thanh ghi ch m c BX, BP, SI, DI . Trong đó các c p BX và BP , SI và DI
không đ c phép cùng xu t hi nượ
3.3 Các l nh c b n ơ
Các l nh c a b vi x lý 8088 d i đây s đ c mô t theo d ng th c: ướ ượ
Tên_L nh[Đích [, Ngu n]]
Đí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 ng trình (Label) ươ
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)
ĐíchNgu n không đ ng th i là hai đ a ch trong b nh (Mem)
3.3.1 L nh MOVE
MOVE <Dest>,<Src>
Giá tr c a Src d c gán (assign) vào ượ Dest
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
3.3.2 L nh XCHG
XCHG <Dest>,<Src>
Giá tr c a SrcDest đ i ch cho nhau
SrcDest ch có th là Reg ho c Addr/Mem
Không th XCHG gi a các thanh ghi segment v i nhau.
3.3.3 L nh INC , ADD ADC
INC <Dest>
L y Dest c ng v i 1 r i gán k t qu vào ế Dest
ADD <Dest>,<Src>
L y Dest c ng v i Src r i gán k t qu vào ế Dest
ADC <Dest>,<Src>
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 ế Dest
3.3.4 L nh DEC , SUB SBB
DEC <Dest>
L y Dest tr đi 1 r i gán k t qu vào ế Dest
SUB <Dest>,<Src>
L y Dest tr đi Src r i gán k t qu vào ế Dest
SBB <Dest>,<Src>
L y Dest tr đi Src và tr ti p ế 1 n u ếCF=1 r i gán k t qu vào ế Dest
3.3.5 L nh MUL
MUL <Reg_8bit/Mem_8bit>
L y AL nhân v i Reg_8bit ho c Mem_8bit
K t qu (16 bit) gán vào ế AX
MUL <Reg_16bit/Mem_16bit>
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)
3.3.6 L nh DIV
DIV <Reg_8bit/Mem_8bit>
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 <Reg_16bit/Mem_16bit>
L y DX,AX (32 bit) chia cho Reg_8bit ho c Mem_8bit
K t qu (16 bit) gán vào ế AX , s d (16 bit) gán vào ư DX
3.3.7 L nh IMUL và IDIV
Gi ng MUL và DIV, nh ng th c hi n trên các giá tr d u và cho ra k t ư ế
qu có d u
3.3.8 L nh AND , OR , XOR NOT
ADD <Dest>,<Src>
OR <Dest>,<Src>
XOR <Dest>,<Src>
L y Dest AND/OR/XOR v i Src r i gán k t qu vào ế Dest
NOT <Dest>
L y NOT c a Dest gán vào Dest