
1
B thanh ghi trong 8086
Các thanh ghi trong b vi x lí 8086 u là các thanh ghi 16 bit và ưc chia thành các
nhóm như sau:
- Các thanh ghi công dng chung
AX (accumulator), BX (base), CX (counter), DX (data): có th ưc truy xut c
lp như 2 thanh ghi 8 bit : AH và AL, BH và BL, CH và CL, DH và DL.
- Các thanh ghi con tr và ch mc (xem chi tit các phn sau)
SP (Stack Pointer), BP (Base Pointer): con tr dùng khi làm vic vi stack
SI (Source Index), DI (Destination Index): ch s mng khi x lí mng (chui)
- Các thanh ghi phân on
CS (Code Segment), DS (Data Segment), ES (Extra data Segment), SS (Stack
Segment): tương ng lưu a ch phân on mã lnh, phân on d liu, phân on d liu
b sung, phân on ngn xp. a ch phân on này s ưc kt hp vi a ch offset
truy xut ô nh. (xem chi tit các phn sau)
- Các thanh ghi con tr lnh và trng thái
IP (Intruction Pointer): thanh ghi cha a ch offset ca lnh k tip cn thc
hin. Thanh ghi này không th ưc truy xut trc tip.
FLAGS: thanh ghi c trng thái, dùng cha các bit mô t trng thái ca lnh
v!a ưc thc hin, ho"c cha các bit iu khin cn thit lp trưc khi g#i lnh. Bao g$m
các bit c sau ây: (xem chi tit các phn sau)
CF (Carry Flag): bt khi phép tính v!a thc hin có s dng bit nh
PF (Parrity Flag): bt khi kt qu ca phép tính v!a thc hin có ch%n bit 1
AF (Auxilary Flag): bt khi phép tính v!a thc hin có s dng bit nh ph
ZF (Zero Flag): bt khi kt qu ca phép tính v!a thc hin là 0
SF (Sign Flag): bt khi kt qu ca phép tính v!a thc hin có bit du bt
TF (Trace Flag): bt chuyn sang ch chy t!ng bưc
IF (Interrupt Flag): bt cho phép các ng&t xy ra
DF (Direction Flag): bt ch#n ch gim ch s t ng khi làm vic vi mng
OF (Overflow Flag): bt khi phép tính v!a thc hin gây ra tràn s

2
Cu trúc mã lnh – Các kiu nh v d liu
Cu trúc mã lnh (Instruction format) trong 8086
Mt lnh (instruction) mà b vi x lí có th hiu ưc thư ng rt ơn gin. Ví d như di
chuyn d liu t! mt ô nh vào thanh ghi, cng thanh ghi th hai vào thanh ghi th nht,…
Trong 8086 mi lnh thư ng tác ng n 0,1 ho"c 2 i tưng (operand, tm g#i là toán hng).
Toán hng có th là mt thanh ghi, mt h'ng s ho"c mt ô nh.
Thông thư ng, mt lnh (instruction) có cu trúc như sau:
Hình 1. Cu trúc mã lnh
Trư ng Prefix dùng thay i thanh ghi phân on m"c nh ho"c ch nh s l"p li ca
lnh trong thao tác x lí chui.
Trư ng Opcode là mã ca thao tác, cho bit lnh này làm gì.
Bit D (direction) cho bit hưng tác ng ca lnh.
Bit W (width) cho bit kích thưc ca toán hng.
Hai trư ng REG và R/M mô t hai toán hng chu tác ng ca lnh.
Trư ng REG cha mã s ca mt thanh ghi.
Trư ng R/M có th là mã s ca mt thanh ghi (trư ng hp toán hng là thanh ghi) ho"c là
mô t cách tính a ch ca mt ô nh trong b nh (trư ng hp toán hng là ô nh).
Trư ng MOD cho bit trư ng R/M mô t thanh ghi hay ô nh, c(ng như cho bit có trư ng
Displacement phía sau hay không.
Trư ng Displacement ưc s dng khi toán hng là ô nh. Trư ng này ưc s dng kt
hơp vi các thông tin lưu trong trư ng R/M tính a ch ca toán hng.
Trư ng Immediate ưc s dng khi toán hng là mt h'ng s.
Không phi lnh nào c(ng có các trư ng ưc miêu t trên.
Chi tit v các trư ng như sau:
D = 1
REG là ích n
D = 0
REG là ngu$n
W = 1
Toán h
ng l
à word
W = 0
Toán hng là byte
REG
W = 1
W = 0
Segment
000
AX
AL
ES
001
CX
CL
CS
010 DX DL SS
011 BX BL DS
100 SP AH
101 BP CH
110
SI
DH
111
DI
BH
Bng 1 Mã trưng REG và các bit D, W

3
MOD
Ý ngha ca R/M và Displacement
00 Nu R/M = 110 thì EA = disp-high _ disp-low
Nu R/M ) 110 thì phn displacement không có.
01 DISP = disp-low, s ưc signed extended
10 DISP = disp-high _ disp-low
11 R/M mô t thanh ghi
Bng 2. Mã trưng MOD
R/M
Cách tính a ch (Effective Address)
000
EA = BX + SI + DISP
001
EA = BX + DI + DIS
P
010
EA = BP + SI + DISP
011 EA = BP + DI + DISP
100 EA = SI + DISP
101 EA = DI + DISP
110 EA = BP + DISP (tr! trư ng hp MOD = 00, xem trên)
111
EA = BX + DISP
Bng 3. Mã trưng R/M
Ví d: Lnh chép ni dung thanh ghi DX vào CX có mã 8BCAh, lnh chép ni dung thanh
ghi CX vào DX có mã 8BD1h.
Hình 2. Mã lnh MOV gia hai thanh ghi
Ví d: Lnh chép ni dung bin var (có a ch DS:1234h) vào thanh ghi CX có mã
8B0E1234h. (Xem Hình 3). Lnh chép ngưc li có mã 890E1234h. Hai mã này ch khác nhau
bit D. Trư ng hp th nht, D = 1 vì thanh ghi CX là ích n. Trư ng hp th hai, D = 0 vì
thanh ghi CX là ngu$n. Trong c hai trư ng hp, a ch (EA) ca ô nh (bin var) ưc ly trc
tip t! 2 bytes ca vùng Displacement (MOD = 00 và R/M = 110, xem bng phía trên). Hai
byte disp-high và disp-low ca vùng Displacement cha offset ca bin var trong phân on d
liu.

4
Hình 3. Mã lnh MOV gia thanh ghi và b nh
Mt s lnh có cu trúc "c bit, ví d, ghép chung trư ng opcode vi trư ng reg, nh'm
giúp rút ng&n dài lnh. Ví d: lnh gán AX b'ng 4567h có mã B84567h.
a) Cu trúc chung
b) Ví d: MOV AX, 4567h
Hình 4. Mã lnh MOV gia Accumulator và hng s
Khi toán hng là mt thanh ghi phân on, ch cn 2 bit ch nh mt trong bn thanh ghi
phân on. Ngh*a là trư ng REG luôn có dng 0xx. Bit xx ưc nh ngh*a như trong Bng 1. Ví
d, lnh chép ni dung thanh ghi AX vào thanh ghi phân on DS có mã là 8ED8h.
Hình 5. Mã lnh MOV gia thanh ghi thưng và thanh ghi phân on
Khi có ch nh thanh ghi phân on dùng truy xut b nh khác vi thanh ghi phân on
m"c nh thì trong mã lnh xut hin thêm Prefix. Ví d: lnh chép ni dung ô nh ES:2345h
vào thanh ghi DS có mã 268E1E2345h, trong ó 26h là prefix.
Hình 6. Mã lnh MOV gia thanh ghi phân on và ô nh, có s dng segment override prefix

5
Stack và ng dng trong vic gi chương trình con, gi ngt
Khái nim stack
Stack là mt vùng b nh mà ó, ngoài vic truy xut trc tip các ô nh b'ng a ch,
ngư i ta nh ngh*a thêm hai thao tác là PUSH (b vào) và POP (ly ra). Stack thư ng ưc
dùng làm nơi lưu tr tm th i các giá tr trung gian ho"c dùng trong vic g#i chương trình con.
Nu ch s dng hai thao tác PUSH & POP truy xut d liu trong stack thì stack ging
như mt cái thùng ng tài liu. Nhng gì b vào sau s n'm trên nhng gì b vào trưc, do ó
khi ly ra thì bao gi c(ng phi ly cái b vào sau cùng. Ngư i ta g#i cu trúc như vy là LIFO
(last in first out).
ghi li a ch offset nơi b d liu vào sau cùng, ngư i ta dùng thanh ghi SP, còn a ch
segment thì ưc lưu trong thanh ghi SS. Ví d: (Xem Hình 7, Hình 8)
Thao tác PUSH AX bao g$m: gim SP i 2, ưa giá tr ca AX vào ô nh có a ch SS:SP.
Thao tác POP AX bao g$m: ưa giá tr t! ô nh có a ch SS:SP vào AX, tng SP lên 2.
Như th, stack ưc s dng (còn g#i là “n ra”) theo chiu gim ca a ch, khác vi các
vùng nh thông thư ng ưc s dng theo chiu tng ca a ch.
Nu không khai báo phân on stack, theo m"c nh, on stack và code s chung nhau, và
khi chương trình b&t u thc hin, SP ưc khi ng giá tr 0. Vì vy, thao tác
PUSH xx ln u tiên s "t giá tr xx ti a ch SS:FFFEh (vì 0 – 2 = FFFEh), thao tác
PUSH yy lin tip theo s "t giá tr yy ti a ch SS:FFFCh. (Xem Hình 9)
Nu có khai báo phân on stack, ví d: “.stack 200h”, on stack s ưc cp phát riêng,
và khi chương trình b&t u thc hin, SP ưc khi ng giá tr 200h. Vì vy, thao tác
PUSH xx ln u tiên s "t giá tr xx ti a ch SS:01FEh, thao tác
PUSH yy lin tip theo s "t giá tr yy ti a ch SS:01FCh. (Xem Hình 10)
a) AX có giá tr 3412h, trưc thao tác PUSH AX b) Sau thao tác PUSH AX
Hình 7. Thc hin PUSH AX
a) Trưc thao tác POP AX b) Sau thao tác POP AX, thanh ghi AX có giá tr A020h
Hình 8. Thc hin POP AX

