Tải bản đầy đủ (.pdf) (10 trang)

Bài giảng hợp ngữ - Chương 1 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (102.08 KB, 10 trang )

Bài ging hp ng Chng I: Các khái nim c bn
5
CHNG I: CÁC KHÁI NIM C BN
1.1 Mu
Hp ng (Assembly language) là mt ngôn ng lp trình cp thp, mc ích nhm giao
tip trc tip vi phn cng ca máy tính.
Máy tính ch có kh nng hiu c các tín hiu 0, 1 di dng n hoc t, gi là tín
hiu nh phân (ngôn ng nh phân còn c gi là ngôn ng máy). Các lnh ca hp ng
thc cht là dng kí hiu ca ngôn ng máy: hp ng s dng các kí hiu bng ting Anh
 biu din các lnh ngôn ng máy cho d nh hn. Ví d:
nh ngôn ng máy nh hp ng
1011 0100 0010 1010
1100 1101 0010 0001
MOV AH,2Ah
INT 21h
Ta thy các lnh máy tính bng các dãy bít 0, 1 rt dài và khó nh, còn lnh hp ng
thì ngn gn hn nhiu. Khi chy mt chng trình hp ng thì phi dch nó sang ngôn
ng máy.
Hc hp ng, không ch hc mt ngôn ng lp trình có tc  rt nhanh (hp ng là
ngôn ng lp trình có tc  nhanh nht) mà còn  nm bt c bn cht bên trong ca
máy tính, bit cách tác ng trc tip vào phn lõi ca máy tính.
1.2 Biu din s và kí t trong máy tính
1.2.1 Mt s hm
a) H thp phân (Decimal) - Hm c s 10
H thp phân s dng 10 kí hiu (0, 1, 2, 9)  biu din thông tin. Các s trong h
thp phân c biu din di dng tng các lu tha c s 10.
Ví d:
S 1998 trong h thp phân có th biu din nh sau:
(1998)
10
= 1x10


3
+ 9x10
2
+ 9x10
1
+ 8x10
0
Trong hp ng, ngi ta kí hiu 1 s thp phân bng ch D hoc d  cui (vit tt ca
Decimal), cng có th không cn vit các chó.
Ví d:
(1998)
10
c kí hiu là: 1998D, 1998d, hoc n gin là 1998
b) H nh phân (Binary) - Hm c s 2
H nh phân s dng 2 kí hiu (0,1)  biu din thông tin. Các s trong h nh phân
c biu din di dng tng các lu tha c s 2.
Ví d:
S 1101 trong h nh phân có th biu din nh sau:
(1101)
2
= 1x2
3
+ 1x2
2
+ 0x2
1
+ 1x2
0
= (13)
10

Trong hp ng, ngi ta kí hiu 1 s nh phân bng ch B hoc b  cui (vit tt ca
Binary).
Ví d:
Bài ging hp ng Chng I: Các khái nim c bn
6
(1101)
2
c kí hiu là: 1101B, hoc 1101b
c) H thp lc phân (Hexa Decimal) - Hm c s 16
H thp lc phân s dng 16 kí hiu (0, 1, 2, 9, A, B, C, D, E, F)  biu din thông
tin. Các kí hiu A, B, C, D, E, F ln lt ng vi các giá tr 10, 11, 12, 13, 14, 15 trong h
thp phân. Các s trong h thp lc phân c biu din di dng tng các lu tha c
 16.
Ví d:
S 2B trong h thp lc phân có th biu din nh sau:
(2B)
16
= 2x16
1
+ Bx16
0
= (43)
10
Trong hp ng, ngi ta kí hiu 1 s thp lc phân bng ch H hoc h  cui (vit tt ca
Hexa Decimal).
Ví d:
(2B)
16
c kí hiu là: 2BH, hoc 2Bh
Chú ý: Kí hiu mt s thp lc phân trong chng trình hp ng phi luôn bt u bng

. Ví d s (FA)
10
c kí hiu là 0FAh (ch không kí hiu là FAh).
H thp lc phân (gi tt là h hex) là hm c s dng nhiu nht trong hp ng,
do nó có th biu din nhng dãy bít nh phân dài bng nhng kí hiu ngn gn, d nh
n.
d) Chuyn i gia các hm
• Chuyn t h thp phân v h nh phân:
Quy tc chuyn: em s thp phân chia liên lip cho 2, cho ti khi thng s bng 0 thì
ng li. Vit các s d ngc t di lên ta thu c s nh phân tng ng.
Ví d: Chuyn s thp phân 13 sang h nh phân.
13 2
 1 6 2
d 0 3 2
d 1 1 2
 1 0
Vit các s d ngc t di lên ta thu c s nh phân 1101b.
• Chuyn t h thp phân v h thp lc phân:
Quy tc chuyn: em s thp phân chia liên lip cho 16, cho ti khi thng s bng 0 thì
ng li. Vit các s d ngc t di lên ta thu c s thp lc phân tng ng.
Ví d: Chuyn s thp phân 43 sang h thp lc phân.
43 16
 11 2 16
d 2 0
Vit các s d ngc t di lên ta thu c s thp lc phân 2Bh (chú ý là 11d = 0Bh).
Bài ging hp ng Chng I: Các khái nim c bn
7
• Chuyn i gia h nh phân và h thp lc phân:
Vic chuyn i gia 2 hm này khá d dàng do mi kí hiu trong h hex li tng
ng vi 4 kí hiu nh phân. Xem bng chuyn i sau:

 thp phân H Hex H nh phân
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
Ví d 1:
Chuyn i 2Ah sang h nh phân.
Tra bng ta thy: 2h = 0010b, Ah = 1010b
y 2Ah = 00101010b
Ví d 2:
Chuyn i 10110110b sang h hex.
u tiên ta chia dãy bít nh phân thành tng nhóm 4 bít, thu c 2 nhóm sau: 0110 và
1011.
Tra bng ta thy: 0110b = 6h, 1011b = Bh
y 10110110b = B6h
1.2.2 Biu din s nguyên trong máy tính
Do gii hn ca phn cng máy tính, d liu trong máy tính thng c biu din bi
các nhóm 8 bít (gi là Byte)

1 byte = 8 bit
2 byte = 16 bit = 1 word
Ngi ta có th ghép nhiu byte hay nhiu word  to thành dãy bít dài hn. Dãy bít
càng dài thì lng thông tin biu din c càng ln. Nu gi N là s bít ca dãy thì s
kh nng biu din = 2
N
.
Xét mt dãy bít nh phân:
1 0 0 1 0 0 0
msb lsb
Bài ging hp ng Chng I: Các khái nim c bn
8
Bít u tiên (bên trái) c gi là bít nng nht hay bít cao nht ca dãy (Most
Significant Bit).
Bít cui cùng (bên phi) c gi là bít nh nht hay bít thp nht ca dãy (Least
Significant Bit).
a) S nguyên không du:
Mt s nguyên không du (s không âm) c biu din bi 1 dãy bít nh phân nh ta
ã xét  phn trc (phn hm nh phân). ây ta ch nhn mnh thêm v chiu dài
a dãy bít:  dài dãy bít khi biu din trong máy tính luôn là bi s ca 8.
Ví d: Biu din s nguyên 13 trong máy tính.
 phn trc ta ã bit: s nguyên 13 chuyn sang h nh phân s là 1101
Trong máy tính s có nhiu cách  biu din s nguyên này:
+ S nguyên dng byte (8 bit): 00001101
+ S nguyên dng word (16 bit): 00000000 00001101
b) S nguyên có du:
i vi s nguyên có du thì khi biu din di dng nh phân ta phi dành ra 1 bít 
xác nh du. ó là bít u tiên ca dãy (bít nng nht - Msb).
Msb = 0: Du Dng
Msb = 1: Du Âm

Nh vy, nu chiu dài dãy bít là 8 thì bít u tiên  xác nh du, 7 bít còn li xác nh
giá tr s nguyên?
Ví d:
 +13 c biu din bi dãy bít 0000 1101.
y s -13 c biu din nh th nào, có phi là dãy bít 1000 1101 hay không?
Nguyên tc  biu din s âm trong máy tính: phi tho mãn u kin sau
 Âm (nh phân) + S Dng (nh phân) = 0
Gi s s -13 c biu din bi dãy bít 1000 1101, ta em nó cng vi dãy bít biu din
 +13  kim tra:
0000 1101
+ 1000 1101
1001 1010
 0
Ta thy tng thu c khác 0, nh vy ây không phi là dãy bít cn tìm
Quy tc tìm si: Cho 1 s nguyên A. Gi sã bit dãy bít biu din A, khi ó mun
tìm dãy bít biu din s -A ta làm nh sau:
c 1: Tìm s bù 1 ca A bng cách o tt c các bít.
Ví d: A = 0000 1101
Khi ó s bù 1 ca A là 1111 0010
c 2: Tìm s bù 2 (bng cách ly s bù 1 cng vi 1)
1111 0010
+ 1
1111 0011
 bù 2 tìm c (1111 0011) chính là dãy bít biu din s -A.
Bài ging hp ng Chng I: Các khái nim c bn
9
Ta th kim tra li bng cách cng 2 dãy bít:
0000 1101
+ 1111 0011
1 0000 0000

t qu thu c bng 0 chng t ta ã tìm úng (vì ang biu din s nguyên bng mt
dãy 8 bit nên s 1 trong kt qu trên có th loi b - s gii thích k hn trong chng
sau).
y -13 = 1111 0011b
Bài toán ngc:
Cho mt dãy bít nh phân sau ây (16 bit):
1110 0111 0001 1000b
Hãy xác nh xem nó biu din s nguyên nào?
Gii:
i s nguyên ó là N.
Có 2 trng hp xy ra:
• u ây là s nguyên không du:
N = 1x2
15
+ 1x2
14
+ 1x2
13
+ 1x2
10
+ 1x 2
9
+ 1x2
8
+ 1x2
4
+ 1x2
3
= 32768 + 16384 +8192 + 1024 + 512 + 256 + 16 + 8
= 59160

• u ây là s nguyên có du:
Vì Msb = 1 nên N là s âm. n gin ta s xác nh –N (s dng) trc, tó suy ra
N.
Tìm –N bng cách tìm s bù 2 ca N
c 1: o bít
 bù 1 = 0001 1000 1110 0111
c 2: em cng vi 1
0001 1000 1110 0111
+ 1
0001 1000 1110 1000
Ta tìm c –N = 0001 1000 1110 1000b
= 1x2
12
+ 1x2
11
+ 1x 2
7
+ 1x2
6
+ 1x2
5
+ 1x2
3
= 4096 + 2048 + 128 + 64 + 32 + 8
= 6376
y N = -6376
1.2.3 Biu din kí t trong máy tính
Khi s dng máy tính, ta không ch làm vic vi các con s mà còn phi làm vic vi
nhiu loi d liu khác nhau, trong ó có các kí t. Các kí t cng c biu din bi các
dãy bít nh phân, s biu din này mang tính cht quy c.

Tuy nhiên, nu mi ngi, mi c quan, mi quc gia li ta ra quy c ca riêng
mình thì s rt khó khn cho vic trao i thông tin. Nhu cu t ra là cn phi có mt h
thng quy c chung mang tính quc t.
Cách thc mã hoá kí tc s dng rng rãi nht trên các máy PC da trên bng mã
ASCII (American Standard Code for Information Interchange). H thng này s dng 8
bít  biu din 1 kí t.
Bài ging hp ng Chng I: Các khái nim c bn
10
Ví d:
Kí t Mã nh phân Mã hex
A 0100 0001 41h
B 0100 0010 42h

a 0110 0001 61h
b 0110 0010 62h

1 0011 0001 31h
2 0011 0010 32h

* 0010 1010 2Ah
+ 0010 1011 2Bh

(Bng mã ASCII y  xin xem phn ph lc 2)
Hin nay có rt nhiu bng mã khác nhau c s dng, ph bin nht là mã Unicode,
i  dài dãy bít có th thay i khá mm do, và nó vn gic s tng thích vi
mã ASCII truyn thng.
1.3 T chc ca máy tính
1.3.1 S h thng máy tính
Ngi ta thng chia các b phn ca máy tính làm 4 khi sau:
Trong ó:

• Các khi Nhp/Xut d liu: bao gm các thit b nh bàn phím, chut, màn
hình
• Khi lu tr: bao gm các a cng, a mm
• Khi x lý: ây là phn quan trng nht ca mt máy tính, ta s tp trung xem xét
nó.
t h thng x lý ca máy tính bao gm 3 b phn chính:
+ B vi x lý – CPU (Central Processing Unit): Là b não ca máy tính, nó x lý các
thông tin và u khin mi hot ng ca máy tính.
+ B nh trong: Là b nh có kh nng liên lc trc tip vi b vi x lý,là ni lu tr d
liu phc v cho quá trình x lý.
+ Các mch vào ra: u khin vic giao tip vi thit b ngoi vi.
Ngoài ra còn có h thng các dây dn, cáp ni  liên kt gia 3 b phn trên (h thng
Bus)
 lýNhp Xut
u tr
Bài ging hp ng Chng I: Các khái nim c bn
11
1.3.2 B vi x lý - CPU
ây là trung tâm x lý ca máy tính. Mi b vi x lý c trang b mt h thng các
nh c bn bng ngôn ng nh phân (do nhà sn xut quy nh). Ngi lp trình có th
 dng các lnh này “ra lnh” cho máy tính thc hin u mình mun.
a) Các thành phn chính ca b vi x lý:
• ALU (Arithmetic & Logic Unit): Khi s hc và logic. ây là ni thc hin các
phép tính s hc (cng, tr, nhân, chia ) và các phép logic (Not, And, Or ).
• Các thanh ghi: Cung cp kh nng nh bên trong CPU. Mi thanh ghi có kh
ng cha c mt dãy các bít d liu ( dài còn ph thuc vao tng loi
CPU).
•  thng ni ghép bên trong CPU (Bus ni b): Cho phép liên lc gia các b
phn bên trong CPU.
b) H vi x lý Intel x86

Có nhiu hãng khác nhau sn xut b vi x lý cho máy tính. Ta s tp trung nghiên
u các b vi x lý thuc dòng x86 do hãng Intel ch to.
B vi x lý u tiên thuc dòng này là 8086. Nó c sn xut nm 1978, là b vi x
lý 16 bit u tiên ca Intel. 8088 ra i sau 8086 mt chút, v c bn nó cng có cu to
ging nh 8086, nhng có giá thành r hn vì ch có bus d liu 8 bít, và tc  cng
thp hn. Tip sau ó là s ra i ca các b vi x lý 80186, 80286, 80386, 80486, 80586
(Pentium), PII, PIII, P4 Càng v sau thì các b vi x lý li càng tr nên mnh m hn
i  dài các thanh ghi dài hn, tc ng h cao hn, b rng bus ln hn
c) B vi x lý 8086
Ta chn 8086  nghiên cu vì nó có cu trúc n gin, d tìm hiu. Và u quan
trng là hu ht các lnh ca nó u c các b vi x lý sau này k tha, nên các
chng trình vit cho 8086 vn có th áp dng trên các b vi x lý hin i hn. Ta s
xem xét 14 thanh ghi c bn ca 8086, mi thanh ghi có chiu dài 16 bit.
• Nhóm các thanh ghi d liu (Thanh ghi công dng chung):
Các thanh ghi này c s dng khi thc hin thao tác vi d liu. Có 4 thanh ghi 16
bit c t tên là AX, BX, CX, DX. Mi thanh ghi li c chia làm 2 thanh ghi 8 bit
i các tên tng ng nh trên hình v:
AX AH AL
BX BH BL
CPU
 nh trong
trong
ch vào/ra
Bus
Bài ging hp ng Chng I: Các khái nim c bn
12
CX CH CL
DX DH DL
• Nhóm các thanh ghi n:
Các thanh ghi này dùng  lu tra ch ca các n b nh (segment) trong các

thao tác vi b nh. Có 4 thanh ghi 16 bít là CS, DS, ES, SS.
CS
DS
SS
ES
• Nhóm các thanh ghi con tr và ch s:
Các thanh ghi này dùng  cha a ch phân n (offset) ca các ô nh trong các
thao tác vi b nh. Có 5 thanh ghi 16 bit là SI, DI, SP, BP, IP.
SI
DI
SP
BP
IP
(Các khái nim va ch segment và offset s nói k hn  phn sau)
• Thanh ghi trng thái (Thanh ghi c - Flag):
Thanh ghi này dùng  xác nh trng thái ca b vi x lý. Mi bít trên thanh ghi c có
t tên riêng, có mt công dng riêng trong vic phn ánh trng thái (s tìm hiu c th
trong chng 3).
Bài ging hp ng Chng I: Các khái nim c bn
13
1.3.3 T chc b nh trong
a) a ch vt lý:
B nh ca máy tính c cu to bi các phn t nh 1 bit. C 8 phn t nh to
thành mt ô nh (1 byte). Các ô nhc sp xp tun t trong b nh và c ánh s
n lt t 0, 1, 2 S hiu các ô nh nh trên c gi là a ch vt lý ca ô nh.
Ta s xem xét mô hình t chc b nh trong h thng x lý 8086. B vi x lý 8086 s
ng 20 ng dây a ch (bus a ch 20 bít)  liên lc vi b nh. Nói cách khác, a
ch các ô nh là mt dãy dài 20 bít. Nh vy s lng cc i các ô nh có thánh a
ch là 2
20

(= 1MB).
1111 1111111
FFFFFh

0000 0000011 a ch dng hex: 00003h
0000 0000010 00002h
0000 0000001 00001h
0000 0000000 1 ô nh 00000h 1 ô nh
(20 bít)
Các thanh ghi ca b vi x lý 8086 ch dài 16 bít, chúng không th cha c a ch
dài 20 bít. Do ó ngi ta phi s dng mt phng pháp ánh a ch khác, gi là a
ch logic.
b) a ch logic:
Theo phng pháp này, b nhc chia thành tng n, mi n có chiu dài ti
a 64 KB. Các n c ánh s ln lt là 0, 1, 2, S hiu n nh vy gi là a
chn (hay a ch segment).
Ngi ta s dng 16 bít ánh s các n, nh vy a ch segment s nm trong phm
vi t 0000h n FFFFh.
Các ô nh trong n cng c ánh s ln lt là 0, 1, 2, S hiu ô nh nh vy
i là a ch tng i (hay a ch offset). Mt n nh có kích thc ti a 64 KB,
c là có ti a 65536 ô nh.
Ngi ta cng dùng 16 bít ánh s các ô nh, nh vy a ch offset s nm trong
phm vi t 0000h n FFFFh.
Mun xác nh a ch ca mt ô nh ta phi bit hai thông tin: ô nhó thuc n
nào (segment) và v trí ca ô nh trong n (offset). Cp a ch segment:offset c
i là a ch logic.
Ví d:
t ô nh có a ch segment:offset = 10A2:34B4h, hãy xác nh a ch vt lý ca nó.
Gii:
c 1: Dch a ch segment v bên trái 4 bít (tng ng vi dch 1 kí hiu hex).

Ta thu c: 10A20h
c 2: Ly giá tr thu c  bc 1 em cng vi a ch offset:
Bài ging hp ng Chng I: Các khái nim c bn
14
10A20h
+ 34B4h
13ED4h
y a ch vt lý ca ô nhó là 13ED4h.
c) S phân chia không gian nh:
Không gian a ch 1MB (t 00000h n FFFFFh) thng c chia thành các vùng
nh theo chc nng s dng:
F0000h
ROM BIOS
E0000h
D0000h
C0000h
} dành
B0000h
A0000h
} B nh hin th
90000h

20000h
10000h
00000h 64 KB
} B nh c s: 10 n (640 KB)
Trong ó, 10 n u tiên (B nh c s - Base memory) dùng  np và chy các
ng dng ca hu hành DOS. Hai n a ch tip theo dành cho RAM trên v mch
màn hình. n cui cùng dành cho ROM BIOS.
BIOS (Base Input – Output System) là mt phn mm u khin các thao tác vào ra c

n ca máy tính. Nó c nhà sn xut cài sn trong ROM và tng thi hành khi bt
máy tính.

×