1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng kỹ thuật vi xử lý

124 42 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 124
Dung lượng 3,29 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

KHOA Đ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 2

CHƯƠ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 3

Ví 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 4

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ậ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 6

BẢNG MÃ ASSII mở rộng

Trang 7

1.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 8

1.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 9

1.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 10

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ý

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 14

CHƯƠ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 15

BIU: Đơ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 18

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

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 19

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 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 20

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ấ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 21

CF (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 22

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ủ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 23

Ví 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 24

hạ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 25

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 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 26

Cá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 27

1 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 28

o 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 29

Bả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 30

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 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 33

Giả 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 34

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

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 35

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 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 36

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

;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 37

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 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 39

Soạ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 40

Bướ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

Ngày đăng: 24/10/2017, 13:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w