Chương trình là tập hợp các lệnh để xử lý dữ liệu thực hiện từng lệnh đã được lưu trong bộ nhớ , công việc thực hiện bao gồm các bước như sau: đón lệnh từ bộ nhớ, sau đó các mạnh logic đ
Trang 1KHOA ĐIỆN-ĐIỆN TỬ
BÀI GIẢNG
KỸ THUẬT VI XỬ LÝ
Hưng Yên 2015 (Tài liệu lưu hành nội bộ)
Trang 2CHƯƠNG 1: Tổng quan hệ vi xử lý
1.1 Hệ thống số có liên quan đến vi xử lý
Hệ đếm thập phân (Decimal): Hệ đếm thập phân còn gọi là hệ đếm cơ số mười và nó
được biểu diễn bởi 10 con số từ (0,1,2,3,4,5,6,7,8,9 ) những con số này được sử dụng rất nhiều
trong khoa học kỹ thuật cũng như trong đời sống hàng ngày, khi biểu diễn số thập phân thì
dứng sau dãy số thường có chữ D
Ví dụ: Ba nghìn Chín trăm Bảy mươi Tám được biểu diễn như sau
3978 = 3x103 + 9x102 + 7x101 + 8x100
= 3000 + 900 + 70 + 8
Hệ đếm thập lục phân (Hexadecimal): Hệ đếm thập phân còn gọi là hệ đếm cơ số mười
sáu và nó được biểu diễn bởi 16 ký số (0,1,2,3,4,5,6,7,8,9,B,C,D,E,F) những con số này được
sử dụng rất nhiều trong khoa học kỹ thuật đặc biệt là khoa học máy tính vì biểu diễn mã Hexa
rất ngắn gọn, khi biểu diễn số thập lục phân thì sau dãy số phải có chữ H
Ví dụ: 3978h , 12CCh, 1998h, ABCDh, 2008h …
Hệ đếm nhị phân (Binary): Hệ đếm nhị phân còn gọi là hệ đếm cơ số hai và nó được
biểu diễn bởi 2 con số là 0 và 1, trong kỹ thuật điện tử số thì số 0 gọi là mức logic thấp ứng với
điện áp thấp, số 1gọi là mức logic cao tương ứng với điện áp cao nhất Mỗi ký hiệu 0 hoặc 1
được gọi là 1 Bit (Binary Digit), khi biểu diễn số nhị phân thì dứng sau dãy số phải có chữ B
Số nhị phân thường được biểu diễn ở 2 dạng là số nhị phân có dấu và số nhị phân không dấu,
nếu số nhị phân không dấu sẽ chỉ biểu diễn các số không âm (0)
còn số nhị phân có dấu thì biểu diễn được cả giá trị âm
Ví dụ : (1101) = 1x23 + 1x22 + 0x21 + 1x20 = 8 + 4 + 0 + 1 = 13
Dải giá trị của các số có dấu 8 bít là [-128, +127 ]
Dải giá trị của các số có dấu 16 bít là [-32768, +32767 ]
Trong khi biểu diễn dãy số nhị phân có dấu thì người ta sử dụng bít MSB để quy ước cho bít
dấu, với bít 0 cho dãy số nhị phân dương còn bít 1 cho dãy số nhị phân âm
Hệ đếm BCD (Binary Coded Decimal): Số đếm BCD được định nghĩa là số thập phân
nhưng được biểu diễn dưới dạng nhị phân 4 bít, nhưng dãy số nhị phân 4 bít này khi quy sang
hệ thập phân thì giá trị của nó phải 9 Trong kỹ thuật điện tử nói chung thì mã BCD được sử
dụng để giải mã hiển thị LED bảy thanh…
1010101010101010
MSB LSB
Trang 3Ví dụ: (0011), (0100), (0101), (0110), …(1001) ; đây gọi là số BCD không nén
Ví dụ: Cho số thập phân là 15 , biểu diễn dưới dạng số BCD là 00010101
Số bù 2: Trong kỹ thuật Vi xử lý để biểu diễn một con số nào đó dưới dạng dãy số nhị
phân thì ngoài việc biểu diễn số không dấu, số có dấu thì người ta còn sử dụng cách biểu diễn
số bù 2 Vậy số bù 2 sẽ biểu diễn như thế nào?
Ví dụ: Hãy biểu diễn dãy số A = 10011001 sang số bù 2 của nó:
- b1: Tìm số bù 1 của A(bằng cách lấy bù tất cả các bit của A): 01100110
- b2: Tìm số bù 2 của A (bằng cách lấy số bù 1 cộng cho 1) : 01100111
đến đây ta nhận thấy rằng số bù 2 của một số nào đó nó chính là số đối của nó và tổng = 0
1.2 Các phép biến đổi giữa các hệ đếm
Phép cộng nhị phân không dấu :
Ví dụ : Cho 2 số nhị phân như sau A = 10010011 ; B = 00111001 hãy tìm tổng Y
của 2 số nhị phân đã cho
0+0=1 0+1=1 1+0=1 1+1=0;nhớ 1
A=10010011b B=00111001b Y=A+B=11001100b
Phép trừ nhị phân:
Ví dụ : Cho 2 số nhị phân như sau A = 10010011 ; B = 00111001 hãy tìm hiệu Z
của 2 số nhị phân đã cho (Lưu ý rằng phép trừ có thể thực hiện bằng cách biến thành phép
cộng)
0-0=0 0-1=1;mượn 1 1-0=1
1-1=0
A=10010011b B=00111001b Z=A -B=01011010b
Phép nhân nhị phân :
Ví dụ : Cho 2 số nhị phân như sau A = 00100101 ; B = 00000100 hãy tìm tích F
Khi nhân 2 dãy số nhị phân với nhau thì ta đặt phép toán nhân giống như nhân số thập phân,
kết quả của phép nhân 2 dãy số nhị phân 8 bít sẽ thu được dãy số nhị phân là 16 bít, như vậy ta
có F = A*B = 0000000010010100b
Phép chia nhị phân :
Ví dụ : Cho 2 số nhị phân như sau A = 10010110 ; B = 00000100 hãy tìm thương
Trang 4Khi chia 2 dãy số nhị phân với nhau thì ta đặt phép toán chia cũng giống như khi chia 2 số thập
phân, kết quả của phép chia cũng như phần dư (nếu có) thu được tương tự như khi làm phép
chia đối với số thập phân, như vậy ta có M = A/B = 00100101b dư 0010b
Chuyển đổi số thập phân sang nhị phân :
Để chuyển đổi số thập phân sang số nhị phân người ta thường dùng phương pháp lấy số thập
phân cần chuyển rồi chia 2 liên tiếp đến khi không thể chia được nữa thì dừng
Ví dụ : Chuyển số thập phân 25 sang số nhị phân không dấu
Chuyển đổi số nhị phân sang thập phân :
Để chuyển đổi số nhị phân sang số thập phân người ta thường dùng phương pháp lấy tổng của
tích n các số nhị phân cần chuyển nhân với 20 đến 2N-1 hay theo biểu thức tổng quát như sau: A
= B(N-1)* 2(N-1) + B(N-2)* 2(N-2) + B(N-3)* 2(N-3) + … + B(1)* 2(1) + B(0)* 2(0)
Ví dụ : Chuyển số nhị phân không dấu 01011110b sang số thập phân
A = 0*27 + 1*26 +0*25 + 1*24+ 1*23 + 1*22 + 1*21 + 0*20 = 94
như vậy ta có 01011110b = 94
Chuyển đổi số nhị phân sang Hexa :
Ví dụ : Chuyển số nhị phân 1100101011111110 sang số hexa
Trước hếtta chia số nhị phân đã cho thành các nhóm 4-bit tính từ bít có trọng số nhỏ nhất, sau
đó thay thế mỗi nhóm 4-bit bằng ký hiệu hexa tương ứng với nó ta sẽ thu được kết quả như
sau:
Chuyển đổi số Hexa sang nhị phân:
Ví dụ : Chuyển số hexa 2F8h và ABBAh sang số nhị phân
Tương tự như trường hợp trên ta sẽ thay thế mỗi ký hiệu hexa bằng 4-bit nhị phân tương ứng
với nó và ta sẽ thu được kết quả như sau:
1100 1010 1111 1110 hay 11001010 11111110b = CAFEh
C A F E
2 F 8
0010 1111 1000 hay 2F8h = 001011111000b
Trang 5 Mã ASCII: (American Standard Code for Information Interchange )
Quá trình trao đổi thông tin trong máy tính nói chung cũng như quá trình xử lý thông tin
của các bộ vi xử lý, tất cả các thông tin đều được biểu diễn dưới dạng các số 0 và 1 Mỗi tổ hợp
số 0 hoặc 1 được gán một ký tự chữ cái, chữ số hoặc một ký tự đặc biệt nào đó Khi thông tin
được truyền đi, được lưu giữ trong bộ nhớ và hiển thị trên màn hình đều ở dưới dạng ký tự và
tuân theo một loại mã chuẩn được sử dụng rất rộng rãi gọi là mã ASCII
BẢNG MÃ ASSII (American Standard Code for Information Interchange)
Trang 6BẢNG MÃ ASSII mở rộng
Trang 71.3 Lịch sử phát triển của các hệ Vi xử lý
Kiến trúc hệ Vi xử lý là một thuật ngữ dùng để chỉ rõ những đặc trưng của hệ vi xử lý
trong đó bao gồm có cấu trúc phần cứng và tổ chức phần mềm được cài đặt trong hệ Một hệ
thống vi xử lý hay gọi ngắn hơn là hệ vi xử lý thường bao gồm các thành phần cơ bản như:
- Bộ xử lý trung tâm CPU (Central Processing Unit ) là trung tâm đầu não của hệ
- Bộ nhớ tâm bao gồm 2 thành phần là ROM và RAM
- Thiết bị vào/ra dữ liệu
- Các kênh thông tin hay Bus hệ thống…
Tất cả các thiết bị có các chức năng như vậy đều được gọi là một hệ vi xử lý.Trong thực
tế có rất nhiều hãng chế tạo các bộ vi xử lý cho các máy vi tính như: IBM, Intel, Cyrix, AMD,
Motorola nhưng thông dụng nhất vẫn là bộ vi xử lý của Intel Các bộ vi xử lý của Intel được
phát triển qua các thời kỳ như sau:
Năm 1971, Intel đưa ra bộ vi xử lý 4004 với 4 bit dữ liệu, 12 bit địa chỉ; 0,8MHz
Năm 1972, bộ vi xử lý Intel 8080 ra đời với 8bit dữ liệu, 12 bit địa chỉ; tốc độ 0,8 -5MHz
Năm 1978, bộ vi xử lý Intel 8086 ra đời với 16bit dữ liệu, 20 bit địa chỉ; tốc độ 10MHz
Năm 1979, bộ vi xử lý Intel 8088 ra đời nhưng vẫn tương thích với hệ thống 8086
Năm 1982 bộ vi xử lý 80286 ra đời với 16bit dữ liệu, 20 bit địa chỉ, tốc độ 20MHz
Năm 1985-1988, bộ vi xử lý 80386 ra đời với 32 bit dữ liệu và 32 bit địa …
Năm 1989, bộ vi xử lý 80486 ra đời với 32 bit dữ liệu và 32 bit địa chỉ tốc độ 50-60MHz
Năm 1993, bộ vi xử lý Pentium ra đời với 64 bit dữ liệu, tốc độ xử lý 100MHz sau đó là các bộ
vi xử lý Pentium Pro,Pentium II, Pentium III, Celeron, Pentium 4…
Hình 1.1 Đường tăng trưởng số lượng transistor trên bộ vi xử lý (dot) của Intel và định luật
Moore (đường trên với chu kỳ 18 tháng, đường dưới chu kỳ 24 tháng
Trang 81.4 Chức năng của vi xử lý
Vi xử lý dùng các cổng logic giống như các cổng logic được sử dụng trong đơn vị xử lý
trung tâm của máy tính số Do cấu trúc giống như CPU và được xây dựng từ các mạch vi điện
tử nên có tên là vi xử lý: microprocessor Giống như CPU, microprocessor có các mạch điện tử
cho việc điều khiển dữ liệu và tính toán sự điều khiển của chương trình Ngoài ra
microprocessor là một đơn vị xử lý dữ liệu
Công việc xử lý dữ liệu là chức năng chính của vi xử lý Việc xử lý dữ liệu bao gồm tính
toán và điều khiển dữ liệu Việc tính toán được thực hiện bởi các mạch điện logic được gọi là
đơn vị xử lý logic số học có thể thực hiện các phép toán như Add, Subtract, And, Or Compare,
Increment, Decrement
ALU không thể thực hiện một phép toán mà không có dữ liệu , ví dụ ALU cộng 2 dữ liệu
với nhau thì 2 dữ liệu phải đặt đúng vị trí trước khi cộng ALU không thể thực hiện việc
chuyển dữ liệu từ nơi này đến nơi khác Để ALU có dữ liệu cho việc xử lý thì ngoài mạch điện
ALU, vi xử lý còn có các mạch điện logic khác để điều khiển dữ liệu Các mạch điện logic
điều khiển dữ liệu sẽ di chuyển dữ liệu vào đúng vị trí để khối ALU xử lý dữ liệu Sau khi thực
hiện xong, khối điều khiển sẽ di chuyển dữ liệu đến bất cứ nơi nào mong muốn
Để xử lý dữ liệu, vi xử lý phải điều khiển các mạch logic , để vi xử lý điều khiển các
mạch logic thì cần phải có chương trình Chương trình là tập hợp các lệnh để xử lý dữ liệu thực
hiện từng lệnh đã được lưu trong bộ nhớ , công việc thực hiện bao gồm các bước như sau: đón
lệnh từ bộ nhớ, sau đó các mạnh logic điều khiển sẽ giải mã lệnh và sau cùng thì các mạch
logic điều khiển sẽ thực hiện sau khi giải mã
Do các lệnh lưu trữ trong bộ nhớ nên có thể thay đổi các lệnh nếu cần Khi thay đổi các
lệnh của vi xử lý tức là thay đổi cách thức xử lý dữ liệu Các lệnh lưu trữ trong bộ nhớ sẽ quyết
định công việc mà vi xử lý sẽ làm
Tóm tắt: chức năng chính của vi xử lý là xử lý dữ liệu Để làm được điều này vi xử lý
phải có các mạch logic cho việc xử lý và điều khiển dữ liệu và các mạch logic điều khiển Các
mạch logic xử lý sẽ di chuyển dữ liệu từ nơi này đến nơi khác và thực hiện các phép toán trên
dữ liệu, mạch logic điều khiển sẽ quyết định mạch điện nào cho việc xử lý dữ liệu Vi xử lý
thực hiện một lệnh với trình tự như sau: đón lệnh từ bộ nhớ , tiếp theo mạch logic điều khiển sẽ
giải mã lệnh để xem lệnh đó yêu cầu vi xử lý thực hiện công việc gì, sau đó vi xử lý sẽ thực
hiện đúng công việc của lệnh đã yêu cầu , quá trình này được gọi là chu trình đón – và – thực
hiện lệnh
Ngoài chức năng đón và thực hiện lệnh , các mạch logic điều khiển còn điều khiển các
mạch điện giáo tiếp giao tiếp bên ngoài kết nối với vi xử lý Vi xử lý cần phải có sự trợ giúp
của các mạch điện bên ngoài Các mạch điện dùng để lưu trữ lệnh để vi xử lý xử lý được gọi là
bộ nhớ, các mạch điện giao tiếp để di chuyển dữ liệu từ bên ngoài vào bên trong xử lý và xuất
dữ liệu từ bên trong vi xử lý ra ngoài được gọi là các thiết bị I/O hay các thiết bị ngoại vi
Trang 91.5 Cấu trúc cơ bản của vi xử lý
1.5.1 Sơ đồ khối tổng quát của hệ Vi xử lý
Sơ đồ khối :
Hình 1.2 Sơ đồ khối tổng quát của hệ VXL
Chức năng các khối :
Bộ xử lý trung tâm CPU (Central Processing Unit ) là trung tâm đầu não của hệ, nó có
chức năng thu thập, xử lý thông tin và điều khiển mọi hoạt động của hệ vi xử lý
Bộ nhớ trung tâm có nhiệm vụ lưu trữ thông tin dữ liệu trước khi CPU xử lý
Thiết bị I/O thực hiện việc nhận dữ liệu từ các kênh thông tin từ bên ngoài vào để cho
CPU xử lý và xuất ra các tín hiệu điều khiển hệ thống
Các kênh thông tin hay Bus hệ thống là cầu nối liên kết giữa các khối trong đó thực hiện
3 việc chính là liên kết các Bus địa chỉ, Bus điều khiển và Bus dữ liệu
1.5.2 Tổ chức các kênh thông tin trong hệ Vi xử lý
Kiến trúc Harvard
Memory
CPU
Program Addres Bus
Data Bus
Data Addres Bus
Fetch Bus
Data Memory
Kiến trúc Von Neumann
Hình 1.3 Cấu trúc các kênh thông tin trong hệ VXL
Trang 10Trên đây là 2 cách tổ chức bộ nhớ theo kiểu Von Neumann và Harvard Với kiểu tổ
chức bộ nhớ chương trình và dữ liệu tách biệt cho phép tốc độ truy xuất thông tin nhanh hơn
đáng kể Các kênh dữ liệu đều là kênh song song và dùng chung cho tất cả các bộ nhớ, tuy
nhiên nó phải được kiểm soát thông qua các cổng lôgic 3 trạng thái Cổng này có nhiệm vụ tạo
ra trạng thái đặc biệt khi có những thành phần không được kích hoạt làm việc, trạng thái đặc
biệt này sẽ cách ly về mặt tín hiệu giữa kênh thông tin với từng thành phần trong hệ mặc dù
chúng vẫn được kết nối với nhau về mặt vật lý
1.5.3 Khối xử lý trung tâm (Central Processing Unit)
Bộ vi xử lý là hạt nhân của hệ vi xử lý, nó là thành phần quan trọng nhất kiểm soát tất
cả các hoạt động của hệ và thực hiện các thao tác trên dữ liệu Hầu hết các CPU được hình
thành từ các mạch lôgic nhằm thực hiện liên tục 2 thao tác là tìm nạp lệnh từ bộ nhớ để giải mã
và thực thi lệnh CPU có khả năng hiểu và thực thi các lệnh dựa trên một tập các mã nhị phân
gọi là mã máy trong đó mỗi mã nhằm thực hiện một thao tác nào đó.Tổ hợp các lệnh cho mỗi
loại CPU gọi là tập lệnh và nó thường chia ra thành các nhóm lệnh như:
Cấu trúc đơn giản của một loại CPU được minh họa như sau:
- PC (Program Couter): Bộ đếm trương trình có vai trò như một con trỏ, trỏ đến ô
nhớ chứa lệnh mà CPU cần truy nhập
Hình 1.4 Cấu trúc chung của một bộ CPU
Control Bus
FLAG S
AC C TM P
I R
r
Trang 11- IR (Instruction Register):Thanh ghi lệnh IR (Instruction Register) Thanh ghi lệnh
thực hiện chức năng chứa lệnh mà CPU đang thực hiện
- CU (Control Unit) Đơn vị điều khiển có chức năng giải mã lệnh
- MAR ( Memory Address Register) Thanh ghi chỉ bộ nhớ thực hiện chức năng chứa
địa chỉ của ô nhớ hiện thời mà CPU đang truy nhập
- ALU (Arithmetic Logic Unit) đơn vị số học logic, thực hiện các phép tính số học,
logic và các phép xử lý dữ liệu khác
- ACC (Accumulator) Thanh chứa , chứa toán hạng của một phép tính hoặc kết quả
của phép tính
- TMP (Temporary) Thanh ghi tạm, chứa toán hạng thứ hai của phép tính
- FLAGS Thanh ghi cờ chứa thông tin về trạng thái kết quả phép tính sau khi thực
hiện lệnh
- Address Bus : Bus địa chỉ
- Data Bus : Bus dữ liệu
- Control Bus : Bus điều khiển
1.5.4 Quá trình truy xuất và xử lý thông tin
Việc tìm nạp một lệnh từ Ram hệ thống là một trong những thao tác cơ bản nhất mà
CPU phải thực hiện Quá trình tìm nạp lệnh đƣợc thực hiện theo trình tự nhƣ sau:
Address Bus
Data Bus
n+2 n+1
n n-1
Hình 1.5: Hoạt động của Bus cho chu kỳ tìm nạp lệnh
Trang 12Địa chỉ đang chứa trong PC sẽ được gửi lên trên bus địa chỉ
Tín hiệu cho phép đọc lệnh từ bộ nhớ sẽ được kích hoạt sang trạng thái tích cực
Dữ liệu hay mã lệnh sẽ được đọc từ bộ nhớ và gửi lên kênh dữ liệu rồi chuyển về thanh
ghi lệnh IR Tiếp theo đó là nội dung của PC (tức địa chỉ) sẽ được tăng lên1để trỏ tới địa chỉ kế
tiếp trong bộ nhớ
Mã lệnh sẽ được chuyển xuống bộ giải mã và căn cứ theo mã lệnh CPU sẽ triển khai
thực hiện lệnh.Trường hợp toán hạng nằm trong bộ nhớ chương trình ngay sau mã lệnh CPU
tiếp tục đưa PC nên bus địa chỉ để trỏ tới toán hạng rồi đưa ra thanh ghi để thực hiện lệnh
VD: ADD A,#3EH Nếu toán hạng nằm ngay trong thanh ghi của CPU, khi đó CPU thực hiện lệnh ngay
VD : ADD A,R1 Toán hạng nằm trong bộ nhớ mà địa chỉ của nó trong 1 thanh ghi của CPU CPU đưa
địa chỉ cho thanh ghi địa chỉ (MAR) để đọc dữ liệu và thực hiện lệnh VD : ADD A,@R0
1.5.5 Tổ chức bộ nhớ của hệ Vi xử lý
Bộ nhớ trung tâm là bộ phận rất quan trọng đối với mỗi hệ VXL, nó là tập hợp các
thanh ghi thông tin với số lượng lớn Chức năng cơ bản của bộ nhớ là để trao đổi và lưu trữ
thông tin
a Bộ nhớ chỉ đọc (Read Only Memory - ROM):
ROM cơ bản:
ROM dùng để lưu trữ chương trình điều hành (Monitor) của hệ VXL Chương trình này
sẽ quy định mọi hoạt động của hệ VXL Bộ VXL sẽ căn cứ vào các lệnh chứa trong chương
trình để điều khiển hệ VXL thực hiện các chức năng, nhiệm vụ được ấn định trong lệnh Nói
cách khác, hệ VXL sẽ thực hiện một cách trung thực thuật toán mà người thiết kế phần mềm đã
xây dựng và cài đặt vào ROM của hệ
Ngoài ra, ROM trong hệ VXL còn dùng để lưu trữ các bảng biểu, tham số của hệ thống
mà trong quá trình hoạt động không được thay đổi như: bảng địa chỉ cổng giao tiếp, các bảng
tra cứu số liệu, các bộ mã cần sử dụng trong hệ
ROM cũng được quản lý theo phương thức ma trận điểm, nó có nhiều chủng loại khác
nhau: ROM, PROM, EPROM, EEPROM,…
ROM là bộ nhớ cố định có cấu trúc đơn giản nhất Nội dung của nó do nhà sản xuất chế
tạo, người sử dụng không thể thay đổi nội dung này được nữa
PROM (Programmable ROM - ROM có khả năng lập trình được):
Đặc điểm chung: Nội dung của PROM do nhà sản xuất hoặc người thiết kế hệ VXL nạp
vào nhưng chỉ đựoc 1 lần Sau khi nạp xong nội dung này không thể thay đổi được nữa
EPROM (Eraseable PROM ROM nạp/xoá được nhiều lần):
EPROM là bộ nhớ cố định có cấu trúc đặc biệt Nội dung của nó do nhà sản xuất hay người
thiết kế hệ VXL nạp vào và có thể nạp/xoá nhiều lần Người ta tạo ra 1 bit thông tin trong
EPROM dựa trên nguyên tắc làm việc của Transistor trường có cực cửa cách ly kênh cảm ứng
(MOSFET kênh cảm ứng)
Trang 13 EEPROM (Electrical EPROM ROM có khả năng lập trình và xoá được bằng điện)
b Bộ nhớ W/R còn gọi là bộ nhớ truy cập ngẫu nhiên(Random Acess Memory):
RAM là bộ nhớ có thể ghi và đọc được, thông tin trên RAM sẽ bị mất khi mất nguồn
cung cấp Theo phương thức lưu trữ thông tin, RAM được chia thành 2 loại cơ bản: RAM tĩnh
và RAM động
RAM tĩnh: Có thể lưu trữ thông tin lâu tuỳ ý miễn là được cung cấp điện năng - tất cả
các loại phần tử nhớ bằng Trigơ đều thuộc loại này
RAM động: Chỉ lưu được thông tin trong 1 khoảng thời gian nhất định Muốn kéo dài
thời gian này cần có phương thức làm tươi lại thông tin trong phần tử nhớ RAM Phần tử nhớ
của RAM động đơn giản nhất là một linh kiện điện dung - tụ diện Sử dụng RAM động có
phức tạp nhưng về cấu trúc nhớ lại đơn giản, tiêu tốn ít năng lượng, tăng mật độ bộ nhớ và đôi
khi còn làm tăng cả tốc độ làm việc của bộ nhớ
Cấu trúc mạch điện của các bộ nhớ RAM rất đa dạng cả về công nghệ chế tạo chúng
(TTL, MOS,… ) và các yêu cầu sử dụng chúng như các yêu cầu về ghép nối, tốc độ làm việc,
mật độ linh kiện và dung lương cần thiết…
Trang 14CHƯƠNG 2 Cấu rúc và ập ện của vi xử ý 16 bi
2.1 Cấu trúc vi xử lý 8086/8088
2.1.1 Sơ đồ khối tổng quát của bộ Vi xử lý 8088
E.U (execution unit) B.I.U (Bus interface unit)
EU
Lôgic điều khiển BUS
Đệm lệnh (hàng đợi lệnh) (Có 6 byte với 8086)
Bus ngoài
(8 bít)
Bus trong của CPU 8 bit dữ liệu 20 bit địa chỉ chØ
Bus địa chỉ (20 bít)
Các thanh ghi đoạn
và con trỏ lệnh
Accumulator Base
Count Data Stack pointer Base pointer Source index
Destination index
Code segment Data segment
Stack segment
Extra segment Intruction pointer
Bus dữ liệu ALU 16 bít
Hình 2.1 : Sơ đồ khối tổng quát của bộ Vi xử lý 8086/8088
Trang 15BIU: Đơn vị giao tiếp BUS
EU: Đơn vị thực hiện lệnh (CU và ALU)
Đơn vị giao tiếp BUS – BIU:
Chức năng:
– Nhận trước các lệnh cất tạm vào hàng đợi lệnh
– Đảm nhiệm chức năng điều khiển BUS
Giao tiếp qua các BUS:
– Phát các tín hiệu địa chỉ đến bộ nhớ và
các cổng I/O thông qua A-Bus – Đọc mã lệnh từ bộ nhớ thông qua D-Bus
– Đọc dữ liệu từ bộ nhớ thông qua D-Bus
– Ghi dữ liệu vào bộ nhớ thông qua D-Bus
– Đọc dữ liệu từ các cổng Input thông qua D-Bus
– Ghi dữ liệu ra các cổng Output thông qua D-Bus
Đơn vị số học và logic – ALU:
Chức năng:
– Thực hiện các phép toán số học : Cộng, trừ, nhân, chia, tăng, giảm, đảo…
– Thực hiện các phép toán Logic: AND, OR, XOR, NOT, dịc bit…
Mô hình kết nối của ALU
Đơn vị điều khiển – CU:
Chức năng:
– Nhận lệnh từ bộ nhớ đưa vào thanh ghi lệnh IP
– Tăng nội dung thanh ghi PC mỗi khi nhận lệnh song
– Giải mã lệnh và xác định thao tác mà lệnh yêu cầu
– Phát ra tín hiệu điều khiển thực thi lệnh
– Nhận các tín hiệu yêu cầu từ BUS hệ thống và giải quyết đáp ứng yêu cầu đó
Mô hình kết nối đơn vị điều khiển
Trang 16 Các thông tin đến CU
– Clock: tín hiệu xung nhịp từ mạch tạo dao động
– Mã lệnh từ thanh ghi lệnh đƣa đến CU giải mã
– Các trạng thái cờ đƣa đến cho biết trạng thái của CPU cũng nhƣ trạng thái thực
hiện các phép toán trong ALU
– Các tín hiệu điều khiển từ BUS điều khiển
– Các tín hiệu điều khiển bên trong CPU: điều khiển thanh ghi, ALU
– Các tín hiệu điều khiển bên ngoài CPU (Bộ nhớ hay cổng vào ra)
2.1.2 Sơ đồ chân tín hiệu của Vi xử lý 8088
Hình 2.2 : Sơ đồ chân tín hiệu của 8086/8088
Trang 17 Các đường địa chỉ, trạng thái:
- Chân A0-A15: (2 - 16, 35): Là 16 đường địa chỉ
- AD0-AD7: Là các đường địa chỉ và dữ liệu
- A16-A19 (Chân 35 -38): Bốn bit địa chỉ cao hoặc 4 tín hiệu trạng thái chỉ hoạt động
hiện tại của CPU
- S5 chỉ trạng thái cờ IF ở đầu mỗi chu kỳ đồng hồ
- S6 luôn bằng 0
- S4 và S3 cho biết thanh ghi đang được truy xuất
A17/S4 A16/S3 Thanh ghi được truy xuất
Các đường điều khiển địa chỉ/dữ liệu:
ALE (Address Latch Enable- chốt địa chỉ): Chân ra mức cao xác nhận có địa chỉ đang
ổn định trên bus địa chỉ
DEN (Data Enable) : Lối ra 3 trạng thái ở mức thấp tín hiệu cho phép truyền dữ liệu
WR (Write): Lối ra 3 trạng thái xác nhận bộ VXL ghi thông tin lên IO hoặc Mem
RD (Read) : Lối ra 3 trạng thái tích cực âm Xác nhận việc đọc dữ liệu
SSO (Status Line 0): Lối ra 3 trạng thái Kết hợp với IO/M và DT/R để cho thông tin
Các đường điều khiển ngắt: Cho phép dừng hoạt động của CPU
NMI (Non Maskable Interrupt) Ngắt không che mặt nạ - tín hiệu vào hiệu lực ở mức
cao dùng để ngắt quá trình xử lý của CPU Là tín hiệu không thể bị bỏ qua (bị che mặt nạ) bởi
CPU
Trang 18INTR (Interrupt Request) Tín hiệu vào để ngắt qúa trình xử lý của CPU, có thể che
được (masakable) tức CPU có thể bỏ qua bằng sự điều khiển của phần mềm
INTA (Interrupt Acknowledge) Tín hiệu ra báo MP đã nhận 1 lệnh ngắt
RESET Khởi động lại MP
TEST (Test Interrupt): Khi MP đang thực hiện lệnh WAIT thì MP sẽ kiểm tra chân
TEST Nếu TEST=1 thì máy tiếp tục chờ cho đến khi TEST=0
Các chân điều khiển thao tác:
CLK (Clock Input) Tín hiệu đồng hồ chủ, đồng bộ mọi hoạt động của MP
READY là tín hiệu trả lời của I/O hoặc MEMORY báo chu kỳ chuyền số liệu đã hoàn
tất
HOLD và HLDA (Hold Request) Báo có yêu cầu làm chủ bus từ bên ngoài Khi MP
tiếp nhận yêu cầu này thì đưa ra tín hiệu HLDA (Hold Acknowledge)
MN/MX (Minimum/Maximum Mode) Tín hiệu lối vào báo MP công tác ở mode tối đa
(0) hay tối thiểu (1)
Các chân trong chế độ MAX
Chân QS1 (24) và QS0 (25) báo thông tin trạng thái về hàng đợi lệnh
RQ/GT1, RQ/GT0: Yêu cầu và cho phép bộ xử lý cùng hợp tác được điều khiển bus
2.1.3 Tập các thanh ghi bên trong CPU của 8088
Mặc dù bộ vi xử lý có thể thao tác với dữ liệu bộ nhớ nhưng một lệnh như vậy sẽ được
thực hiện nhanh hơn (cần ít chu kỳ đồng hồ hơn), nếu như dữ liệu được lưu trong các thanh
ghi Đó cũng là nguyên nhân tại sao ngày nay các bộ vi xử lý được sản xuất với xu hướng có
nhiều thanh ghi hơn
Với các thanh ghi dữ liệu các byte thấp và byte cao có thể được truy nhập một cách
riêng biệt, sử dụng từng 8 bit một cách riêng rẽ Ví dụ:
Trang 19Byte cao của thanh ghi AX được gọi là AH và byte thấp là AL
Byte cao của thanh ghi BX được gọi là BH và byte thấp là BL
Byte cao của thanh ghi CX được gọi là CH và byte thấp là CL…
A Các thanh ghi dữ liệu (AX, BX,CX,DX)
Thanh ghi Byte cao Byte thấp
Thanh ghi AX (Accumulator register): Là thanh ghi tích lũy được sử dụng nhiều nhất
trong các lệnh số học, logic, và chuyển dữ liệu bởi vì việc sử dụng chúng tạo ra mã máy ngắn
nhất.Trong các phép toán nhân chia một trong các toán hạng tham gia phải được chứa trong
thanh ghi AX (nếu là 16 bit) và AH hoặc AL (nếu là 8 bit) Các thao tác vào ra cũng sử dụng
thanh ghi AX hoặc AL
Thanh ghi BX (thanh ghi cơ sở- Base register): Thanh ghi này ngoài việc thao tác dữ
liệu nó thường chứa địa chỉ cơ sở của một bảng dùng cho lệnh XLAT.(dịch AL thành 1 giá trị
trong bảng BX)
Thanh ghi CX (thanh ghi đếm- Count register):Việc xây dựng một chương trình lặp
được thực hiện dễ dàng bằng cách sử dụng thanh ghi CX, trong đó CX đóng vai trò bộ đếm số
vòng lặp (REP, LOOP) CL được dùng làm bộ đếm trong các lệnh dịch và quay bit
Thanh ghi DX (thanh ghi dữ liệu - Data register): DX và AX cùng được sử dụng trong
các thao tác của phép nhân hoặc chia các số 16 bit DX còn được sử dụng để chứa địa chỉ của
các cổng trong các lệnh vào ra dữ liệu trực tiếp (In/Out)
B Các thanh ghi đoạn (CS, DS, ES, SS)
Khối BIU đưa ra trên Bus địa chỉ 20 bit địa chỉ, như vậy 8088 có khả năng phân biệt
được 220= 1 048 576 = 1 Mbyte ô nhớ Nói cách khác không gian địa chỉ của 8088 là 1
Mbyte Trong không gian 1 Mbyte bộ nhớ này cần chia thành nhiều đoạn khác nhau :
Đoạn chứa chương trình
Đoạn chứa dữ liệu và kết quả trung gian của chương trình
Tạo ra vùng nhớ đặc biệt gọi là ngăn xếp
Trang 20Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các
đoạn trên và chúng được gọi là các thanh ghi đoạn (Segment Registers): CS, DS, SS, ES
Các thanh ghi đoạn này chỉ ra địa chỉ đầu của 4 đoạn trong bộ nhớ dung lượng lớn nhất
của 4 đoạn này là 64 Kbyte Các đoạn có thể nằm cách nhau hoặc trùm lên nhau
Nội dung của thanh ghi sẽ xác định địa chỉ của ô nhớ đầu tiên của đoạn, địa chỉ này gọi
là địa chỉ cơ sở Địa chỉ của các ô nhớ khác trong cùng đoạn được tính bằng cách cộng thêm
vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch hay độ lệch (offset)
Địa chỉ vật lý (20 bit) của một ô nhớ được xác định như sau :
Điạ chỉ vật lý = Điạ chỉ đoạn *10h + thanh ghi lệch (hay offset) và điạ chỉ logic trong
máy tính luôn được biểu diễn dưới dạng Segment:Offset Tại mọi thời điểm thì chỉ những ô nhớ
được định địa chỉ bởi 4 đoạn trên mới được truy cập
C Các thanh ghi con trỏ và chỉ số : SI, DI, SP, BP
Trong 8088 có 3 thanh ghi con trỏ và 2 thanh ghi chỉ số 16 bit Các thanh ghi này đều có
thể được dùng như các thanh ghi đa năng (ngoại trừ IP), nhưng ứng dụng chính của mỗi thanh
ghi là chúng được ngầm định như là thanh ghi lệch cho các đoạn tương ứng Cụ thể như sau :
Thanh ghi BP : (con trỏ cơ sở - Base Pointer): BP luôn trỏ vào một dữ liệu nằm trong
đoạn ngăn xếp SS Địa chỉ cụ thể SS:BP được xác định như trên
Thanh ghi SP(con trỏ ngăn xếp - Stack Pointer): Được sử dụng kết hợp với SS để truy
nhập vào đoạn ngăn xếp SP luôn trỏ vào đỉnh hiện thời của ngăn xếp trong đoạn ngăn xếp SS
Địa chỉ cụ thể SS:SP
Thanh ghi SI(chỉ số nguồn - Source Index):SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà
địa chỉ cụ thể tương ứng với DS:SI Bằng cách tăng nội dung của SI chúng ta có thể truy nhập
dễ dàng đến các ô nhớ liên tiếp
Thanh ghi DI (chỉ số đích - Destination Index): SI chỉ vào dữ liệu trong đoạn dữ liệu
DS mà địa chỉ cụ thể tương ứng với DS:DI Có một số lệnh gọi là các thao tác chuỗi sử dụng
DI để truy nhập đến các ô nhớ được định địa chỉ bởi ES
D Thanh ghi con trỏ lệnh IP:
Các thanh ghi bộ nhớ chúng ta vừa trình bày dùng để truy cập dữ liệu, để truy nhập đến
các lệnh, 8088 sử dụng các thanh ghi CS và IP Thanh ghi CS chứa điạ chỉ của lệnh tiếp theo
còn IP chứa địa chỉ offset của lệnh đó Thanh ghi IP được cập nhập mỗi khi có một lệnh được
thực hiện
E Thanh ghi cờ:
Đây là thanh ghi 16 bit, mỗi bit được sử dụng để thể hiện một trạng thái của bộ vi xử lý
tại một thời điểm nhất định trong quá trình thực hiện chương trình Mới chỉ có 9 bit được sử
dụng và người ta gọi mỗi bit là một cờ
x x x x OF DF IF TF SF ZF x AF x PF x CF
Các cờ trạng thái
Trang 21CF (Carry Flag): được thiết lập khi phép toán thực hiện có nhớ hoặc có vay mượn
PF(Parity Flag): được thiết lập khi kết quả của phép toán có tổng số bit có giá trị 1 là
một số chẵn (ở phần thấp của kết quả)
AF (Auxiliary Flag): được thiết lập khi có nhớ từ "bit có trọng số lớn nhất ở phần thấp"
sang "bit có trọng số thấp nhất ở phần cao"
ZF (Zero Flag) : Được thiết lập khi tất cả các bit của kết quả có giá trị 0
SF ( Sign Flag): được thiết lập khi bit MSB của kết quả có giá trị 1
OF (Overflow Flag): được thiết lập khi kết quả nằm ngoài giới hạn cho phép
DF (Direction Flag): Nếu bit này có giá trị 1 thì bộ vi xử lý cho phép duyệt chuỗi từ
phải sang trái hoặc từ địa chỉ cao đến địa chỉ thấp
F Bộ đếm chương trình PC (Program Counter):
2.1.4 Hoạt động của bộ Vi xử lý 8088
Bộ Vi xử lý 8086/8088 hoạt động ở một trong hai chế độ là chế độ MIN và MAX
Chế độ MIN: CPU tự phát tín hiệu điều khiển cho các BUS
Chế độ MAX: CPU phát tín hiệu trạng thái tới chip điều khiển BUS (8288)
Từ sơ đồ khối ta thấy rằng bên trong CPU 8086/8088 có 2 khối chính đó là khối phối
ghép Bus (Bus Interface Unit : BIU) và khối thực thi lệnh (Excution Unit : EU), 2 khối này
được ghép với nhau thông qua hàng đợi lệnh nhằm tăng đáng kể tốc độ xử lý của CPU
Các Bus bên trong CPU có nhiệm vụ chuyển tải các tín hiệu của các khối khác Trong số các
bus đó có bus dữ liệu 16 bit của ALU, bus các tín hiệu điều khiển ở EU và bus trong của hệ
thống ở BIU Trước khi đi ra bus ngoài hoặc đi vào bus trong của bộ vi xử lý thì các tín hiệu
truyền trên bus thường được cho qua các bộ đệm để nâng cao tính tương thích hoặc khả năng
phối ghép BIU sẽ đưa ra địa chỉ, đọc mã lệnh từ bộ nhớ, đọc/ghi dữ liệu từ/vào cổ ng hoặc bộ
nhớ hay nói khác là BIU sẽ chịu trách nhiệm cung cấp địa chỉ lên bus và trao đổi dữ liệu với
bus
Trong EU ta thấy có khối điều khiển CU, khối này thực hiện việc giả mã lệnh và thông
tin đâù ra sẽ được đưa tới mạch tạo xung điều khiển, kết quả là ta thu được những dãy xung
khác nhau (tùy theo từng mã lệnh cụ thể ) để điều khiển các hoạt động của các bộ phận trong
Thanh ghi bộ đếm chương trình cũng
được gọi là thanh ghi con trỏ lệnh nó giữ địa
chỉ của lệnh kế tiếp sẽ được nhận vào Sau
khi một lệnh được nhận vào, nội dung PC tự
động tăng lên để trỏ sang lệnh kế tiếp
Trang 22và ngoài CPU Khối ALU dùng để thực hiện các thao tác khác nhau với các toán hạng của
lệnh Tóm lại, khi CPU hoạt động thì EU sẽ cung cấp thông tin về địa chỉ cho BIU để khối này
đọc lệnh và dữ liệu, còn bản thân nó thì giải mã lệnh và thực thi lệnh
Trong BIU có bộ nhớ đệm lệnh với dung lượng là 4 byte (6 byte với 8086) dùng chứa
các mã lệnh đọc được nằm sẵn ở đó để chờ EU xử lý Đây là một cấu trúc mới được cấy vào bộ
vi xử lý 8086/8088 nhằm tăng tốc độ xử lý theo kiểu xử lý xen kẽ liên tục dòng mã lệnh
(Instruction pipelining)
2.2 Các phương pháp định địa chỉ
Các chế độ địa chỉ chính là phương pháp để xác định toán hạng hoặc kiểu toán hạng
trong các câu lệnh Bộ vi xử lý 8086/8088 có tổng số trên 20 chế độ địa chỉ cho các thành phần
khác nhau như mã lệnh, dữ liệu, ngăn xếp Nhưng trên thực tế, việc lập trình, phân tích lệnh,
người ta chỉ qua tâm đến việc dữ liệu của lệnh được xử lý ra sao Vì vậy, chúng ta cũng chỉ
nghiên cứu về các chế độ địa chỉ dữ liệu của lệnh.Trong bộ vi xử lý 8086 qui định có 7 chế độ
địa chỉ cho toán hạng của lệnh Cụ thể bao gồm các chế độ sau:
- Chế độ địa chỉ thanh ghi
- Chế độ địa chỉ tức thì
- Chế độ địa chỉ trực tiếp
- Chế độ địa chỉ gián tiếp thanh ghi
- Chế độ địa chỉ tương đối cơ sở
- Chế độ địa chỉ tương đối chỉ số
- Chế độ địa chỉ tương đối chỉ số cơ sở
Chế độ địa chỉ thanh ghi
Trong chế độ này việc trao đổi thông tin diễn ra trực tiếp giữa các thanh ghi Toán tử chỉ
hoàn toàn là các thanh ghi Loại địa chỉ thanh ghi không cần truy nhập bộ nhớ nên rất nhanh
Ví dụ: MOV AX, BX ;Sao chép nội dung thanh ghi BX sang thanh ghi AX
MOV AL,CL ; Sao chép nội dung thang ghi CL sang thanh ghi AL
ADD AL, CL ; Cộng nội dung thanh ghi Clvới thanh ghi AL
Chế độ địa chỉ tức thì
Trong chế độ này toán hạng đích là một thanh ghi hoặc ô nhớ, còn toán hạng nguồn là một
hằng số Ta có thể dùng chế độ này để nạp dữ liệu vào bất kỳ thanh ghi nào, trừ thanh ghi đoạn
và thanh ghi cờ
Mã lệnh Tên các thanh ghi
Tập các thanh ghi
Toán hạng
Trang 23Ví dụ: MOV CL, 5Fh; chuyển 5Fh vào thanh ghi CL
MOV AX, 0FF0h; Chuyển 0FF0h vào trong thanh ghi AX MOV DS, AX; Chuyển nội dung thanh ghi AX vào DS
MOV [BX], 10; Chuyển 10 vào ô nhớ tại địa chỉ DS:BXX
Chế độ địa chỉ trực tiếp
Trong chế độ này, một toán hạng chứa địa chỉ lệch của ô nhớ dùng chứa dữ liệu, còn
toán hạng kia chỉ có thể là thanh ghi
Ví dụ: MOV Al, [1053] ; Chuyển nội dung ô nhớ địa chỉ DS:1053h vào AL
MOV [5307h], CX ; Chuyển nội dung CX vào 2 ô nhớ liên tiếp có địa
; chỉ DS:5307h và DS:5308h ADD [5307h], AL ; Cộng nội dung AL vào ô nhớ có địa chỉ DS:5307h
Chế độ địa chỉ gián tiếp thanh ghi
Trong chế độ này, một toán hạng là một thanh ghi được sử dụng để chứa địa chỉ lệch
(Offset) của ô nhớ chứa dữ liệu, còn toán hạng kia chỉ có thể là thanh ghi mà không được là ô
nhớ
Ví dụ: MOV AL, [BX] ; Chuyển nội dung ô nhớ có đ/c DS:BX vào AL
MOV [SI], CL ; Chuyển nội dung CL vào ô nhớ có đ/c DS:SI MOV [DI], AX ; Chuyển nội dung AX vào 2 ô nhớ liên tiếp có
; địa chỉ DS:DI và DS:DI+1
Chế độ địa chỉ tương đối cơ sở (Base Relative Addressing)
Trong chế độ này, các thanh ghi cơ sở BX và BP là các hằng số biểu diễn các giá trị
dịch chuyển (Displacement Values), kết hợp với DS và SS để tính địa chỉ hiệu dụng của toán
Mã lệnh Toán hạng
Bộ nhớ Toán hạng
thanh ghi
Bộ nhớ
Trang 24hạng các vùng nhớ Sự có mặt của các giá trị dịch chuyển xác định tính tương đối (so với cơ
sở) của địa chỉ
Ví dụ 1: MOV CX, [BX]+10 ; Chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ
MOV CX, [BX+10] ; DS:(BX+10) và DS:(BX+11) vào CX MOV CX,10[BX] ;
MOV CL, [BP]+5 ; Chuyển nội dung ô nhớ SS:(BP+5) vào AL Chú ý: Trong các ví dụ trên, các giá trị 10 và 3 được gọi là các giá trị dịch chuyển
- (BX+10) hoặc (BP+5) gọi là địac chỉ hiệu dụng (Effective Address – EA)
- DS:(BX+10) hoặc SS:(BP+5) chính là địa chỉ logic tương ứng với 1 PA
Chế độ địa chỉ tương đối chỉ số (Indexed Relative Addressing)
Trong chế độ này, các thanh ghi chỉ số DI và SI và các hằng số biểu diễn giá trị dịch
chuyển, được dùng để tính địa chỉ của toán hạng trong vùng nhớ DS
Ví dụ: MOV AX,[SI]+10 ; Chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ
; DS:(SI+10) và DS:(SI+11) vào AX MOV AX,[SI+10] ; Tương tự như trên
MOV AL, [DI+5]; chuyển nội dung ô nhớ DS:(DI+5) vào CL
Chế độ địa chỉ tương đối chỉ số cơ sở (Based Indexed Relative)
Là sự kết hợp của 2 chế độ địa chỉ, đó là chế độ địa chỉ tương đối chỉ số và chế độ địa chỉ
tương đối cơ sở Trong chế độ này dùng cả 2 thanh ghi cơ sở và 2 thanh ghi chỉ số để tính địa chỉ
của toán hạng Chế độ này rất phù hợp với việc địa chỉ hoá các mảng 2 chiều
Mã lệnh Địa chỉ thanh ghi
Tập các thanh ghi
DI, SI
Bộ nhớ
Giá trị cụ thể
Trang 25Ví dụ: MOV AX, [BX]+[SI]+8 ;chuyển nội dung 2 ô nhớ liên tiếp có địa chỉ
MOV AX, [BX+SI] + 8 ; DS:(BX+SI+8) và DS:(BX+SI+9) vào AX MOV AX, [BX + SI + 8] ;
MOV CL, [BP][DI]+5 ; chuyển nội dung ô nhớ có địa chỉ
; DS:(BP+DI+5) vào CL Chú ý: Trong các chế độ địa chỉ trên, các thanh ghi đoạn và các thanh ghi lệch được
ngầm định đi kèm với nhau Muốn loại bỏ sự ngầm định đó thì ta có thể viết tường minh địa
chỉ của đoạn
Ví dụ: MOV AL, [BX] ; ngầm định là DS:BX
Muốn bỏ ngầm định là DS ta phải viết
MOV AL, SS:[BX]; chuyển thành SS:BX
Bảng tóm tắt các chế độ địa chỉ
BX,BP
Thanh ghi
Tập các thanh ghi
SI,DI
Trang 26Các cặp thanh ghi đoạn và thanh ghi lệch ngầm định
Cách định địa
chỉ
Mã đối tƣợng
Ví dụ
Từ gợi nhớ Đoạn
truy suất
Hoạt động
Tức thời B80010 MOV AX,1000h Mã AH ← 10h; AL ← 00h
Thanh ghi 89CA MOV DX,CX VXL DX ← CX
Trực tiếp 8A2600
10
MOV AH,[1000h] Dữ liệu AH ← [1000h]
Gián tiếp thanh
ghi
8B04 FF25 FE4600 FF0F
MOV AX,[SI]
JMP [DI]
INC BYTE PTR [BP]
DEC WORD PTR [BX]
Dữ liệu
Dữ liệu Stack
Dữ liệu
AL←[SI]; AH←[SI+1]
IP←[DI+1:DI]
[BP]←[BP]+1 [BX+1:BX]←
(Đọc VXL của Đỗ Xuân Tiến)
Trong tập lệnh của vi xử lý 8088 có rất nhiều lệnh, mỗi lệnh thực hiện một nhiệm vụ cụ
thể nào đó, trong phần tài liệu này ta chỉ nghiên cứu một số lệnh cơ bản Để dễ hiểu, chúng ta
có thể chia chúng ra thành các nhóm lệnh sau:
Trang 271 Nhóm lệnh di chuyển dữ liệu 5 Nhóm lệnh rẽ nhánh
2 Nhóm lệnh số học 6 Nhóm lệnh vào ra cổng
4 Nhóm lệnh dịch chuyển và quay
o Nhóm lệnh di chuyển dữ liệu (MOV, MOVSB, MOVSW XCHG, PUSH, POP )
o Nhóm lệnh số học(ADD, ADC, INC, SUB, SBB, DEC MUL(IMUL), DIV(IDIV )
o Nhóm lệnh logic ( AND, OR, XOR, NOT )
o Nhóm lệnh dịch chuyển và quay (SHL, SHR, ROL, ROR )
o Nhóm lệnh rẽ nhánh
Nhảy có dấu
Kí hiệu
kiện nhảy
Jg/jnl
e
Nhảy nếu lớn hơn
Nhảy nếu không nhỏ hơn hay bằng
Zf=0, sf=o
f
Jge/j
nl
Nhảy nếu lớn hơn hay bằng
Nhảy nếu không nhỏ hơn
Sf=0
f
Jl/jng
e
Nhảy nếu nhỏ hơn
Nhảy nếu không lớn hơn hay bằng
Sf<>
of
Jle/jn
g
Nhảy nêu nhỏ hơn hay bằng
Nhảy nếu không lớn hơn
Zf=1 hay sf=o
f
Nhảy không dấu
Ja/jn
be
Nhảy nếu lớn hơn
Nhảy nếu không nhỏ hơn hay bằng
Cf=0
và zf=0
Jae/j
nb
Nhảy nếu lớn hơn hay bằng
Nhảy nếu không nhỏ hơn
Cf=0
Jb/jn
ae
Nhảy nếu nhỏ hơn
Nhảy nếu không lớn hơn hay bằng
Cf=1
Nhảy điều kiện đơn
Je/jz Nhảy nếu bằng
Nhảy nếu bằng 0
Zf=1
Jne/j
nz
Nhảy nếu không bằng
Nhảy nếu không bằng 0
Zf=0
Trang 28o Nhóm lệnh vào ra cổng( IN , OUT)
o Nhóm lệnh điều khiển(CALL, INT, NOP, HLT )
2.4 Cách mã hóa lệnh của Vi xử lý 8088
Lệnh của bộ vi xử lý được ghi bằng các ký tự dưới dạng gợi nhớ (memonic) để người sử
dụng dễ nhận biết Đối với bộ vi xử lý thì lệnh cho nó sẽ được mã hóa dưới dạng mã nhị phân
0,1và còn gọi là mã máy Vì lệnh cho bộ vi xử lý được cho dưới dạng mã nên sau khi nhận
lệnh thì bộ vi xử lý phải thực hiện giải mã lệnh rồi mới thực hiện lệnh Việc hiểu rõ bản chất
cách ghi lệnh bằng số nhị phân cho bộ vi xử lý sẽ thuận tiện khi ta cần dịch bằng tay (thực ra
trong thực tế thì việc dịch này sẽ được thực hiện bởi trình dịch hợp ngữ )
Đối với bộ vi xử lý 8088 thì một lệnh có thể có độ dài từ 1byte đến 6 byte, nhưng ta sẽ
chỉ lấy ví dụ với trường hợp của lệnh MOV để minh họa cho việc mã hóa lệnh: Trước khi thực
hiện mã hóa cho lệnh MOV đích, gốc thì cần phải biết dạng thức các byte dùng để mã hóa cho
lệnh
Opcode: Mã lệnh
D: Hướng truyền dữ liệu
– D=0: Dữ liệu đi từ thanh ghi quy định bởi 3 bit REG
– D=1: Dữ liệu đi đến thanh ghi quy định bởi 3 bit REG
W: xác định truyền byte(W=0) hay truyền World (W=1)
REG: Chọn thanh ghi sử dụng
MOD và R/M chọn chế độ địa chỉ cho toán hạng của lệnh
Ví dụ: lệnh MOV
Trang 29Bảng REG Xác định thanh ghi cho toán hạng thứ nhất
Bảng MOD và R/M cùng nhau xác định toán hạng thứ hai
W=1
MOD=11 W=0
000 [BX]+[SI] [BX]+[SI]+ADD8 [BX]+[SI]+ADD16 AX AL
001 [BX]+[DI] [BX]+[DI]+ADD8 [BX]+[DI]+ADD16 CX CL
010 [BP]+[SI] [BP]+[SI]+ADD8 [BP]+[SI]+ADD16 DX DL
011 [BP]+[DI] [BP]+[DI]+ADD8 [BP]+[DI]+ADD16 BX BL
Trang 30Vì vậy, việc lập trình với hợp ngữ đòi hỏi người lập trình phải hiểu rõ cấu trúc bên
trong, hoạt động, tập thanh ghi và tập lệnh của bộ vi xử lý
Hình 2.3: Vị trí của hợp ngữ trong các máy tính IBM-PC Liên quan đến việc tạo ra một chương trình hợp ngữ, có một số khái niệm :
Trình hợp dịch (Assembler): là một chương trình chuyển đổi các chương trình mã
nguồn từ hợp ngữ thành ngôn ngữ máy
Trình liên kết (Linker): là một chương trình có khả năng tập hợp các tệp tin đã được hợp
dịch lại thành một tệp tin mã máy
Trình gỡ rối (Debuger): Là một chương trình có khả năng dịch ngược các lệnh của một
chương trình mã máy Nó còn cho phép người lập trình thực hiện sửa lỗi thuật toán cho các
chương trình mã máy
So sánh hợp ngữ với các ngôn ngữ bậc cao
Hợp ngữ là một ngôn ngữ lập trình sử dụng các lệnh của bộ vi xử lý, vì vậy, nó khó hơn
so với các ngôn ngữ lập trình bậc cao Mặt khác, hợp ngữ có thể tác động trực tiếp tới cấu trúc
bộ vi xử lý và các thành phần phần cứng khác mà các ngôn ngữ lập trình khác khó có thể thực
hiện được
Một chương trình viết bằng hợp ngữ thường có kích thước nhỏ hơn một chương trình
viết bằng ngôn ngữ bậc cao có cùng chức năng
Việc dịch và chạy một tệp chương trình nguồn của hợp ngữ cũng phức tạp hơn so với một
chương trình viết bằng ngôn ngữ bậc cao
Việc lập trình bằng hợp ngữ thường khó, nhưng chúng ta cũng sẽ hiểu rõ hơn về việc xử lý của
máy tính và hiểu rõ nguyên tắc của việc lập trình trong các ngôn ngữ bậc cao
Các đoạn trong một chương trình
Một chương trình khi thực hiện, nó sẽ được nạp vào bộ nhớ với 3 đoạn: Đoạn mã,
đoạn ngăn xếp và đoạn dữ liệu Mỗi đoạn này có thể có độ dài tối đa là 64K với địa chỉ đầu
đoạn là 0000h và địa chỉ offset cuối của đoạn là FFFFh
Trong đó:
Phần cứng PC HỢP NGỮ NNL BẬC CAO CÁC CHƯƠNG TRÌNH ỨNG DỤ NG
Trang 31 Đoạn mã được sử dụng để chứa các mã lệnh của chương trình với các mã lệnh nhị phân
Thường người ta sử dụng cặp thanh ghi CS:IP để truy xuất tới các ô nhớ chứa lệnh cần thao
tác
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn mã với việc khai báo vị trí bắt
đầu của đoạn là: CODE
Đoạn dữ liệu: Đoạn này được sử dụng để chứa các dữ liệu của chương trình Mỗi một
biến sử dụng đều được chương trình dịch chuyển thành một địa chỉ ô nhớ nhất định và tại vị trí
của ô nhớ này sẽ chứa nội dung của biến khi thực hiện chương trình
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn dữ liệu với việc khai báo vị trí bắt đầu
của đoạn là: DATA
Đoạn ngăn xếp :Đoạn này được sử dụng để chứa dữ liệu truy xuất theo phương thức
"Vào trước Ra sau - First In Last Out - FILO"
Trong lập trình với hợp ngữ, người ta có thể mô tả đoạn ngăn xếp với việc khai báo
bằng một tên: Stack với độ dài đoạn ngăn xếp Thường thì độ dài tối đa là 256 byte
Các thành phân cơ bản của Assembly
Cấu trúc chung của một lệnh ASSEMBLY
Một lệnh của hợp ngữ dù đơn giản hay phức tạp đều phải có đầy đủ một trong các thành
phần sau:
[Tên] [Mã lệnh] [Các toán hạng] [; chú thích]
Trong đó:
Tên - có thể là tên một chương trình con, một macro, nhãn hoặc một thành phần nào đó
Mã lệnh - Cơ bản trường này chứa mã lệnh dưới dạng mã gợi nhớ Có thể là lệnh thật
hoặc lệnh giả Nếu là lệnh thật thì đây là các lệnh của bộ vi xử lý
Nếu là các lệnh giả thì đây là các dẫn hướng của chương trình dịch Ví dụ PROC, MACRO,
ENDP, ENDM, SEGMENT, ENDS
Các toán hạng - Là các thành phần mà các lệnh sử dụng để thực hiện lệnh
Nếu là các lệnh thật thì đây chính là các toán hạng của lệnh Với bộ vi xử lý 8086/8088,
các toán hạng này có thể là 0,1 hoặc 2
Nếu là các lệnh giả thì đây là các tham số Số lượng tham số tuỳ thuộc vào việc khai
báo các dẫn hướng
Chú thích - là lời giải thích để người sử dụng hiểu rõ hơn về lệnh Lời chú thích phải
được bắt đầu bởi dấu (;) và chúng sẽ không được chương trình dịch xử lý
Ví dụ:
Lap: ADD AL,[BX] ;Cộng giá trị trong thanh ghi AL với ô nhớ có địa chỉ là DS:BX
;Kết quả được đưa vào thanh ghi AL
Với ví dụ trên, thi lap la tên một nhãn và kết thúc bằng dấu (:); ADD là lệnh thực hiện
phép cộng; AL và [BX] là hai toán hạng với qui định nếu tên thanh ghi hoặc một giá trị hằng
nằm trong dấu [ ] thì đó là địa chỉ OFFSET của ô nhớ chứa dữ liệu cần thao tác; các thành
phần sau dấu (;) chỉ là lời chú thích
Trang 32 Khai báo dữ liệu và kiểu dữ liệu
Như chúng ta đã thấy qua hai ví dụ trên, khi khai báo dữ liệu cho chương trình, người
ta thường sử dụng toán tử DB Nhưng trên thực tế, các toán tử khác cũng có thể được dùng đến
để khai báo cho các dữ liệu có kiểu khác nhau
DB - Define Byte - Định nghĩa biến kiểu Byte
DW - Define Word - Định nghĩa biến kiểu Word
DD - Define Double Word - Định nghĩa biến kiểu Double Word
DT - Define Ten Byte - Định nghĩa biến kiểu 10 byte
EQU - Equal (Bằng) - Khai báo một hằng, địa chỉ cổng xác định
Vậy, chúng ta có thể sử dụng các toán tử trên để khai báo cho các biến và hằng ra sao?
Thể hiện các dạng cấu trúc dữ liệu như thế nào?
Biến byte
Biến kiểu byte sẽ chiếm 1 byte trong bộ nhớ Hướng dẫn chương trình dịch để định nghĩa biến
kiểu byte có dạng tổng quát như sau:
Tên BD giá_trị_khởi_tạo
Ví dụ: so1 DB 3Eh
Trong ví dụ trên, so1 là một biến kiểu byte có giá trị khởi tạo là 3Eh Song, đôi khi
chúng ta không cần thiết phải khởi tạo giá trị cho biến, có thể sử dụng cách khai báo sau:
So2 DB ?
Cũng như các ngôn ngữ lập trình khác, một biến kí tự cũng được coi là một biến kiểu
byte với mỗi một kí tự được thể hiện bằng mã ASCII của chúng từ 0 - FFh
Giả sử, muốn khai báo một biến kí tự và khởi tạo giá trị bằng „A‟, ta có thể thực hiện
bằng một trong hai cách sau:
Ch DB „A‟ ;khởi tạo trực tiếp giá trị „A‟, hoặc như sau :
Ch DB 41h ;khởi tạo thông qua mã ASCII của „A‟
Biến word
Để khai báo biến kiểu từ (Word), chúng ta có thể sử dụng cú pháp sau:
Tên DW giá_trị_khởi_tạo
Cũng giống như việc khai báo biến kiểu byte, giá_trị_khởi_tạo có thể là dấu (?) để
không khởi tạo giá trị cho biến
Ví dụ:
1/ w1 DW 3FB4h ;khai báo biến w1 với giá trị khởi tạo là 3FB4h
2/ w2 DW ? ;không khởi tạo giá trị cho biến w2
Biến mảng
Mảng là một danh sách (dãy) các phần tử có cùng một kiểu với các giá trị (có thể) khác
nhau Vì vậy, để khai báo một mảng, chúng ta có thể thực hiện theo cú pháp sau:
Tên DB danh_sách_giá_trị_khởi_tạo ;khai báo mảng các phần tử kiểu byte
Tên DW danh_sách_giá_trị_khởi_tạo ;khai báo mảng các phần tử kiểu word
Ví dụ 1: mang1 DB 30,55,73,88,33
Trang 33Giả thiết, mang1 đƣợc nạp vào bộ nhớ tại địa chỉ offset 23E5h Khi đó, mảng này sẽ có
các phần tử đƣợc khởi tạo và hình ảnh của chúng trong bộ nhớ nhƣ sau:
Tên phần tử Giá trị khởi tạo địa chỉ bộ nhớ
23E5h 23E7h 23E9h 23EBh Chúng ta cũng có thể khởi tạo các giá trị liên tiếp giống nhau Khi đó, ta cũng có thể sử
dụng toán tử DUP Ví dụ:
Mang3 DB 100 DUP(5Ch) ; Mang3 là một mảng có100 phần tử với các giá trị khởi
tạo của các phần tử đều là 5Ch
Mang4 DB 3,4,2,10 DUP(0) ; Mang4 có 13 phần tử với 3 phần tử đầu lần lƣợt là
3,4,2; các phần tử còn lại có giá trị 0
Với mảng hai chiều, việc định nghĩa chúng có thể thực hiện theo cú pháp sau:
Tên DB (DW) giá_trị_khởi_tạo_hàng_1
giá_trị_khởi_tạo_hàng_2
1là 50, hàng 2 là 100, hàng 3 là 150
Biến chuỗi
Trang 34Biến chuỗi hay xâu kí tự thực chất chỉ là một mảng (1 chiều) các phần tử là các kí tự
trong đó mỗi kí tự có thể được biểu diễn bằng một số là mã ASCII hoặc là kí tự nằm trong dấu
' ' hoặc " " Vì vậy, ta có thể khai báo bằng một trong các cách sau:
Xau1 DB 'Chao'
Xau2 DB 'C','h','a','o'
Xau3 DB 43h,68h,61h,6Fh
Chương trình biên dịch Macro
Khung của một chương trình ASSEMBLY
Một chương trình hợp ngữ thể hiện các đoạn dành cho chúng rõ ràng với việc sử dụng
kích thước bộ nhớ phù hợp và cú pháp của các lệnh rõ ràng tuân theo một cú pháp chung, mặc
dù, đó là lệnh thật hoặc lệnh giả Để thể hiện một chương trình đó, người ta đưa ra 2 dạng cấu
trúc Bao gồm:
Cấu trúc chương trình để dịch ra tệp *.EXE
Một chương trình *.EXE thường thể hiện rõ ràng 3 đoạn: mã, dữ liệu, ngăn xếp Sau khi
được biên dịch (Assembled) và liên kết (Linked), chúng có thể được thực thi trực tiếp từ dòng
lệnh của DOS như các chương trình khác Cấu trúc cơ bản của một chương trình dạng này như
;Các chương trình con (nếu có) END Main
Trong cấu trúc trên, tại dòng cuối cùng xuất hiện dẫn hướng chương trình dịch END và
MAIN để kết thúc toàn bộ chương trình Main chính là nơi bắt đầu các lệnh của chương trình
trong đoạn mã
Trang 35Khi một chương trình *.EXE được nạp vào bộ nhớ, DOS sẽ tạo ra một mảng gồm 256
byte cho PSP (Program Segment Prefix - Tiền tố chương trình) PSP được sử dụng để chứa
các thông tin liên quan đến chương trình và đặt ngay vào trước phần chứa mã lệnh của chương
trình
Tại dòng MODEL chúng ta có thể khai báo qui mô sử dụng bộ nhớ phù hợp cho từng
chương trình Có thể là một trong các thành phần sau:
Kiểu kích thước Mô tả
Tiny (Hẹp) mã lệnh và dữ liệu gói gọn trong một đoạn
Small (nhỏ) mã lệnh gói gọn trong một đoạn, dữ liệu nằm
trong một đoạn Medium (Trung bình) mã lệnh không gói gọn trong một đoạn, dữ
liệu nằm trong một đoạn Compact (Gọn) mã lệnh gói gọn trong một đoạn, dữ liệu
không gói gọn trong một đoạn Large (rộng) mã lệnh không gói gọn trong một đoạn,
dữ liệu không gói gọn trong một đoạn, không có mảng nào lớn hơn 64K Huge (Đồ sộ) mã lệnh không gói gọn trong một đoạn,
dữ liệu không gói gọn trong một đoạn, các mảng có thể lớn hơn 64K
Chương trình dịch sẽ dịch tên @data thành các giá trị số của đoạn dữ liệu và đưa các
thông số của dữ liệu vào thanh ghi DS và ES
Để hiểu rõ hơn về cấu trúc chương trình này, chúng ta lấy một ví dụ minh hoạ như sau:
Ví dụ: Viết chương trình hợp ngữ thực hiện in hai chuỗi kí tự trên hai dòng màn hình
title ct MODEL Small STACK 100h DATA
chao DB 'Chao cac ban sinh vien lop DTK2$' hoi DB 'Cac ban co muon hoc mon Vi xu ly khong? $' CODE
main PROC
;Nap du lieu cho DS MOV AX,@DATA MOV DS,AX
;Xoa man hinh bang chuc nang 0 cua ngat 10h
MOV AH,0
Trang 36MOV AL,3 ;che do text 80x25 INT 10h
;In chuoi thu nhat ra man hinh
MOV AH,9 MOV DX,offset chao ;tro toi dia chi offset cua chuoi INT 21h
;Dua con tro xuong dong tiep theo va ve dau dong
MOV AH,2 MOV DL,13 ;xuong dong INT 21h
MOV DL,10 ;ve dau dong INT 21h
;In chuoi thu hai ra man hinh
MOV AH,9 MOV DX,offset hoi INT 21h
;Ket thuc chuong trinh va tro ve DOS
MOV AH,4Ch
INT 21h
main ENDP
END main
Như vậy, ta thấy chương trình trên là một chương trình nhỏ nên sử dụng qui mô bộ nhớ
nhỏ (Small) Kích thước ngăn xếp là 256 byte Dữ liệu cho chương trình có hai chuỗi là chao
và hoi Các chuỗi này đều được khai báo với toán tử DB
Đặc biệt, các lệnh hoặc nhóm lệnh của chương trình trên có giải thích để người đọc và
chính bản thân người lập trình (khi đọc lại) cũng sẽ dễ hiểu hơn
Cấu trúc chương trình để dịch ra tệp *.COM
Một chương trình *.COM thường có đặc điểm khác biệt với các chương trình *.EXE là
chúng chỉ có thể sử dụng một đoạn duy nhất của bộ nhớ để chứa mã, dữ liệu và ngăn xếp Vì
vậy, qui mô sử dụng bộ nhớ của các chương trình dạng này thường là Tiny
Cấu trúc cơ bản của dạng chương trình này như sau:
Title Cautruc_COM
.Model Tiny Code org 100h
Start: JMP Continue
;Dinh nghia cac bien, hang
Continue:
Trang 37Với dạng cấu trúc này, khi dịch chương trình, chương trình dịch sẽ đưa ra thông báo
"No Stack Segment"
Trong cấu trúc trên, ta thấy, ở ngay đầu chương trình đoạn mã là lệnh giả ORG (Origin:
điểm xuất phát) và lệnh JMP (nhảy) Lệnh giả ORG 100h dùng để gán địa chỉ bắt đầu cho
chương trình tại địa chỉ 100h (256) trong đoạn mã, chừa lại đoạn bộ nhớ 256byte cho PSP
Lệnh JMP sau nhãn START dùng để nhảy qua phần bộ nhớ dành cho việc định nghĩa và
khai báo dữ liệu Đích của lệnh nhảy là phần đầu của chương trình chính
Hình ảnh của chương trình được thể hiện trong bộ nhớ được thể hiện như trong hình vẽ sau:
Địa chỉ lệch 0000h Đoạn đầu chương trình (PSP)
(Chiều tiến của ngăn xếp) SP
Như vậy, một chương trình *.COM có một số hạn chế sau:
- Dung lượng cực đại của chương trình chỉ giới hạn trong một đoạn 64K
- Chương trình chỉ được phép sử dụng ngăn xếp với kích thước nhỏ Nếu không, nó sẽ
chiếm nhiều phần trong đoạn mã lệnh
Chương trình *.COM thường được kết thúc bởi lệnh INT 20h
Sau đây chúng ta xét một ví dụ để hiểu rõ hơn về việc sử dụng cấu trúc trên trong lập
trình hợp ngữ
Chương trình được viết như sau:
Title Cautruc_COM Model Tiny
Trang 38.Code Org 100h Start: JMP Continue
chao DB 'Chao cac ban sinh vien lop TK1$' hoi DB 'Cac ban co muon hoc mon Vi xu ly khong? $' Continue: Main PROC
;Xoa man hinh bang chuc nang 0 cua ngat 10h MOV AH,0
MOV AL,3 ;che do text 80x25 INT 10h
;In chuoi thu nhat ra man hinh
MOV AH,9 MOV DX,offset chao ;tro toi dia chi offset cua chuoi INT 21h
;Dua con tro xuong dong tiep theo va ve dau dong
MOV AH,2 MOV DL,13 ;xuong dong INT 21h
MOV DL,10 ;ve dau dong INT 21h
;In chuoi thu hai ra man hinh
MOV AH,9 MOV DX,offset hoi INT 21h
INT 20h Main ENDP End Start Chúng ta có thể nhận xét rằng một chương trình *.COM không cần phải nạp dữ liệu vào
DS vì chương trình dạng này có mã, dữ liệu và ngăn xếp trong cùng một đoạn
Cách tạo và chạy một chương trình hợp ngữ
Một chương trình viết bằng ngôn ngữ bậc cao có thể chạy trực tiếp trong môi trường
của chúng Song, với ngôn ngữ lập trình bậc thấp (hợp ngữ) thì việc chạy chương trình cần
phải thông qua việc hợp dịch (Assembled), liên kết (Linked) Người ta đã đưa ra các bước để
soạn thảo, dịch và chạy chương trình như sau:
Bước 1: Soạn thảo văn bản chương trình Trong bước này, ta có thể thực hiện bằng một trình soạn thảo văn bản bất kỳ nào như EDIT,
NCEDIT, TURBO PASCAL, C, NOTEPAD, hoặc WINWORD nhưng, cần phải ghi lại với
phần mở rộng là *.ASM
Trang 39Soạn thảo văn bản chương trình Dịch ra các tệp OBJ bằng MASM
Liên kết các tệp OBJ thành tệp EXE
Bước 2: Hợp dịch chương trình nguồn ra các tệp đối tượng *.OBJ
Trong bước này, ta có thể sử dụng trình MASM (MicroSoft Assembler) hoặc TASM (Turbo
Assembler) theo cú pháp sau:
MASM tên_tệp[.phần_mở_rộng]
Hoặc: TASM tên_tệp[.phần_mở_rộng]
Sau khi dịch, nếu có lỗi cú pháp, máy sẽ báo dòng gây lỗi và mã lỗi Khi đó ta có thể quay lại
bước 1 để sửa tệp nguồn và dịch lại cho đến khi không có lỗi
Bước 3: Liên kết các tệp đối tượng thành tệp chương trình *.EXE
Có thể sử dụng trình liên kết LINK hoặc TLINK (Turbo) theo cú pháp sau:
LINK tệp_đt1[+tệp_đt2+ +tệp_đtn]
Hoặc: TLINK tệp_đt1[+tệp_đt2+ +tệp_đtn]
Bước 4: Nếu chương trình viết dưới dạng cấu trúc *.COM thì thực hiện dịch sang dạng
*.COM bằng cú pháp sau:
EXE2BIN tên_tệp_exe tên_tệp_com.COM
Nếu tệp viết để dịch ra chương trình *.EXE thì bỏ qua bước này
Bước 5: Chạy tệp chương trình vừa dịch
Tên_tệp_chương_trình
Với các bước thực hiện như trên, chúng ta có thể mô phỏng bằng lưu đồ sau:
Ví dụ: Soạn thảo một chương trình đơn giản, sau đó dịch và chạy chương trình này
Trang 40Bước 1: Soạn thảo văn bản chương trình
Bước 2: Dịch ra tệp OBJ
Nếu có lỗi như hình trên, quay lại bước 1 Cứ như vậy cho đến khi không còn lỗi