Professional Documents
Culture Documents
Mỗi họ vxl được sx bởi một nhà sản xuất, các thế hệ
trong một họ được phân biệt theo độ dài từ (bit) của
chúng và tốc độ (Hz).
Năm 2006 Intel xuất xưởng bộ vi xử lý hai nhân, gọi là Core 2 duo .
Các bộ vi xử lý Core 2 duo có 291 triệu bong bán dẫn.
1200
1000
Speed (MHZ)
800
600 550
400 400
400 333
200 200 233
200 100
0.74 2 8 12 33
0
1971 1974 1979 1982 1985 1989 1993 1995 1997 1998 1998 1999 1999 2000
Year
Họ vi xử lý x86 của Intel
Model Năm sản xuất Số lượng Transistor
4004 1971 2,300
8008 1972 2,500
8080 1974 5,000
8086 1978 29,000
80286 1982 120,000
Tất cả các thiết bị có các chức năng như vậy đều có thể được
gọi là một hệ vi xử lý.
TỔNG QUAN HỆ VI XỬ LÝ
Sơ đồ khối của hệ vi xử lý
Một hệ vi xử lý gồm có các thành phần chính sau :
Bus dữ liệu
• Sandy Bridge
PHÂN LOẠI VI XỬ LÝ
Phân loại theo công nghệ chế tạo
Các số dư trong khung sẽ được sắp xếp theo chiều mũi tên
Hệ đếm
.Quy tắc đổi số thập phân hệ mười ra hệ hai
Lấy số cần đổi nhân với 2, tích nhận được sẽ gồm phần
nguyên và phần lẻ nhị phân, lấy phần lẻ nhị phân của
tích thu được nhân tiếp với 2. Làm như vậy cho tới khi
được tích chẵn bằng 1. Chọn riêng các phần nguyên
(phần trước dấu phẩy) của các tích thu được và sắp xếp
lại sẽ được các chữ số sau dấu phẩy của số hệ hai cần
tìm.
Hệ đếm
Ví dụ: Đổi số 0.125 ra số hệ hai.
Ta thực hiện phép nhân lần lượt theo các bước trên:
0,125 * 2 = 0,250
0,250 * 2 = 0,500
0,500 * 2 = 1,000
và thu được kết quả là 0,125 = 0,001B (phần được
đóng trong khung).
Kết hợp các ví dụ trên lại, nếu phải đổi số 34,125 ra hệ
hai ta thu được kết quả cuối cùng là 34,125 =
100010,001 B.
Hệ đếm
Các phép toán số học trong hệ 2
•Phép cộng: quy tắc phép cộng trong hệ 2:
a b y C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
HỆ HỆ NHỊ PHÂN
10
99 0 1 1 0 0 0 1 1
+ 95 0 1 0 1 1 1 1 1
=194 1 1 0 0 0 0 1 0
Số nhị phân không dấu
+26 = 1 1 0 1 0
Thêm 0 vào bên = 0 1 1 0 1 0
trái
Số bù 1 = 1 0 0 1 0 1
Cộng 1 + 1
-26 1 0 0 1 1 0
Hệ đếm
Các phép toán số học
•Phép trừ: giống như thực hiện với hệ 10
a b y B
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0
15 = 0 0 0 0 1 1 1 1
13 = 0 0 0 0 1 1 0 1
Số bù 1 = 1 1 1 1 0 0 1 0
Cộng 1 + 1
-13 1 1 1 1 0 0 1 1
15 0 0 0 0 1 1 1 1
+ (-13) 1 1 1 1 0 0 1 1
15+(-13) = 0 0 0 0 0 0 1 0
Phép trừ
•Ví dụ: 11-13 = 11 + (-13) bằng thanh ghi 8 bit
11 = 0 0 0 0 1 0 1 1
13 = 0 0 0 0 1 1 0 1
Số bù 1 = 1 1 1 1 0 0 1 0
Cộng 1 + 1
-13 1 1 1 1 0 0 1 1
11 0 0 0 0 1 0 1 1
-13 1 1 1 1 0 0 1 1
11+(-13)= -2 = 1 1 1 1 1 1 1 0
Hệ đếm
2.1.4. Hệ đếm cơ số 8 (Octal system, b = 8)
Nếu dùng 1 tập hợp 3 bit thì có thể biểu diễn 8 trị khác
nhau : 000, 001, 010, 011, 100, 101, 110, 111. Các trị
này tương đương với 8 trị trong hệ thập phân là 0, 1, 2,
3, 4, 5, 7. Tập hợp các chữ số này gọi là hệ bát phân, là
hệ đếm với b = 8 = . Trong hệ bát phân, trị vị trí là lũy
thừa của 8.
Ví dụ:
235 . 6 = 2x + 3x + 5x + 6x + 4x = 157. 812
Hệ đếm
2.1.5. Hệ đếm cơ số 16 (Hexa-decimal system, b=16)
Hệ đếm thập lục phân là hệ cơ số b=16 = , tương
đương với tập hợp 4 chữ số nhị phân (4 bit). Khi thể
hiện ở dạng hexa-decimal, ta có 16 ký tự gồm 10 chữ số
từ 0 đến 9, và 6 chữ in A, B, C, D, E, F để biểu diễn các
giá trị số tương ứng là 10, 11, 12, 13, 14, 15. Với hệ thập
lục phân, trị vị trí là lũy thừa của 16.
Ví dụ:
34F5C = 3x + 4x + 15x + 5x + 12x = 216294
Mỗi ký hiệu tương ứng với 4-bit
0 0 0000 8 8 1000
1 1 0001 9 9 1001
2 2 0010 10 A 1010
3 3 0011 11 B 1011
4 4 0100 12 C 1100
5 5 0101 13 D 1101
6 6 0110 14 E 1110
7 7 0111 15 F 1111
Chuyển đổi Hexa & nhị phân
Bit dấu
Biểu diễn số thực, biểu diễn
ký tự
2.3. Biểu diễn số thực
Để biểu diễn số thực, trong máy tính người ta dùng ký
pháp dấu phảy động (Floating Point Number). Một cách
tổng quát, một số thực biểu diễn theo cách này gồm 3
thành phần:
N=Mx
Với M: phần định trị (Mantissa), R là cơ số: (Radix), còn
E là phần số mũ (Exponent)
Biểu diễn số thực, biểu diễn
ký tự
Ví dụ, với cơ số R = 10, giả sử 2 số thực N1 và N2 được
lưu trữ theo phần định trị và số mũ như sau:
M1 = -15 và E1 = +12
M2 = +314 và E2 = -9
Có nghĩa là
N1 = M1 x = -15x = -15 000 000 000 000
và
N2 = M2 x = 314 x = 0.000 000 314
Biểu diễn số thực, biểu diễn
ký tự
2.4. Biểu diễn ký tự
Tất cả thông tin trong máy tính đều được biểu diễn dưới
dạng các số 0 và 1. Mỗi tổ hợp các số 0 và 1 được gán
một ký tự chữ cái, chữ số, hoặc một ký tự khác theo một
cách thức nhất định.
Trong thực tế thông tin được truyền đi, được lưu trữ
trong các bộ nhớ, hoặc để hiển thị lên màn hình đều ở
dưới dạng ký tự và tuân theo một loại mã được dùng rất
rộng rãi gọi là mã ASCII( American Code for Information
Interchange )
Biểu diễn số thực, biểu diễn
ký tự
Trong bảng mã ASCII tiêu chuẩn, người ta dùng 7 bit để
mã hóa các ký tự thông dụng, như vậy bảng mã này sẽ
có 128 ký tự ứng với các mã số từ 0..127. Bit thứ 8 có
thể cho liên tục bằng 0, 1 hoặc có thể dùng để chứa bit
parity (bit chẵn lẻ) phục vụ cho việc phát hiện lỗi khi
truyền.
Bên cạnh bảng ASCII tiêu chuẩn người ta còn
dùng bảng ASCII mở rộng cho các ký tự đặc biệt (khác
các ký tự tiêu chuẩn) với mã từ 128.. 255.
Hexa- 0 1 2 3 4 5 6 7
decimal
0 <NUL> <DLE> <SP> 0 @ P ` P
0 16 32 48 64 80 96 112
1 <SOH> <DC1> ! 1 A Q a q
1 17 33 49 65 81 97 113
2 <STX> <DC2> “ 2 B R b r
2 18 34 50 66 82 98 114
3 <ETX> <DC3> # 3 C S c s
3 19 35 51 67 83 99 115
4 <EOT> <DC4> $ 4 D T d t
4 20 36 52 68 84 100 116
5 <ENQ> <NAK> % 5 E U e u
5 21 37 53 69 85 101 117
6 <ACK> <SYN> & 6 F V f v
6 22 38 54 70 86 102 118
7 <BEL> <ETB> ‘ 7 G W g w
7 23 39 55 71 87 103 119
8 <BS> <CAN> ( 8 H X h x
8 24 40 56 72 88 104 120
9 <HT> <EM> ) 9 I Y i y
9 25 41 57 73 89 105 121
A <LF> <SUB> * : J Z j z
10 26 42 58 74 90 106 122
B <VT> <ESC> + ; K [ k {
11 27 43 59 75 91 107 123
C <FF> <FS> , < L \ l |
12 28 44 60 76 92 108 124
D <CR> <GS> - = M ] m }
13 29 45 61 77 93 109 125
E <SO> <RSI> . > N ^ n ~
14 30 46 62 78 94 110 126
F <SI> <US> / ? O _ o <DEL>
15 31 47 63 79 95 111 127
Bảng mã ASCII mở rộng
Biểu diễn số thực, biểu diễn
ký tự
Ví dụ: Mã ASCII của một số ký tự thường dùng trong khi
lập trình:
<Bel> (Bell, chuông): 07H
<BS> (Back space, xoá lùi): 08H
<HT> (Horizont tab, giãn cách ngang): 09H
<LF> (Line feed, thêm dòng mới): 0AH
Biểu diễn số thực, biểu diễn
ký tự
Khi xem xét bảng ta có thể rút ra mấy nhận xét sơ bộ
như sau:
2 cột đầu của bảng mã được dùng cho các ký tự điều
khiển.
Cột 2 dành riêng cho các ký tự ngăn cách
Các ký tự số nằm ở cột 3. Mã của ký tự ‘0’ là 30H. ‘9’ là
39H.Giữa giá trị số và mã ASCII của số đó có khoảng
cách là 30H.
Các chữ cái hoa nằm ở các cột 4,5, các chữ cái thường
ở cột 6,7.Khoảng cách giữa chữ thường và chữ hoa
cùng tên là 20H.
Mã BCD (số hệ 10 mã hóa bằng hệ 2)
B9h ← 10111001b
Mã BCD, thao tác với hệ hexa
Thực hiện cộng trực tiếp trên số hex, nếu kết quả cộng
lớn hơn 15 thì sẽ nhớ và trừ cho 16.
VD:
7 Ah
+ 3 Fh
10 25 → B9h
Ah + Fh = 10 + 15 = 25 → nhớ 1 và 25 – 16 = 9 = 9h
7h + 3h = 7 + 3 = 10 → cộng số nhớ: 10 + 1 = 11 = Bh
Mã BCD, thao tác với hệ hexa
2.6.2. Phép trừ
Khi trừ một số nhỏ hơn cho một số lớn hơn ta cũng
mượn 1 ở cột kế tiếp bên trái nghĩa là cộng thêm 16 rồi
mới trừ.
VD : E95h - 87Ch = 619h
4A,5h – 3B,7h = 0E,Eh
2.6.3. Phép nhân
Muốn thực hiện phép nhân trong hệ 16 ta phải đổi các
số trong mỗi thừa số về thập phân, nhân 2 số với nhau.
Sau đó, đổi kết quả về hệ 16.
Chương 3: Kiến trúc phần
mềm của bộ VXL 8086/8088
Cấu trúc bộ vi xử lý 8086/8088
Bộ vi xử lý 8086/8088 là một bộ vi xử lý phổ biến một thời
của hãng Intel và được ứng dụng rộng rãi
Cho đến ngày nay, các bộ vi xử lý hiện đại vẫn có tính kế
thừa về phần cứng và tập lệnh của bộ vi xử lý này
Kiến trúc khá đơn giản và nguyên gốc
Có tập lệnh dễ tiếp nhận đối với các sinh viên và người đọc
bắt đầu nghiên cứu về bộ vi xử lý
AX BIU
BX
EU
Các thanh ghi TỔNG BUS dữ
CX
đa năng liệu
DX
SP CS BUS
Các
Các thanh ghi DS trong
BP thanh
con trỏ và chỉ số
SS CPU
SI ghi
ES 8 bit dữ
DI đoạn và
IP liệu
con trỏ
20 bit
lệnh
BUS dữ liệu ALU địa chỉ
(16 bit)
Logic
Các thanh ghi tạm thời Điều khiển
BUS BUS
Điều ngoài
ALU
khiển
EU Đệm lệnh
thanh ghi cờ (6byte cho 8086)
Cấu trúc bộ vi xử lý 8086/8088
Khối phối ghép BIU (Bus interface unit):
Khi CPU hoạt động thì EU cung cấp thông tin
về địa chỉ cho BIU, BIU đọc lệnh và dữ liệu
hay Thực hiện chức năng đưa địa chỉ ra bus và
trao đổi dữ liệu với bus(đọc lệnh và dữ liệu)
Không có
F1 D1 E1 F2 D2 E2 F3 D3 E3
pipelining
Có pipelining F1 D1 E1
F2 D2 E2
F3 D3 E3
Cấu trúc bộ vi xử lý 8086/8088
Dung lượng nhớ của bộ vxl 8088
•Khối BIU có BUS địa chỉ 20 bit, nên 8088 có
khả năng phân biệt được 220 = 1.048.567 = 1M ô
nhớ hay 1Mbyte, vì các bộ nhớ nói chung được
tổ chức theo byte. Nói cách khác không gian địa
chỉ của 8088 là 1 Mbyte
Cấu trúc bộ vi xử lý 8086/8088
Dung lượng nhớ của bộ vxl 8088
•Không gian 1Mbyte của 8088 chia làm các
vùng khác nhau,dùng để:
• Chứa mã chương trình (các câu lệnh của
chương trình) dung lượng tối đa 64Kbyte.
• Chứa dữ liệu và kết quả trung gian của
chương trình, dung lượng tối đa 64Kbyte
• Quản lý các thông số khi gọi chương trình
con, hay trở về từ chương trình con.
Cấu trúc bộ vi xử lý 8086/8088
Các thanh ghi đoạn
Đn: là thanh ghi 16 bit dùng để xác định địa chỉ
của ô nhớ nằm ở đầu các đoạn.
Gồm 4 thanh ghi đoạn: DS, CS, SS và ES.
Thanh ghi đoạn dữ liệu DS: là thanh ghi 16 bit
chứa địa chỉ đầu của đoạn dữ liệu (đoạn dữ liệu
dùng để chứa dữ liệu, kết quả trung gian của
chương trình có dung lượng 64KByte)
Cấu trúc bộ vi xử lý 8086/8088
Các thanh ghi đoạn
Thanh ghi đoạn mã CS: là thanh ghi 16 bit chứa
địa chỉ đầu của đoạn mã (đoạn mã chứa mã của
chương trình có dung lượng 64KByte)
Thanh ghi ngăn xếp SS: là thanh ghi 16 bit chứa
địa chỉ đầu của đoạn ngăn xếp (đoạn ngăn xếp
quản lý các thông số của bộ vi xử lý khi gọi
chương trình con hoặc trở về từ chương trình
con có dung lượng 64KByte)
Cấu trúc bộ vi xử lý 8086/8088
Các thanh ghi đoạn
Thanh ghi dữ liệu phụ ES: thanh ghi 16bit chứa
địa chỉ đầu của đoạn dữ liệu phụ (chứa nội dung
dữ liệu dữ trữ, dung lượng của đoạn 64KByte)
CS Đoạn mã
SS
Đoạn ngăn xếp
DS
Đoạn dữ liệu
ES
Đoạn d.liệu phụ
CS = F000H, IP = FFF0H
Thì CS:IP ↔ F000Hx10H + FFF0H
= F0000H + FFF0H = FFFF0H
Cấu trúc bộ vi xử lý 8086/8088
Các thanh đa năng
Là các thanh ghi 16 bit: AX, BX, CX và DX.
Dùng để chứa các loại dữ liệu khác nhau, và
được sử dụng vào các công việc đặc biệt. Để
CPU truy nhập dữ liệu nhanh hơn vào các ô nhớ
của bộ nhớ.
Các thanh ghi: AX, BX, CX và DX có thể tách
thành các thanh ghi 8 bit khi cần chứa dữ liệu 8
bit
Cấu trúc bộ vi xử lý 8086/8088
Các thanh đa năng
AX 15 …. …. … …. 8 7 …. …. 2 1 0
. . … . .
15 …. …. … …. 8 7 …. …. … …. 0
. . … . . . … .
AH AL
Cấu trúc bộ vi xử lý 8086/8088
Các thanh đa năng
AH AL
AX
BH BL
BX
CH CL
CX
DH DL
DX
Cấu trúc bộ vi xử lý 8086/8088
Các thanh đa năng
Thanh ghi AX: là thanh chứa, dùng để chứa các
kết quả của phép nhân, chia có độ dài 16 bit, dữ
liệu 8 bit chứa vào AL.
x x x x OF DF IF TF SF ZF x AF x PF x CF
Khác nhau
Ví dụ:
MOV CL, 100 ;chuyển 100 vào CL
MOV [BX],10 ;chuyển 10 vào ô nhớ tại địa chỉ
DS:BX
Các chế độ địa chỉ của bộ vi xử lý 8088
•Chế độ địa chỉ trực tiếp:
- Một toán hạng chứa địa chỉ lệch của ô nhớ chứa
dữ liệu.
- Toán hạng còn lại chỉ là thanh ghi không là ô nhớ
Ví dụ:
MOV AL, [1234H] ; chuyển nd ô nhớ DS:1234 vào AL
MOV [3421H],CX ;chuyển nd của CX vào 2 ô nhớ
DS:3421 và DS:3422
Các chế độ địa chỉ của bộ vi xử lý 8088
•Chế độ địa chỉ gián tiếp qua thanh ghi:
- Một toán hạng là một thanh ghi chứa địa chỉ lệch
của ô nhớ chứa dữ liệu.
- Toán hạng còn lại là thanh ghi không là ô nhớ.
Ví dụ:
MOV AL, [BX] ; chuyển nd ô nhớ DS:BX vào AL
MOV [SI],CL ;chuyển nd của CL vào ô nhớ
DS:SI
Các chế độ địa chỉ của bộ vi xử lý 8088
•Chế độ địa chỉ tương đối cơ sở:
- Các thanh ghi cơ sở BX, BP và các hằng số
biểu diễn các giá trị di chuyển để tính giá trị hiệu dụng
của các toán hạng trong vùng nhớ DS và SS,
- Giá trị dịch chuyển xác định tính tương đối của
địa chỉ
Ví dụ:
MOV CX, [BX] +10 ; chuyển nd 2 ô nhớ liên tiếp
DS:(BX +10) và DS: (BX +11)vào CX
MOV CL, [BP] +3 ;chuyển nd của ô nhớ DS:(BP +
3) vào CL
Các chế độ địa chỉ của bộ vi xử lý 8088
•Chế độ địa chỉ tương đối chỉ số:
- Các thanh ghi chỉ số SI, DI và các hằng số biểu
diễn các giá trị di chuyển để tính giá trị hiệu dụng của
các toán hạng trong vùng nhớ DS.
Ví dụ:
MOV CX, [SI] +10 ; chuyển nd 2 ô nhớ liên tiếp
DS:(SI +10) và DS: (SI +11)vào CX
MOV CL, [DI] +3 ;chuyển nd của ô nhớ DS:(DI
+ 3) vào CL
Các chế độ địa chỉ của bộ vi xử lý 8088
•Chế độ địa chỉ tương đối chỉ số cơ sở:
- Kết hợp hai chế độ địa chỉ chỉ số và cơ sở tạo
ra chế độ địa chỉ tương đối chỉ số cơ sở.
Ví dụ:
MOV CX, [BX][SI] +10 ; chuyển nd 2 ô nhớ liên
tiếp DS:(BX + SI +10) và DS: (BX + SI +11)vào
CX
MOV CL, [DI + BP+3] ;chuyển nd của ô nhớ
DS:(DI +BP + 3) vào CL
• Bảng tóm tắt các chế độ địa chỉ
Chế độ địa chỉ Toán hạng Thanh ghi đoạn ngầm định
Thanh ghi Reg
Tức thì Data
Trực tiếp [offset] DS
Gián tiếp qua thanh ghi [BX] DS
[SI], [DI] DS
Tương đối cơ sở [BX] + Disp DS
[BP] + Disp SS
Tương đối chỉ số [DI] + Disp DS
[SI] + Disp DS
Tương đối chỉ số cơ sở [BX] +[SI] + Disp DS
[BX] +DI] +Disp DS
[BP] + [DI] + Disp SS
[BP] + [SI] + Disp SS
• Các thanh ghi đoạn và thanh ghi lệch ngầm định
125
XCHG(eXCHanGe)
Dạng lệnh:
– XCHG OPR1,OPR2
Tác dụng:
– Trao đổi nội dung hai toán hạng
Ví Dụ :
– XCHG AX,BX
– XCHG AL,CL
126
PUSH(Push Word on to Stack)
Dạng lệnh:
– PUSH SRC
Tác dụng:
– Lấy nội dung của toán hạng Nguồn đặt vào đỉnh của
ngăn xếp.
– Toán hạng Nguồn phải có dung lượng là 2byte
Cờ bị ảnh hưởng: Không
Ví Dụ :
– PUSH AX
– PUSH BX
– PUSH CX
127
POP(Pop Word Off Stack to
Destination)
Dạng lệnh:
– POP DES
Tác dụng:
– Lấy dữ liệu tại đỉnh ngăn xếp đưa vào toán hạng Đích.
– Đích phải có dung lượng là 2 byte
Cờ bị ảnh hưởng: Không
Ví Dụ :
– POP BX
– POP CX
– POP DX
128
XLAT(Translate)
Dạng lệnh:
– XLAT table[BX]
Tác dụng:
– BX phải chứa địa chỉ offset của bảng nguồn
có chiều dài tối đa là 256 byte. AL chứa chỉ số
của các phần tử trong bảng. Chuyển nội dung
của ô nhớ có địa chỉ BX trong table vào thanh
ghi AL.
129
Nhóm lệnh truyền dữ liệu kiểu chuỗi
Căn cứ vào giá trị của cờ DF để xử lý các thanh ghi SI và DI
theo chiều tăng hay giảm
Assembler Tác dụng
MOVSB Byte tại DS:SI ES:DI
MOVSW Word tại DS:SIES:DI
LODSB Byte DS:SI AL
LODSW Word DS:SI AX
STOSB ALES:DI
STOSW AXES:DI
SCASB AL-ES:DI
SCASW AX-ES:DI
CMPSB Byte tại DS:SI-ES:DI
CMPSW Word tại DS:SI-ES:DI
130
LDS(Load Data Segment
Register)
Dạng lệnh:
– LDS DES,SRC
Trong đó:
– SRC là một ô nhớ có địa chỉ đoạn là DS.
– Lệnh này chuyển nội dung của ô nhớ tại
DS:SRC vào DES sau đó tăng SRC lên 2
– DESDS:SRC
– SRCSRC+2
131
LES(Load Extra Segment
Register)
Dạng lệnh:
– LES DES, SRC
– Chỉ Khác LDS là sử dụng thanh ghi ES
– DESES:SRC
– SRCSRC+2
132
Nhóm lệnh chuyển địa chỉ
LEA(Load Effective Address)
– Dạng lệnh: LEA DES,SRC
– Chuyển địa chỉ độ lệch của SRC vào DES.
– Ví Dụ :
– LEA DX,msg
– MOV AX,Strname
Chuyển địa chỉ đoạn
– Ta biết rằng ta không thể đưa các giá trị tức thì vào
thanh ghi đoạn, do vậy ta phải sử dụng các thanh ghi
đa năng làm thanh ghi trung gian để khởi tạo địa chỉ
đoạn
– MOV AX,@Data
– MOV DS,AX
133
Nhóm lệnh chuyển cờ hiệu
137
Nhóm lệnh vào ra
138
IN(Input Byte or Word)
Cấu trúc
– IN R8,PORT
– IN R16,PORT
PORT: Địa chỉ cổng
R8,R16: Thanh ghi 8 hay 16 bit
Tác dụng: Đọc dữ liệu 8 hay 16 bit tại cổng ngoại vi có
địa chỉ PORT vào thanh ghi dài 8 hay 16 bit
Cờ bị ảnh hưởng: Không
Ví Dụ :
– IN DL,02F8H
– IN AX,02FFH
139
OUT(Output Byte or Word)
Cấu trúc
– OUT PORT, R8
– OUT PORT,R16
Tác dụng:
– Gửi 8 hay 16 bit ra cổng có địa chỉ Port
Cờ bị ảnh hưởng: Không
Ví Dụ :
– OUT 02F8H,AL
– OUT 02F8H,AX
140
Nhóm lệnh số học
ADD(Addition)
– Dạng lệnh:
ADD DES,SRC
– DES DES + SRC
– Không nhớ, ảnh hưởng tới cờ CF, AF, PF, SF, ZF, OF
ADC(Add with Carry)
– Dạng lệnh:
ADC DES,SRC
– DES DES + SRC + CF
– Có nhớ, ảnh hưởng tới cờ: AF, CF, OF, PF, SF, ZF
141
Nhóm lệnh số học (tiếp)
INC(Increment)
– Dạng lệnh:
INC DES
– Tăng DES lên 1: DES DES + 1
– Ảnh hưởng tới cờ: AF, PF, SF, ZF, OF
SUB(Subtract)
– Dạng lệnh:
SUB DES,SRC
– Trừ không có nhớ: DES DES - SRC
– Ảnh hưởng tới cờ: CF, AF, PF, SF, ZF, OF
142
Nhóm lệnh số học (tiếp)
143
Nhóm lệnh số học (tiếp)
NEG(Negate)
– Dạng lệnh:
NEG DES
– DES - DES
– Ảnh hưởng tới cờ: AF, PF, SF, ZF, OF
MUL(Multiply- Nhân số không có dấu)
– Dạng lệnh:
MUL SRC
– Nếu SRC 8 bit:AX = AL * SRC
– Nếu SRC 16 bit: DX:AX = AX * SRC
– Ảnh hưởng tới :CF, OF
144
Nhóm lệnh số học (tiếp)
NOP(No Operation)
– Dạng lệnh:
NOP
– Tác dụng: Không làm gì cả
– Cờ bị ảnh hưởng: Không
IMUL(Integer Multiplycation - Nhân số có dấu)
– Dạng lệnh:
IMUL SRC
– Nếu SRC 8 bit:AX = AL * SRC
– Nếu SRC 16 bit: DX:AX = AX * SRC
– Ảnh hưởng cờ :CF, OF
145
Nhóm lệnh số học (tiếp)
147
Nhóm lệnh số học (tiếp)
DAS(Decimal Adjust for Subtraction)
– Dạng lệnh: DAS
– Ứng dụng: Điều chỉnh hiệu trong AL của hai toán hạng BCD nén
– Tác dụng: Nếu nibble thấp của AL lớn hơn 9 hay cờ AF được
thiết lập thì trừ AL đi 60H và thiết lập cờ CF
– Cờ bị ảnh hưởng: AF, CF, PF, ZF, SF
AAA(ASCII Adjust after Addition)
– Ứng dụng: Điều chỉnh kế quả trong AL khi cộng 2 số BCD không
nén hay hai chữ số ASCII
– Thao tác: Nếu nibble thấp của AL lớn hơn 9 hay AF = 1 thì tăng
AL lên 6, tăng AH lên 1 và thiết lập cờ AF. Lệnh này luôn xóa
nibble cao của AL và chép cờ AF vào CF
– Cập nhật : AF, CF.
148
Nhóm lệnh số học (tiếp)
AAD(ASCII Adjust before Division)
– Ứng dụng: Điều chỉnh số bị chia dạng BCD không nén trong AX
khi thực hiện phép chia
– Thao tác: Số BCD không nén trong AX được đổi thành dạng số
nhị phân và giữ lại trong AL bằng cách nhân AH với 10 và cộng
vào AL sau đó xóa AH
– Cờ bị ảnh hưởng: PF, SF, ZF
AAM(ASCII Adjust for Multiplication)
– Ứng dụng: Đổi kết quả của phép nhân hai số BCD thành dạng
số BCD không nén. Có thể dùng để đổi các số nhỏ hơn 100
thành dạng số BCD không nén
– Tác dụng: Nội dung của AL được đổi thành hai số BCD không
nén và được lưu vào AX bằng cách chia AL cho 10. Thương số
nhận được chứa trong AH còn số dư chứa trong AL
– Cờ bị ảnh hưởng: PF, SF, ZF
149
Nhóm lệnh số học (tiếp)
150
Nhóm lệnh số học (tiếp)
151
Nhóm lệnh dịch và quay
152
SAR(Shift Arithmetic Right)
Dạng lệnh:
– SAR DES,1
– SAR DES,CL
DES : Toán hạng cần dịch
Tác dụng:
– Dịch phải số học DES một hay nhiều bit
Nếu dịch nhiều bit thì số bit được chứa trong CL
Cờ bị ảnh hưởng: CF, OF, PF, SF, ZF
153
SHR(Shift Logical Right)
Dạng lệnh:
– SHR DES,1
– SHR DES,CL
DES : Toán hạng cần dịch
Tác dụng:
– Dịch phải DES một hay nhiều bit
Nếu dịch nhiều bit thì số bit được chứa trong CL
Cờ bị ảnh hưởng: CF, OF, PF, SF, ZF
154
ROR,ROL
ROR(Rote Right)
– Dạng lệnh: ROR DES,1
– DES : Toán hạng cần quay
– Tác dụng: Quay phải DES n bit
– Nếu quay nhiều bit thì số bit được chứa trong CL
– Cờ bị ảnh hưởng: CF, OF
ROL(Rote Left)
– Dạng lệnh: ROL DES,1
– DES : Toán hạng cần quay
– Tác dụng: Quay trái DES n bit
– Nếu quay nhiều bit thì số bit được chứa trong CL
– Cờ bị ảnh hưởng: CF, OF
155
RCR, RCL
RCR(Rotate Right Through Carry - Quay phải
có nhớ)
– Dạng lệnh: RCR DES,1
– DES : Toán hạng cần quay
– Tác dụng: Quay phải DES qua cờ nhớ n bit
– Nếu quay nhiều bit thì số bit được chứa trong CL
– Cờ bị ảnh hưởng: CF, OF
RCL(Rotate Left Through Carry - Quay trái có
nhớ)
– Dạng lệnh: RCL DES,1
– DES : Toán hạng cần quay
– Tác dụng: Quay DES sang trái qua cờ nhớ
– Cờ bị ảnh hưởng: CF, OF
156
Các lệnh kiểm tra so sánh
CMP(Compare)
– Dạng lệnh: CMP DES,SRC
– Ứng dụng: So sánh hai toán hạng bằng cách thực
hiện phép trừ nhưng không lưu kết quả
– Tác dụng: Trừ DES cho SRC và thiết lập các cờ, kết
quả không lưu lại
TEST(Logical Compare)
– Dạng lệnh: Test DES,SRC
– Tác dụng: Thực hiện phép toán AND logic giữa DES
và SRC, Kết quả không được lưu lại. Trạng thái của
kết quả thể hiện trong thanh ghi cờ
– Cờ bị ảnh hưởng: CF, OF, PF, SF, ZF
157
Các lệnh logic
Thực hiện các thao tác với các toán hạng ở mức
bit
AND(Logic And)
– Dạng lệnh: AND DES,SRC
– Tác dụng: DES = DES And SRC
– Cờ bị ảnh hưởng: CF, OF, PF, SF, ZF
OR(Logical Inclusive Or)
– Dạng lệnh: OR DES,SRC
– Tác dụng: DES = DES OR SRC
– Cờ bị ảnh hưởng: CF, OF, PF, SF, ZF
– Không xác định: AF
158
Các lệnh logic (tiếp)
159
Nhóm lệnh nhảy
160
Bảng các lệnh nhảy có điều kiện
STT Lệnh nhảy Nhảy nếu Điều kiện
1 JA Lớn hơn CF=0 và ZF =0
2 JAE Lớn hơn hoặc bằng CF=0
3 JB Nhỏ hơn CF=1
4 JBE Nhỏ hơn hoặc bằng CF=1 hay ZF=1
5 JC Có nhớ CF=1
6 JCXZ CX=0 (CF hay ZF) = 0
7 JE Bằng ZF =0
8 JG Lớn hơn ZF=0 và SF =OF
9 JGE Lớn hơn hoặc bằng CF=OF
10 JL Nhỏ hơn (SF xor OF) =1
11 JLE Nhỏ hơn hoặc bằng (SF xor OF) or ZF=1
12 JNA Không lớn hơn CF hay ZF =1
13 JNAE Không lớn hơn hoặc bằng CF=1
14 JNB Không nhỏ hơn CF=0
15 JNBE Không nhỏ hơn hay bằng CF=0 hay ZF =0 161
Bảng các lệnh nhảy có điều kiện (tiếp)
15 JNBE Không nhỏ hơn hay bằng CF=0 hay ZF =0
16 JNC Không có nhớ CF=0
17 JNE Không bằng ZF=0
18 JNG Không lớn hơn (SF xor OF) or ZF=1
19 JNGE Không lớn hơn hoặc bằng (SF xor OF) =1
20 JNL Không nhỏ hơn SF=OF
21 JNLE Không nhỏ hơn hay bằng ZF=0 và SF =OF
22 JNO Không tràn OF=0
23 JNP Lẻ PF=0
24 JNS Âm SF=0
25 JNZ Khác không ZF=0
26 JO Tràn OF=1
27 JP Chẵn PF=1
28 JS Âm SF=1
29 JZ Bằng không ZF=1
162
Nhảy không điều kiện
JMP(Jump)
Dạng lệnh: JMP Nhãn
Tác dụng: Chuyển tới câu lệnh nằm ngay sau nhãn để
thi hành
Cờ bị ảnh hưởng: Không
163
Nhóm lệnh điều khiển
HLT(Halt)
– Dạng lệnh: HLT
– Tác dụng: Đưa bộ vi xử lý vào trạng thái dừng chờ
ngắt ngoài
– Cờ bị ảnh hưởng: Không
INT(Interupt)
– Dạng lệnh: INT Interupt_type
– Ứng dụng: Chuyển quyền điều khiển cho một trong
256 chương trình thường trú phục vụ ngắt
– Cờ bị ảnh hưởng: TF, IF
165
Nhóm lệnh điều khiển (tiếp)
INTO(Interupt If Overflow)
– Dạng lệnh: INTO
– Ứng dụng: Tạo ra ngắt 4 nếu OF được thiết lập
– Cờ bị ảnh hưởng: Nếu OF = 1 thì TF, OF bị xóa, nếu
OF bằng 0 thì không cờ nào bị ảnh hưởng
IRET(Interupt Return)
– Dạng lệnh: IRET
– Tác dụng: Trở về từ chương trình phục vụ ngắt
– Cờ: Bị ảnh hưởng tất cả
166
Nhóm lệnh điều khiển (tiếp)
LOCK(Khóa bus)
– Dạng lệnh: LOCK
– Ứng dụng: Khóa bus trong trường hợp có nhiều bộ vi xử lý
– Tác dụng: Ngăn không cho các bộ vi xử lý khác truy nhập bộ
nhớ trong thời gian thực hiện lệnh
RET(Return From Procedure)
– Dạng lệnh: RET
– Tác dụng: Kết thúc thủ tục và trở về chương trình chính
– Cờ bị ảnh hưởng: Không
WAIT(Chờ đợi)
– Dạng lệnh: WAIT
– Tác dụng: Vi xử lý ở trạng thái chờ cho đến khi được kích hoạt
bởi một ngắt
167
Nhóm lệnh lặp
LOOP(Vòng lặp)
– Dạng lệnh:
LOOP Nhãn
– Tác dụng: Nội dung của CX được giảm đi 1, nếu CX khác 0 thì
chương trình sẽ thực hiện câu lệnh nằm ngay sau nhãn, nếu CX
=0 thì chương trình sẽ thực hiện câu lệnh nằm ngay sau lệnh
LOOP
– Cờ bị ảnh hưởng: Không
LOOPE/LOOPZ(Loop If Equal/Loop If Zero)
– Dạng lệnh:
LOOPE Nhãn
LOOPZ Nhãn
– Tác dụng: Giảm CX đi 1. Nếu CX khác 0 và ZF=1 thì thực hiện
câu lệnh nằm ngay sau nhãn. Nếu không thì thực hiện câu lệnh
nằm ngay sau lệnh này
– Cờ bị ảnh hưởng: Không
168
Nhóm lệnh lặp (tiếp)
169
Nhóm lệnh lặp (tiếp)
REP/REPZ/REPE/REPNE/REPNZ(Repeat String
Operation)
– Ứng dụng: Lặp lại với các lệnh thao tác chuỗi
– Dạng lệnh:
Lệnh_Lặp Lệnh thao tác chuỗi
– REP: CX giảm đi 1, Lặp lại nếu CX khác 0
– REPZ: Lặp lại nếu bằng 0
– REPE: LẶp lại nếu bằng
– REPNE: Lặp lại nếu không bằng
– REPNZ: Lặp lại nếu không bằng 0
– Cờ bị ảnh hưởng: Tùy trường hợp cụ thể
170
Cách mã hóa lệnh
Lệnh
Thực hiện Kết quả
người sử Mã hóa Mã máy
lệnh
dụng
OPCODE OPERAND
172
Cách mã hóa lệnh
173
Cách mã hóa lệnh
174
Bảng mã hóa thanh ghi
Thanh ghi Mã Thanh ghi Mã
W =1 W=0
AX AL 000 CS 01
BX BL 011
CX CL 001 DS 11
DX DL 010
SP AH 100 ES 00
DI BH 111
BP CH 101 SS 10
SI DH 110
175
Bảng mã hóa MOD/MR
Mod
M/R 00 01 10 11
W=0 W=1
MOV 1Byte CH
Tới CH
[BX]
Kết quả =8A2FH
CHƯƠNG 4:
LẬP TRÌNH HỢP NGỮ TRÊN IPM-PC
178
CÚ PHÁP HỢP NGỮ
Kiến trúc phần cứng chỉ là phần thể xác, bất biến trong
các hệ vi xử lý
Để bộ vi xử lý có thể hoạt động theo mong muốn của
con người ta phải tiến hành lập trình cho nó
Mỗi một bộ vi xử lý đều có một tập lệnh riêng theo chuẩn
tập lệnh
Mỗi chương trình dịch đều có cấu trúc và cú pháp riêng.
Khi lập trình cần viết đúng cú pháp để chương trình biên
dịch hiểu và biên dịch chương trình ra dạng mã máy
179
CÚ PHÁP HỢP NGỮ
Main Proc
– Main là tên
– Toán hạng là Proc.
– Hướng dẫn biên dịch này khai báo cho chương trình
biên dịch biết chúng ta khai báo một chương trình con
có tên là Proc
Main Endp
– Main là tên
– Toán hạng là Endp.
– Hướng dẫn biên dịch này khai báo cho chương trình
biên dịch biết Kết thúc thủ tục chính
181
Trường tên
183
Trường tên (tiếp)
Ví dụ một số tên không hợp lệ
– Two word ; Chứa khoảng trống
– 2context ; Chữ số đứng đầu
– Toi.u ; Dấu . không đứng đầu
– You&me ; Chứa ký tự đặc biệt
184
Trường toán tử
Toán tử chứa mã lệnh dạng tượng trưng
Chương trình biên dịch sẽ chuyển một lệnh ở dạng
tượng trưng sang một lệnh ở dạng mã máy
Tượng trưng của lệnh thường tượng trưng cho chức
năng của các thao tác
– Ví dụ : MOV, SHR, ROR,…
Trong một hướng dẫn biên dịch trường toán tử chứa
toán tử giả “Pseudo”. Các toán tử giả này không được
chương trình biên dịch biên dịch ra mã máy mà đơn giản
nó chỉ thông báo cách biên dịch cho chươg trình biên
dịch
– Ví dụ toán tử Proc là để tạo ra một thủ tục.
185
Trường toán hạng
Toán hạng xác định dữ liệu mà các toán tử sẽ tác động
lên. Một chỉ thị có thể không có hay có một hoặc hai toán
hạng
Ví dụ :
– INC AX ;Tăng AX lên 1
– ADD BX,5 ;Cộng 5 vào BX
Trong một chỉ thị hai toán hạng, toán hạng đầu tiên được
gọi là toán hạng đích (DES), toán hạng thứ hai được gọi
là toán hạng nguồn(SRC)
Các chỉ thị thường không làm thay đổi toán hạng nguồn
Đối với một hướng dẫn biên dịch trường toán hạng
thường chứa thông tin về hướng dẫn biên dịch.
186
Trường lời giải thích
Mở đầu trường này là một dấu “;”, trình biên dịch sẽ bỏ
qua toàn bộ những câu nằm sau ký tự “;”
Trường lời giải thích có thể có hoặc không, sử dụng lời
giải thích để cho dễ hiểu với người đọc và cho chính cả
chúng ta khi đọc lại chương trình hoặc sửa lỗi chương
trình
Lời giải thích cần trong sáng, rõ ràng
187
Dữ liệu, biến, hằng
Dữ liệu
Do bộ vi xử lý chỉ thao tác với các bit nhị phân 0 và 1
cho nên chương trình biên dịch phải chuyển đổi tất cả
các dữ liệu khác về dạng nhị phân.
Khi lập trình ta có thể sử dụng tất cả các dạng dữ liệu số
thập phân, hexa, ký tự, …
188
Dữ liệu
Các số
– Các số nhị phân được viết dưới dạng một chuỗi các
bit và được kết thúc bằng chữ b ví dụ : 100101b.
– Một chữ số thập phân được kết thúc bằng chữ cái d
hoặc D
– Một chữ số hexa được mở đầu bằng một chữ số thập
phân và kết thúc bằng chữ cái h hoặc H
– Tất cả các số trên đầu có dấu tuỳ ý
– Nếu không ghi hệ cơ số cụ thể thì mặc định là ở hệ
cơ số 10
189
Ví dụ các số
Số Kiểu
1100 Thập phân
1100b Nhị phân
12345 Thập phân
-3568D Thập phân
1,234 Không hợp lệ, chứa ký tự không là chữ số
1B4DH Số hex
1B4D Số hex không hợp lệ, không kết thúc là “h”
FFFFH Số hex không hợp lệ, không bắt đầu bằng
một chữ số thập phân
0FFFFH Số hex
190
Các ký tự
Các ký tự và chuỗi phải được bao quanh bằng một một
dấu nháy đơn hoặc một dấu nháy kép
Các ký tự được trình biên dịch dịch ra mã ASCII của
chúng vì vậy trình biên dịch không phân biệt chữ A và
41h do 41h là mã ASCII của chữ “A”
191
Các toán tử định nghĩa số liệu
Tên toán tử Kiểu định nghĩa
192
Các biến
Mỗi biến có một kiểu dữ liệu và được chương trình biên
dịch gán cho một địa chỉ trong bộ nhớ
Các biến kiểu byte
– Định nghĩa một biến kiểu byte
– Tênbiến DB Giá_trị_khởi_tạo
– Ví dụ:
ALPHA DB 4
BYTE DB ?
– Với hướng dẫn này trình biên dịch sẽ gán một tên
ALPHA cho một byte nhớ và khởi tạo nó các giá trị
giá trị là 4.
– Giới hạn thập phân của các giá trị khởi tạo nằm trong
khoảng từ -128 đến 127 với kiểu có dấu và từ 0 đến
255 với kiểu không dấu. Các khoảng này vừa đúng
giá trị của một byte. 193
Các biến kiểu word
Tênbiến DW Giá_trị_khởi_tạo
Ví dụ:
– WRD DW -2
– WRD2 DW ?
Giống như với kiểu byte một dấu chấm hỏi ở vị trí giá trị
khởi tạo có nghĩa là word không được khởi tạo giá trị
đầu.
Giới hạn thập phân của giá trị khởi tạo được xác định từ
-32768 đến 32767 đối với kiểu có dấu và từ 0 đến 65535
đối với kiểu không dấu.
194
Các mảng kiểu byte
Trong hợp ngữ, mảng chỉ là một chuỗi các byte nhớ hay
từ nhớ. Ví dụ để định nghĩa mảng 3 byte có tên
B_ARRAY với các giá trị khởi tạo là 10h, 20h, 30h chúng
ta có thể viết:
– B_ARRAY DB 10h, 20h, 30h
Tên B_ARRAY được gán cho byte đầu tiên,
B_ARRAY+1 cho byte thứ hai và B_ARRAY+2 cho byte
thứ ba. Nếu như trình biên dịch gán địa chỉ cho offset
0200h cho B_ARRAY thì bộ nhớ sẽ như sau:
Phần tử Địa chỉ Nội dung
– B_ARRAY 0200h 10h
– B_ARRAY+1 0201h 20h
– B_ARRAY+2 0202h 30h
195
Các mảng kiểu Word
Các mảng word có thể được định nghĩa một cách tương
tự,.Ví dụ:
W_ARRAY DW 1000, 356, 248, 13
Sẽ tạo nên một mảng có 4 phần tử với các giá trị khởi
tạo là 1000, 356, 248, 13. Từ đầu tiên được gắn với tên
W_ARRAY, từ tiếp theo gắn với W_ARRAY+2, rồi đến
W_ARRAY+4 v.v. nếu mảng bắt đầu tại 0300h thì bộ nhớ
sẽ như sau:
Phần tử Địa chỉ Nội dung
– W_ARRAY 0300h 1000d
– W_ARRAY+2 0302h 356d
– W_ARRAY+4 0304h 248d
– W_ARRAY+6 0306h 13d
196
Byte thấp và byte cao trong một
word
Khi chúng ta muốn tham chiếu đến byte thấp và
byte cao của biến word. Giả sử ta định nghĩa:
– WORD1 DW 1234H
– Byte thấp của word1 sẽ chứa 34h
– Byte cao chứa 12h
– Byte thấp có địa chỉ ký hiệu là WORD1
– Byte cao có địa chỉ ký hiệu là WORD1+1
197
Các chuỗi ký tự
Chuỗi ký tự có thể khởi tạo bằng mảng các mã ASCII.
Ví dụ: LETTER DB ‘ABC’
Tương đương với:
LETTER DB 41h, 42h, 43h
Trong một chuỗi, trình biên dịch phân biệt các chữ hoa
và chữ thường. Vì vậy chuỗi ‘abc’ được dịch ra 3 byte
với các giá trị 61h, 62h, 63h
Cũng có thể kết hợp các ký tự và các số trong một định
nghĩa
Ví dụ: MSG DB ‘HELLO’,0Ah,0Dh,‘$’
Tương đương với:
MGS DB 48h,45h,4Ch,4Ch,4Fh,0Ah,0Dh,24h
198
Các hằng có tên
Để tạo ra các mã lệnh dễ hiểu, người ta thường dùng
các tên tượng trưng để biểu diễn các hằng số.
EQU(EQUates: coi bằng như, coi như). Khai báo hằng
ta sử dụng toán tử giả EQU. Cú pháp như sau
– Tên EQU Hằng_số
Ví dụ: LF EQU 0Ah
– Gán lên LF cho 0Ah, là mã ASCII của ký tự xuống dòng. Tên LF
bây giờ có thể dược dùng để thay cho 0Ah tại bất cứ đâu trong
chương trình. Trình biên dịch sẽ dịch các lệnh:
MOV DL,0AH Và MOV DL,LF
– Ra cùng một chỉ thị máy
199
Các hằng có tên (tiếp)
Phần tử bên phải EQU cũng có thể là một chuỗi.
Ví dụ: PROMPT EQU “TYPE YOUR NAME”
Như vậy, thay vì viết
– MSG DB “TYPE YOUR NAME”
Ta có thể viết:
– MSG DB PROMPT
Chú ý:
– Bộ nhớ không dành chỗ cho các hằng có tên (khi biên
dịch, nơi nào chứa tên hằng thì ở đó sẽ được thay
đổi bởi giá trị của hằng).
200
Cấu trúc một chương trình hợp ngữ
Tổng quan
– Nói chung một chương trình hợp ngữ được
chia làm 4 đoạn
Đoạn mã
Đoạn dữ liệu
Đoạn dữ liệu mở rộng
Đoạn ngăn xếp
201
Chú ý :
Trong chương trình đòi hỏi phải có ít nhất một đoạn
ngăn xếp.
Đoạn ngăn xếp giúp lưu trữ các kết quả trung gian khi
thực hiện chương trình
Bắt đầu đoạn mã sẽ là các chỉ dẫn dịch
– Instruction
– Directive
Cuối mỗi đoạn có lệnh ENDP kết thúc đoạn
Cuối chương trình có lệnh END (expression) kết thúc
chương trình
202
Cấu trúc chung của một chương trình hợp ngữ
Cấu trúc của một chương trình được dịch ra file.exe
TITLE TEN_CHUONG_TRINH ; Đặt tên cho chương trình
.MODEL SMALL ; Khai báo qui mô sử dụng bộ nhớ
.STACK 200H ; Khai báo kích thước ngăn xếp
.DATA ; Tổng hợp khai báo dữ liệu
; Dữ liệu, biến, hằng khai báo ở đây
.CODE ; Bắt đầu đoạn mã
MAIN PROC ; Bắt đầu đoạn chính
MOV AX,@DATA ; Khởi tạo địa chỉ đoạn
MOV DS,AX
; Các lệnh nằm ở đây
MOV AH,4CH
INT 21H
MAIN ENDP ; Kết thúc chương trình
;Các thủ tục nằm ở đây
END MAIN
203
Cấu trúc của một chương trình được dịch ra file.com
TITLE TEN_CHUONG_TRINH ; Đặt tên cho chương trình
.MODEL TINY ; Khai báo qui mô sử dụng bộ nhớ
.CODE
ORG 100H
INT 20H
MAIN ENDP
END BATDAU
204
Cú pháp một chương trình hợp ngữ
Bộ ký tự
– Chữ cái : A Z, a z
– Ký tự đặc biệt : ?, @, * , $
– Khoảng trắng, tab, …
– Các chữ số: 09
Từ khoá
– Tên các thanh ghi
– Các lệnh giả
– Tên toán tử
205
Các chỉ dẫn đoạn
.STACK ; Định ra dung lượng nhớ dành cho chương trình
.CODE ; Đánh dấu điểm bắt đầu của đoạn mã
.DATA ; Điểm bắt đầu khai báo dữ liệu của chương trình
.DOSEG ; Các đoạn được sắp xếp theo chuẩn của
Microsoft
.MODEL ; Khai báo qui mô sử dụng bộ nhớ
.MODEL TINY ; Mã + dữ liệu nằm trong 64K, dịch ra file.com
.MODEL SMALL ; Mã + dữ liệu nằm trong 2 đoạn 64K khác nhau
.MODEL LARGE ; Mã lệnh > 64 K, Nếu có biến mảng thì < 64K
.MODEL HUGE ; Mã lệnh < 64 K, Nếu có biến mảng thì > 64K
.MODEL MEDIUM ; Mã lệnh > 64K, dữ liệu nằm trong đoạn < 64K
.MODEL COMPACK ; Mã lệnh < 64K, dữ liệu nằm trong đoạn > 64K 206
Một số ngắt cơ bản của số hiệu ngắt 21H của DOS
Hàm 01H
Vào AH =01H
Ra AL chứa mã của ký tự vừa được nhập
Tác dụng Khi gặp ngắt này, vi xử lý sẽ chờ người
sử dụng nhập vào một ký tự, sau khi
nhập mã của ký tự chứa trong thanh ghi
AL
Assembler MOV AH,01H
Language INT 21H
207
Hàm 02H
Vào AH =02H
DL chứa mã của ký tự cần hiển thị
Ra Không
Tác dụng Hiển thị ký tự có mã nằm trong thanh
ghi DL lên màn hình
Assembler MOV AH,02H
Language MOV DL,’A’
INT 21H
208
Hàm 09H
Vào AH =09H
DS:DX chứa địa chỉ ban đầu của chuỗi
Ra Không
209
Hàm 4CH
Vào AH =4CH
Ra Không
Tác dụng Kết thúc chương trình và nhường
quyền điều khiển bộ vi xử lý cho hệ
điều hành. Ngắt này là bắt buộc với
các chương trình dạng .exe
Assembler Language MOV AH,4CH
INT 21H
210
Chương trình đầu tiên
TITLE PGMHELLO ; Tên chương trình
.MODEL SMALL ; Sử dụng model small
.STACK 200H ; Dung lượng ngăn xếp là 200H
.DATA
Msg DB ‘HELLO’,’$’ ; Khai báo chuỗi cần hiển thị
.CODE
MAIN PROC
MOV AX,@DATA ; Khởi tạo địa chỉ đoạn
MOV DS,AX
MOV AH,09H ; Hàm hiển thị một chuỗi
LEA DX,Msg ; Lấy địa chỉ độ lệch của msg đưa vào DX
INT 21H ; Hiển thị chuỗi
MOV AH,4CH ; Hàm kết thúc chương trình
INT 21H ; Kết thúc chương trình
MAIN ENDP
END MAIN
211
Cấu trúc ngôn ngữ bậc cao
Cấu trúc rẽ nhánh
Cấu trúc : if … then … end_if
Ví dụ: Tạo cấu trúc bậc cao sau Điều kiện
S
– IF AX<0 then Đ
AX = -AX Công việc
BX = 5
– End_If
Lệnh hợp ngữ
– CMP AX,0
– JNL End_If ;Nhẩy nếu không nhỏ hơn
– NEG AX ;AX = -AX
– MOV BX,5 ;BX = 5
– End_If:
212
Cấu trúc if … then … else
Ví dụ: Tạo cấu trúc điều khiển bậc cao sau
IF AX<0 then
AX = -AX
ELSE
Điều kiện Công việc 2
AX =0
End_If S
Đ
Lệnh hợp ngữ
CMP AX,0 Công việc 1
JNB ELSE_
NEG AX
JMP END_IF
ELSE_:
MOV AX,0
END_IF:
213
Cấu trúc Case … end_ case
Ví dụ: Tạo cấu trúc điều khiển bậc cao sau
Case AX
<0: BX = -1
=0: BX = 0
>0: BX = 1
End_case K.Tra
Lệnh hợp ngữ
CMP AX,0
JL LOW_ Giá trị 1 Giá trị 2 Giá trị n
JG GREAT_
CV 1 CV 2 CV n
MOV BX,0
JMP END_CASE
LOW_:
MOV BX,-1
JMP END_CASE
GREAT_:
MOV BX,1
END_CASE:
214
Các điều kiện kép AND
Ví dụ: Tạo cấu trúc bậc cao sau
IF AX > 0 AND BX >0 THEN
DX = 1 Điều kiện 1
S
CX =5
END_IF Đ
Lệnh hợp
CMP ngữ :
Điều kiện 2
AX,0 S
JBE
END_IF Đ
CMP
Công việc
BX,0
JBE
END_IF
MOV
DX,1
MOV
CX,5 215
END_IF:
Cấu trúc lặp
Vòng lặp for
Cấu trúc: LOOPNhãn Khởi tạo n
– Lệnh này thực hiện việc kiểm tra CX,
Nếu cx khác 0 thì cx được giảm đi 1 và
chương trình thực hiện lệnh nhẩy tới
nhãn_đích
Công việc
Ví dụ
– For 80 lần do
Hiển thị ký tự “*”
– End_for n = n-1
Lệnh hợp ngữ
– MOV CX,80
– MOV AH,02H S
– MOV DL,’*’ n = 0?
– TOP :
– INT 21H Đ
– LOOP TOP
216
Vòng lặp WHILE … DO
while điều kiện Do
Thân vòng lặp
End_While
Ví dụ :
– Đọc vào một ký tự
– while ký tự <> CR (xuống dòng) do Điều kiện
Đếm = đếm +1 S
Đọc một ký tự
– end_while Đ
Lệnh hợp ngữ Công việc
MOV DX,0
MOV AH,01H ;Chuẩn bị đọc
INT 21H
– WHILE_ :
CMP AL,0DH;CR(13)
JE END_WHILE
INC DX
INT 21H
JMP WHILE_
– END_WHILE : 217
Lệnh Do … While
Cấu trúc
Do
– Các dòng lệnh
While Điều kiện Công việc
Ví dụ :
– Do S
Đọc một ký tự Điều kiện
– While Ký tự đọc được <> Enter
Đ
Lệnh hợp ngữ :
– MOV AH,01H
– DO_:
– INT 21H
– CMP AL,0DH
– JE END_WHILE
– JMP DO_
– END_WHILE:
218
Ngăn xếp và thủ tục
Ngăn xếp
Định nghĩa: Ngăn xếp là một loại cơ sở dữ liệu có dạng
LIFO (Last In Fist out) Các dữ liệu cho vào sau sẽ được
lấy ra trước.
Mỗi một chương trình phải sử dụng một khối bộ nhớ để
làm ngăn xếp. Việc khai báo ngăn xếp được thực hiện
như sau
– .STACK 100H ; Dung lượng ngăn xếp là 100H
Khi chương trình được khởi tạo SS sẽ chỉ vào địa chỉ
của đoạn ngăn xếp. Trong ví dụ khởi tạo nói trên SP
được khởi tạo giá trị 100H. Giá trị khởi tạo này sẽ tạo ra
một vị trí ngăn xếp rỗng. Khi ngăn xếp không rỗng SP
chứa địa chỉ offset của đỉnh ngăn xếp. SP =100H.
219
PUSH & POP
Lệnh: PUSH SRC
– SRC là một thanh ghi hay một ô nhớ 16bit
– Lệnh PUSH lấy nội dung của SRC đưa vào ngăn xếp.
Thao tác như sau
Giảm nội dung của SP đi 2
Lấy nội dung của SRC đặt vào ô nhớ SS:SP
Lệnh: POP DES
– DES là một thanh ghi hay một ô nhớ 16bit
– Lệnh POP lấy nội dung của đỉnh ngăn xếp đưa vào
DES. Thao tác như sau
Lấy nội dung ô nhớ SS:SP đặt vào DES
Tăng nội dung của SP lên 2
220
Ví dụ ngăn xếp
Khai báo: .STACK 100H
Tại thời điểm hiện tại
– AX = 1234H, BX = 5678H.
SP = 100H
Offset
0F6H
0F8H
0FAH
0FCH
0FEH AX 1234H
100H SP BX 5678H
221
Ví dụ ngăn xếp (tiếp)
Lệnh: PUSH AX
SP = 0FEH
Offset SS:SPAX
0F6H
0F8H
0FAH
0FCH
222
Ví dụ ngăn xếp (tiếp)
PUSH BX
SP = 0FCH
Offset SS:SPBX
0F6H
0F8H
0FAH
0FCH 5678H SP
100H BX 5678H
223
Ví dụ ngăn xếp (tiếp)
POP AX
AXSS:SP
Offset SP = 0FEH
0F6H
0F8H
0FAH
0FCH 5678H
100H BX 5678H
224
Ví dụ ngăn xếp (tiếp)
POP BX
BXSS:SP
Offset SP = 100H
0F6H
0F8H
0FAH
0FCH 5678H
100H SP BX 1234H
225
Thủ tục
Các thủ tục được khai báo như sau
– Name PROC TYPE
– ;Lưu trạng thái hiện tại của vi xử lý
– ;Thân thủ tục
– …
– ;Phục hồi trạng thái cũ của vi xử lý
– RET ;Kết thúc thủ tục
– Name ENDP
Trong đó :
– Name: Tên thủ tục
– Type : Kiểu gọi thủ tục, có hai kiểu gọi
Gọi gần: NEAR: Dòng lệnh gọi thủ tục ở cùng đoạn với thủ
tục đó
Gọi xa: FAR : Dòng lệnh gọi thủ tục ở khác đoạn với thủ
tục đó
– RET : Kết thúc thủ tục và trả quyền điều khiển cho chương
trình.
– Chú ý : Với assembly không có khái niệm hàm mà các lập
trình viên phải tự lập trình tạo ra nơi chứa kết quả của thủ tục
hoặc lấy giá trị tại các địa chỉ mặc định 226
Gọi thủ tục
CALL NAME
– SP = SP - 2
– Địa chỉ của lệnh tiếp theo sau lệnh CALL được đưa
vào đỉnh ngăn xếp
– IP trỏ vào địa chỉ vào lệnh đầu tiên của thủ tục
– Kết thúc thủ tục, khi gặp lệnh RET
– Lấy lại IP từ đỉnh ngăn xếp, lúc này IP trỏ vào địa chỉ
của lệnh tiếp theo sau lệnh CALL NAME
– SP = SP +2
227
Ví dụ
TITLE Chuyen_Chuoi
.MODEL SMALL
.STACK 200H
.DATA
STR1 DB ‘HELLO’
STR2 DB 5 DUP (?)
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA SI,STR1 ;DS:SI trỏ đến STR1
LEA DI,STR2 ;ES:DI trỏ đến STR2
CLD
MOVSB
MOVSB
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN 228
Sơ đồ bộ nhớ trước khi thực hiện lệnh MOVSW
MOVSB & MOVSW không làm ảnh hưởng đến cờ
DS:SI H E L L O
SI
ES:DI
DI
DS:SI H E L L O
SI
ES:DI H E
DI
229
CHƯƠNG 5: GIỚI THIỆU VỀ CÁC BỘ
VI XỬ LÝ HIỆN ĐẠI
THẾ HỆ CHIP DUAL-CORE
Khái niệm:
– Dual Core là danh từ chung mà Intel chỉ các vi xử lý
có 2 nhân, và 2 nhân này là nhân thực ( vật lý ).
– Pentium Dual Core là chỉ các sản phẩm Pentium của
Intel, có 2 nhân vật lý.
– Core 2 Duo là danh từ của Intel, chỉ một dòng sản
phẩm CPU của Intel dựa trên kiến trúc Core tương tự
như với các dòng Pentium Dual Core mà Intel đã đặt
tên.
THẾ HỆ CHIP DUAL-CORE
Khái niệm:
– Chip mà có 2 nhân nằm trên 1 đế ( die ) thì đó chính là thời của
các chip Pentium Dual Core với tên mã là Pen D 8xxx
( codename Smithfield ). Các CPU này, tuy có 2 lõi nhưng cả 2
lõi này đều nằm trên 1 đế. Dòng Dual Core ra đời sau dòng Pen
D8xx chính là dòng Pentium D Presler ( hay Pen D 9xx ) thì có 2
đế.
THẾ HỆ CHIP DUAL-CORE
Hiệu năng
– Pentium Dual Core ( dựa trên kiến trúc Core, mà sau
này các bạn thấy ở các dòng sản phẩm như Pentium
Dual Core E2xxx, E5xxx, E6300-E6500-E6700...)
chính là Core 2 Duo cắt giảm các tính năng như :
Bus, tập lệnh, cache hay thậm chí là xung nhịp.
– Chính xác, nếu Core 2 Duo muốn mạnh hơn Pentium
Dual Core thì cả hai con phải được sản xuất trên
cùng một tiến trình ( 65nm hay 45nm ), cùng thời gian
sản xuất ( liên kề nhau trong quý ) và quan trọng là
cùng công nghệ.
THẾ HỆ CHIP DUAL-CORE
Các model của Pentium Dual Core
– Điểm khác nhau thứ hai là đặc tính của Xeon cho phép một máy
chủ dùng chung nhiều CPU. Còn ở Core i thì Intel tắt đi QPI
(QuickPath Interconnect) (vẫn có trên CPU nhưng bị tắt đi) nên
không chạy một lúc 2 hay nhiều CPU được.
– Điểm khác nhau thứ ba là tuy CPU Xeon đơn cũng tương tự
như Core i, nhưng lại có thêm khả năng dùng RAM ECC và 1 số
thông số nhỏ (nhưng phải được mainboard hỗ trợ).
THẾ HỆ CHIP XEON-E
Nên dùng CPU Xeon hay Core i7 cho server
– Từ những khác biệt trên ta có thể thấy CPU Xeon có
ưu thế hơn hẳn so với Core i nếu chạy trong môi
trường máy chủ (server), Workstation của doanh
nghiệp.
– CPU Intel Xeon có tích hợp thêm tính năng xài RAM
ECC (Error Checking and Correction) là tính năng tự
kiểm tra và sửa lỗi được coi là thành phần căn bản và
vô cùng quan trọng trong máy chủ (server).
CHƯƠNG 6: GIỚI THIỆU CÁC
BỘ VI ĐIỀU KHIỂN
HỌ VI ĐIỀU KHIỂN 8051
Tổng quan
– Vi mạch chủ yếu của họ MCS - 51 là chip µC8051, linh kiện đầu
tiên của họ này được đưa ra thị trường. Chip μC8051 có các
đặc trưng được tóm tắt như sau:
4 KB ROM và 128 byte RAM
4 port 8- bít, 32 lối vào/ra
2 bộ định thời 16 bít
Mạch giao tiếp nối tiếp
Không gian nhớ chương trình (mở rộng) ngoài 64K
Không gian nhớ dữ liệu ngoài 64K
Bộ xử lý bít (thao tác trên các bít riêng rẽ)
210 vị trí bit nhớ được định địa chỉ
Nhân chia trong thời gian 4s.
HỌ VI ĐIỀU KHIỂN 8051
Khái niệm
– AVR là một họ vi điều khiển do hãng Atmel sản xuất
(Atmel cũng là nhà sản xuất dòng vi điều khiển 89C51
mà có thể bạn đã từng nghe đến). AVR là chip vi điều
khiển với cấu trúc tập lệnh đơn giản hóa - RISC
(Reduced Instruction Set Computer), một kiểu cấu
trúc đang thể hiện ưu thế trong các bộ xử lý.
HỌ VI ĐIỀU KHIỂN AVR
Công cụ
Trình biên dịch: Có rất nhiều trình biên dịch bạn có thể sử
dụng đế biên dịch code của bạn thành file intel hex để nạp
vào chip, một số trình dịch quen thuộc có thể kể đến như
sau:
– AvrStudio
– Wavrasm:
– WinAVR hay avr-gcc
– CodeVisionAvr
HỌ VI ĐIỀU KHIỂN AVR
Khái niệm
– PIC là một họ vi điều khiển RISC được sản xuất bởi
công ty Microchip Technology. Dòng PIC đầu tiên là
PIC1650 được phát triển bởi Microelectronics
Division thuộc General Instrument.
– PIC bắt nguồn là chữ viết tắt của "Programmable
Intelligent Computer" (Máy tính khả trình thông minh)
là một sản phẩm của hãng General Instrument đặt
cho dòng sản phẩm đầu tiên của họ là PIC1650.
HỌ VI ĐIỀU KHIỂN PIC