CHƯƠNG I : Hệ thống số và quá trình mã hóa thông tin trong máy tính 1.1 Các hệ thống số dùng trong máy tính 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 Chin 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. Ví dụ:
Trang 1CHƯƠNG I : Hệ thống số và quá trình mã hóa thông tin trong máy tính 1.1 Các hệ thống số dùng trong máy tính
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ềutrong 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 Chin trăm Bảy mươi Tám được biểu diễn như sau
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ítdấ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ânnhư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 2Ví dụ: (0011), (0100), (0101), (0110), …(1001) ; đây gọi là số BCD không nén
Ví dụ: (00110100), (01010110), … (01111000) ; đây gọi là số BCD nén
Dưới đây là bảng các mã BCD
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 toán số học đối với hệ nhị phân.
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
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)
111014
01106
1101
01
13
01015
1100
00
12
01004
1011
11
11
00113
1010
10
10
00102
1001
01
90001
1
1000
00
80000
Trang 3Khi 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
Khi 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ậpphâ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épchia đối với số thập phân, như vậy ta có M = A/B = 00100101b dư 0010b
1.3 Quan hệ giữa các loại mã dùng trao đổi thông tin
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ậpphâ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ủatí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ết
ta 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 đó thaythế 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 ứngvới nó và ta sẽ thu được kết quả như sau:
1100 1010 1111 1110 hay 1100101011111110b = CAFEh
C A F E
2 F 8
0010 1111 1000 hay 2F8h = 001011111000b
Chia 2 Thương số Dư số
Trang 4 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 tincủ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 5BẢNG MÃ ASSII mở rộng
Trang 6CHƯƠNG II : Kiến trúc của hệ Vi xử lý
2.1 Giới thiệu chung
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 đượcphá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…
2.2 Sơ đồ khối và cấu trúc bên trong của bộ Vi xử lý
2.2.1 Sơ đồ khối tổng quát của hệ Vi xử lý
Sơ đồ khối :
Chức năng các khối :
I/O
ROMCPU
U
Data
Bu s
Trang 7Bộ 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 để choCPU 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
2.2.2 Tổ chức các kênh thông tin trong hệ Vi xử lý
Trê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ý.
2.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
Kiến trúc Harvard
Memory
CPU
Program Address Bus
Address Bus Fetch Bus
0
0
CPU
Address Bus Data Bus
Memory
0
Program Memory
Data Memory
Kiến trúc
Hình 2.2 Cấu trúc các kênh thông tin trong hệ VXL
Trang 8thà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ângọ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ỗiloạ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
- IR (Instruction Register):Thanh ghi lệnh IR (Instruction Register) Thanh ghi lệnhthự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ựchiện lệnh
- Address Bus : Bus địa chỉ
- Data Bus : Bus dữ liệu
Trang 9- Control Bus : Bus điều khiển
2.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:
Đị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ề thanhghi 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 khaithự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 CPUtiế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,#3EHNế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,R1Toán hạng nằm trong bộ nhớ mà địa chỉ của nó trong 1 thanh ghi của CPU CPU đưa địachỉ cho thanh ghi địa chỉ (MAR) để đọc dữ liệu và thực hiện lệnh VD : ADD A,@R0
2.5 Tổ chức bộ nhớ của hệ Vi xử lý
CPU
n PC
opcode IR
RAM
opcode
Read Clock Control Bus
Address Bus
Data Bus
n+2n+1nn-1
Hình 2.4 : Hoạt động của Bus cho chu kỳ tìm nạp lệnh
Trang 10Bộ 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ácthanh 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.
2.5.1 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ươngtrì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óicá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ảngtra 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ácnhau: 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 trongEPROM 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)
EEPROM (Electrical EPROM ROM có khả năng lập trình và xoá được bằng điện).
2.5.2 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ồncung 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à đôikhi 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 11CHƯƠNG III : Bộ vi xử lý 8086/8088 của Intel
3.1 Khái quát phần cứng của bộ Vi xủ lý 8086/8088
3.1.1 Sơ đồ khối tổng quát của bộ Vi xử lý 8088
ALU
Thanh ghi cờ
Khối điều khiẻn của 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
data Bus
(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
Trang 12BIU: Đơ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
Trang 13– 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
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ựchiệ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)
3.1.2 Sơ đồ chân tín hiệu của Vi xử lý 8088
KHOA ĐIỆN – ĐIỆN TỬ - ĐHSPKT-HY_10/2006 Trang 13
Trang 14 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
về chu kỳ bus
Trang 15 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ởiCPU
INTR (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
Chân S2, S1, S0 dùng cho bộ điều khiển bus 8288 để tạo ra các tín hiệu điều khiển cho
bus hệ thống Các tín hiệu này có trở kháng cao khi bus treo
Trang 16LOCK (29) cấm không cho VXL hợp tác điều khiển bus.
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.
3.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ẽ đượcthự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 thanhghi Đó 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áchriêng biệt, sử dụng từng 8 bit một cách riêng rẽ Ví dụ:
Byte 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 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ắnnhấ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)
Trang 17Khố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
Trong 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ấtcủ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êmvà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 trongmá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
Trang 18E 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ờ
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):
3.2 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ốighé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ácbus đó 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ệutruyề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ăngphố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ộ
Thực ra 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 19nhớ 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ớibus.
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ôngtin đâù 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 xungkhá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
và 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ủalệ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ứacá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)
3.3 Các chế độ đị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ạngtrong 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ầnkhá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
các thanh ghi
Toán hạng
Trang 20 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ộthằ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ờ
Ví dụ: MOV CL, 5Fh; chuyển 5Fh vào thanh ghi CL
MOV AX, 0FF0h; Chuyển 0FF0h vào trong thanh ghi AXMOV 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òntoá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:5308hADD [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:SIMOV [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
Bộ nhớ Toán hạng
ghi
Bộ nhớ
Trang 21 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ánhạ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 CXMOV 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ịchchuyể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 AXMOV 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)
Tập các thanh ghi
DI, SI
Bộ nhớ
Giá trị cụ thể
Trang 22Là 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.
Ví 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 AXMOV 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 địachỉ 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ỉ
[BP] + Disp
DSSS
[SI] + Disp
DSSS
[BX] + [DI] + Disp[BX] + [SI] + Disp[BP] + [DI] + Disp[BP] + [SI] + Disp
DSDSSSSS
Các cặp thanh ghi đoạn và thanh ghi lệch ngầm định
Bộ nhớ
Giá trị cụ thể
Tập các thanh ghi BX,BP
Thanh ghi
Tập các thanh ghi SI,DI
Trang 23Thanh ghi đoạn CS DS ES SS
Cách định địa chỉ Mã đối tượng
Ví dụ
Từ gợi nhớ Đoạn truy
suất
Hoạt động
Gián tiếp thanh ghi 8B04
FF25 FE4600 FF0F
Dữ liệu
AL←[SI]; AH←[SI+1]
IP←[DI+1:DI]
[BP]←[BP]+1 [BX+1:BX]← [BX+1:BX]-1
Đố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
Trang 24– 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
Bảng REG Xác định thanh ghi cho toán hạng thứ nhất
Trang 25DI
000 001 010 011 100 101 110
111
AL CL DL BL AH CH DH
BH
00 01 10
11
ES CS SS
DS
Bảng MOD và R/M cùng nhau xác định toán hạng thứ hai
R/M MOD=00 MOD=01 MOD=10 MOD=11
W=1
MOD=11 W=0
Một số ví dụ về mã hóa lệnh:
Trang 26CHƯƠNG IV : Lập trình hợp ngữ cho hệ Vi xử lý
4.1 Tổng quan về ngôn ngữ lập trình Assembly
Khái niệm:
Hợp ngữ là một ngôn ngữ bậc thấp, sử dụng tập lệnh của bộ vi xử lý và có thể tác động trực tiếp đến các thành phần bên trong của bộ vi xử lý Mỗi một lệnh của hợp ngữ có quan hệ một - một với một lệnh mã máy
Vì 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 4.1: 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ợpdị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ộtchươ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ácchươ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
Phần cứng PC
HỢP NGỮ NNLT BẬC CAO CÁC CHƯƠNG TRÌNH
CÁC CHƯƠNG TRÌNH ỨNG DỤNG
Trang 27bộ 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ựchiệ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ìnhviế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ộtchươ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ủamá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 đó:
Đ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 thaotá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ộtbiế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 đầucủ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áobằ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
4.2 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ànhphầ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.
Trang 28Nế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 khaibá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ệnphé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ằngnằ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ànhphần sau dấu (;) chỉ là lời chú thích
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?
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
Trang 29Để 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ácnhau 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
3055738833
23E5h23E6h23E7h23E8h23E9h
2BA3h2748h9843h1F3Bh
23E5h23E7h23E9h23EBhChú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ởitạ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
Trang 30 Biến chuỗi
Biế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
4.3 Chương trình biên dịch Macro
4.3.1 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ụngkí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ấutrúc Bao gồm:
4.3.2 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ònglệ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ưsau:
TITLE ten_chuong_trinh
.MODEL <Qui mô sử dụng bộ nhớ>
.STACK <Kích thước ngăn xếp>
Trang 31;Các lệnh của chương trình chính
;Trở về DOS bằng việc sử dụng chức năng 4Ch của ngắt 21hMOV AH,4Ch
INT 21hMain ENDP
;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ìnhtrong đoạn mã
Khi 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 256byte cho PSP (Program Segment Prefix - Tiền tố chương trình) PSP được sử dụng để chứa cácthô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ươngtrì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ừngchươ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ạnMedium (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ạnCompact (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ạnLarge (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 64KHuge (Đồ 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ácthô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
Trang 32chao 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
;Dua con tro xuong dong tiep theo va ve dau dong
MOV AH,2MOV DL,13 ;xuong dongINT 21h
MOV DL,10 ;ve dau dongINT 21h
;In chuoi thu hai ra man hinh
MOV AH,9MOV DX,offset hoiINT 21h
;Ket thuc chuong trinh va tro ve DOS
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
4.3.3 Cấu trúc chương trình để dịch ra tệp *.COM.
Trang 33Mộ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
Vớ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 chochươ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:
Trang 34Như 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ậptrình hợp ngữ
Chương trình được viết như sau:
Title Cautruc_COM.Model Tiny
.Code Org 100hStart: 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 80x25INT 10h
;In chuoi thu nhat ra man hinh
MOV AH,9MOV DX,offset chao ;tro toi dia chi offset cua chuoiINT 21h
;Dua con tro xuong dong tiep theo va ve dau dong
MOV AH,2MOV DL,13 ;xuong dongINT 21h
MOV DL,10 ;ve dau dongINT 21h
;In chuoi thu hai ra man hinh
MOV AH,9MOV DX,offset hoiINT 21h
INT 20hMain ENDP End Start
Trang 35Soạ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
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
4.3.4 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ườngcủ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ầnphả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ớiphần mở rộng là *.ASM
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 (TurboAssembler) 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ạibướ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:
bỏ qua bước này
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ỏngbằng lưu đồ sau:
Trang 36Ví 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àyBước 1: Soạn thảo văn bản chương trình
Bước 2: Dịch ra tệp OBJ
Trang 37Nế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
*.OBJ thành tệp chương trình
Bước 4: Vì tệp chương trình có cấu trúc *.EXE, nên ta có thể bỏ qua bước này
Bước 5: Chạy tệp chương trình
Vidu_exe
4.4 Tập lệnh của Vi xử lý 8086/8088_(Đọ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
Trang 384.4.1 Nhóm lệnh di chuyển dữ liệu ( MOV, MOVSB, MOVSW XCHG, PUSH, POP )
4.4.2 Nhóm lệnh số học( ADD, ADC, INC, SUB, SBB, DEC MUL(IMUL), DIV(IDIV )
4.4.3 Nhóm lệnh logic ( AND, OR, XOR, NOT )
4.4.4 Nhóm lệnh dịch chuyển và quay (SHL, SHR, ROL, ROR )
4.4.5 Nhóm lệnh rẽ nhánh
Nhảy có dấu
Jg/jnle Nhảy nếu lớn hơn
Nhảy nếu không nhỏ hơn hay bằng
Zf=0, sf=of Jge/jnl Nhảy nếu lớn hơn hay bằng
Nhảy nếu không nhỏ hơn
Sf=0f Jl/jnge Nhảy nếu nhỏ hơn
Nhảy nếu không lớn hơn hay bằng
Sf<>of Jle/jng Nhảy nêu nhỏ hơn hay bằng
Nhảy nếu không lớn hơn
Zf=1 hay sf=of Nhảy không dấu
Ja/jnbe 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/jnb Nhảy nếu lớn hơn hay bằng
Nhảy nếu không nhỏ hơn
Cf=0 Jb/jnae 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/jnz Nhảy nếu không bằng
Nhảy nếu không bằng 0
Zf=0
4.4.6 Nhóm lệnh vào ra cổng( IN , OUT)
4.4.7 Nhóm lệnh điều khiển(CALL, INT, NOP, HLT )
(Giáo trình VXL của Thầy đỗ Xuân Tiến)
(Giáo trình VXL của Thầy đỗ Xuân Tiến)
7.1 Giới thiệu chung về các bộ Vi điều khiển.
Vi điều khiển (VĐK) là một “hệ” Vi xử lý (VXL) được tổ chức trong một chip, nó baogồm:
- Bộ VXL (CPU)
- Bộ nhớ chương trình (ROM/EPROM/EEPROM/FLASH)
- Bộ nhớ dữ liệu (RAM)
- Các thanh ghi chức năng, các cổng I/O, cơ chế điều khiển ngắt và truyền tin nối tiếp
- Các bộ thời gian dùng trong lĩnh vực chia tần và tạo thời gian thực
-
Bộ VĐK có thể được lập trình để điều khiển các thiết bị thông tin, viễn thông, thiết bị
đo lường, thiết bị điều chỉnh cũng như các ứng dụng trong công nghệ thông tin và kỹ thuậtđiều khiển tự động Có thể xem bộ VĐK như một hệ VXL On-chip, đối với AT89C51, nó cóđầy đủ chức năng của một hệ VXL 8 bit, đựoc điều khiển bởi một hệ lệnh, có số lệnh đủ mạnh,cho phép lập trình bằng hợp ngữ (Assembly)
7.2 Sự khác nhau giữa bộ Vi xử lý và bộ Vi điều khiển.
Trang 39Tiêu chí SS VXL VĐK
Phần cứng CPU đơn chíp
CPU, RAM, ROM, Timers, SFR, mạchgiao tiếp, hệ thống ngắt và cơ chế điềukhiển ngắt…
Tập lệnh
Sử dụng các tập lệnh bao quát, mạnh về kiểu định địa chỉ Các lệnh này có thể truy xuất dữ liệu lớn, thực hiện ở dạng 1/2 Byte, Byte, Word, Double Word
Sử dụng các lệnh điều khiển xuất nhập,
có thể truy xuất dữ liệu ở dạng Bit hoặc Byte Các nhóm lệnh chính:
Chuyển dữ liệu, điều khiển biến logic,
Trang 40Bộ VĐK 8 bit AT89C51 hoạt động ở tần số 12 MHz, với bộ nhớ ROM 4Kbyte, bộ nhớRAM 128 Byte cư trú bên trong và có thể mở rộng bộ nhớ ra ngoài Ở bộ VĐK này còn có 4cổng 8 bit (P0…P3) vào/ ra 2 chiều để giao tiếp với thiết bị ngoại vi Ngoài ra, nó còn có:
- CPU
- 2 bộ đinh thời 16 bit (Timer 0 và Timer 1)
- Mạch giao tiếp nối tiếp
- Bộ xử lý bit (thao tác trên các bit riêng rẽ)
- Hệ thống điều khiển và xử lý ngắt
- Các kênh điều khiển/ dữ liệu/ địa chỉ
- Các thanh ghi chức năng đặc biệt (SFR)
Tuy nhiên, tuỳ thuộc vào từng họ VĐK của từng hãng sản xuất khác nhau mà tính năngcũng như phạm vi ứng dụng của mỗi bộ VĐK là khác nhau, và chúng được thể hiện trong cácbảng thống kê sau:
(bytes)
RAM (bytes)
Tốc độ (MHz)
Chân I/O
128 Bytes RAM
Timer 1 Timer 0
TxD RxD
Counter Inputs
Hình 7.1 Sơ đồ khối họ VĐK AT89C51
/WR /RD