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

BÀI GIẢNG VẬT LIỆU XÂY DỰNG (THẦY LINH)

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

8/29/2011

1

CÁC NỘI DUNG CHÍNH
1.
2.
3.
4.
5.
6.
7.

CẤU TRÚC VI XỬ LÝ 8086/8088
MÔ TẢ TẬP LỆNH CỦA BỘ VI XỬ LÝ 8086/88
CÁCH MÃ HOÁ LỆNH
CÁC CHẾ ĐỘ ĐIA CHỈ
HỆ THỐNG NGẮT
LẬP TRÌNH HỢP NGỮ
GHÉP NỐI VÀ VÀO/RA DỮ LIỆU

2

1


8/29/2011

I. Giới thiệu cấu trúc bên trong và hoạt động của bộ vi xử lý
8086/88.


1. Cấu trúc VXL Intel 8086/88

3

Khối thực thi EU
• Khối điều khiển (Control System - CS): có mạch giải
mã lệnh. Mã lệnh đọc vào từ bộ nhớ đưa đến đầu
của bộ giải mã, các thông tin thu được từ đầu ra củc
nó sẽ được đưa đến mạch tạo xung điều khiển, kết
quả là thu được các dãy xung khác nhau (tùy theo
mã lệnh) để điều khiển hoạt động của các bộ phận
bên trong và bên ngoài CPU.
• Khối logic và số học (Arithmetic and Logic Unit ALU):
dùng để thực hiện các thao tác khác nhau với các
toán hạng cuả lệnh.

4

2


8/29/2011

Khối phối ghép bus BIU
• Khối BIU có nhiệm vụ đưa ra điạ chỉ, đọc mã lệnh từ
bộ nhớ. Nói cách khác BIU chiu trách nhiệm đưa điạ
chỉ ra bus và trao đổi dữ liệu với bus.
• Trong BIU còn có bộ nhớ đệm lệnh với dung lượng 4
byte dùng để đưa các mã lệnh đọc được nằm sẵn
sàng chờ EU xử lý (bộ lệnh này còn được gọi là hàng

đợi lệnh )
• Tóm lại: khi CPU hoạt động EU sẽ cung cấp thông tin
về điạ 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 hiện lệnh

5

2. Hoạt động


Khi CPU 8088 hoạt động, EU sẽ cung cấp các thông tin về địa chỉ cho BIU
đọc lệnh và dữ liệu đưa về giải mã lệnh và thực hiện lệnh. Khối EU gồm
các bộ tính toán số học ALU (Arithmetical Logical Unit), bộ điều khiển CS
(Control System) và các thanh ghi (Register). Tại CU có mạch giải mã lệnh
sẽ nhận mã lệnh đọc vào từ bộ nhớ, xử lý và đưa ra mạch tạo xung điều
khiển. Tuz theo mã lệnh ta sẽ thu được các dãy xung khác nhau để điều
khiển các hoạt động khác nhau bên trong và bên ngoài của CPU. Khối ALU
có nhiệm vụ 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 EU duy trì trạng thái của CPU, kiểm soát các thanh ghi đa năng và
toán hạng lệnh, tất cả các thanh ghi và đường truyền dữ liệu trong EU có
dung lượng 16 bit.
Bộ vi xử lý thực hiện các lệnh theo các bước sau:
- Lấy lệnh từ bộ nhớ.
- Đọc toán hạng (nếu lệnh yêu cầu).
- Thực hiện lệnh.
- Ghi kết quả.
6

3



8/29/2011

3. Các thanh ghi

7

Các thanh ghi đa năng (chung)







Trong khối EU có bốn thanh ghi đa năng 16 bit AX, BX, CX, DX. Mỗi thanh ghi
có thể tách ra thành hai thanh ghi 8 bit cao và thấp để làm việc độc lập, đó
là các tập thanh ghi AH và AL, BH và BL, CH và CL, DH và DL ( trong đó H chỉ
phần cao, L chỉ phần thấp ). Mỗi thanh ghi có thể dùng một cách vạn năng
để chứa các tập dữ liệu khác nhau nhưng cũng có công việc đặc biệt nhất
định chỉ thao tác với một vài thanh ghi nào đó và chính vì vậy các thanh ghi
thường được gán cho những cái tên đặc biệt rất có ý nghĩa.
AX ( accumulator, acc ): thanh chứa. Các kết qủa của các thao tác thường
được chứa ở đây ( kết quả của phép nhân, chia ). Nếu kết quả là 8 bit thì
thanh ghi AL được coi là acc.
BX ( base ): thanh ghi cơ sở thường chứa địa chỉ cơ sở của một bảng dùng
trong lệnh XLAT.
CX ( count ): bộ đếm. CX thường được dùng để chứa số lần lặp trong trường
hợp các lệnh LOOP ( lặp ), còn CL thường cho ta số lần dịch hoặc quay trong
các lệnh dịch hoặc quay thanh ghi.

DX ( data ): thanh ghi dữ liệu DX cùng BX tham gia các thao tác của phép
nhân hoặc chia các số 16 bit. DX thường 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.
8

4


8/29/2011

Các thanh ghi đoạn






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 vùng (các đoạn) và chúng được gọi là
các thanh ghi đoạn (Segment Registers). Đó là:
Thanh ghi đoạn mã CS(Code-Segment)
Thanh ghi đoạn dữ liệu DS(Data Segment).
Thanh ghi đoạn ngăn xếp SS(Stack Segment)
Thanh ghi đoạn dữ liệu phụ ES(Extra Segment).
Các thanh ghi đoạn 16 bit này chỉ ra địa chỉ đầu của bốn đoạn
trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ này là
64 Kbyte.

9


Các thanh ghi đoạn(tt)
• Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô
nhớ nằm ở đầu đoạn. Địa chỉ này còn gọi là địa chỉ cơ
sở. Địa chỉ của các ô nhớ khác nằm trong đoạn tính
được 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), gọi như thế
vì nó ứng với khoảng lệch của toạ độ một ô nhớ cụ
thể nào đó so với ô đầu đoạn. Độ lệch này được xác
định bởi các thanh ghi 16 bit khác đóng vai trò thanh
ghi lệch (Offset register) đó là các thanh ghi con trỏ
và chỉ số.

10

5


8/29/2011

Segment:






Segment là một đoạn bộ nhớ có kích thước tối đa
64KB (16 bit offset) và có thể bắt đầu tại các địa chỉ
chia chẵn cho 16 (10h) trên toàn bộ vùng nhớ 1MB
(20 bit).

Trong hầu hết các tác vụ của bộ xử lý 8088,
segment được xác định gián tiếp qua các thanh ghi
segment DS , ES , SS , CS . Khi cần sử dụng segment
nào , phải gán giá trị tương ứng cho các thanh ghi
segment . Lúc đó các địa chỉ được thể hiện thành
dạng Segment:offset
Thí dụ: CS:Offset , DS:Offset

11

Địa chỉ logic và địa chỉ vật lý



Để xác định địa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kz. CPU 8088 phải dùng đến 2 thanh ghi 16
bit ( một thanh ghi để chứa địa chỉ cơ sở, còn thanh kia chứa độ lệch ) và từ nội dung của cặp thanh ghi đó tạo ra địa
chỉ vật lý theo công thức sau:



Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất để tạo ra một loại địa chỉ gọi là địa chỉ logic và được ký
hiệu như sau:



Địa chỉ kiểu ‘‘segment : offset’’ là logic vì nó tồn tại dưới dạng giá trị của các thanh ghi cụ thể bên trong CPU và khi cần
thiết truy cập ô nhớ nào đó thì nó phải được đổi ra địa chỉ vật lý để rồi được đưa lên bus địa chỉ. Việc chuyển đổi này
12
do một bộ tạo địa chỉ thực hiện.


Địachỉvậtlý=Thanhghiđoanx16 (16D=10H)+Thanhghilệch

Thanhghiđoạn: Thanhghilệch hay segment: offset

6


8/29/2011

Offset:








Offset là một cự ly (16 bit) so với điểm đầu của một
segment.
Các cách mô tả offset:
[Const] , [BX] , [BP] , [SI] , [DI]
[BX+Const],[BP+Const],[SI+Const], DI+Const]
[BX+SI+Const],[BX+DI+Const],
[BP+SI+Const] ,
[BP+DI+Const]
Const là một hằng số
* Nhận xét: Offset có thể mô tả bằng một tổng của :
Hằng số 16 bit và các thanh ghi chỉ mục BX, BP, SI, DI
. Trong đó các cặp BX và BP , SI và DI không được

phép cùng xuất hiện
13

Các thanh ghi con trỏ và chỉ số
• Trong 8088 còn có ba thanh ghi con trỏ và hai thanh
ghi chỉ số 16 bit. Các thanh ghi này ( trừ IP ) đều có
thể được dùng như các thanh ghi đa năng, 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.
• Ví dụ: cặp CS:IP sẽ chỉ ra địa chỉ của lệnh sắp thực
hiện trong đoạn mã. Tại một thời điểm nào đó ta có
CS = F000H và IP = FFF0H thì
CS:IP ~ FOOOHx10H + FFFOH = FOOOOH + FFFOH = FFFFOH
14

7


8/29/2011

Nhóm thanh ghi chỉ mục và con trỏ (Index & Pointer
registers): SI,DI,BP,SP



Có thể sử dụng như các thanh ghi đa dụng,
ngoài ra còn đóng vai trò làm chỉ mục khi xác
dịnh địa chỉ theo offset của bộ xử lý:
– SI và DI là hai thanh ghi chỉ mục để thực hiện các

tác vụ chuỗi
– BP và SP là hai thanh ghi con trỏ để thao tác
trên cấu trúc STACK

15

Các thanh ghi con trỏ và chỉ số(tt)










IP ( Instruction pointer ): con trỏ lệnh. IP luôn trỏ vào lệnh tiếp theo sẽ được thực
hiện nằm trong đoạn mã CS. Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và
được xác định theo cách đã nói ở trên.
BP ( base pointer ): con trỏ cơ sở. BP luôn trỏ vào một dữ liệu nằm trong đoạn
ngăn xếp SS. Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng với SS:BP và
được xác định theo cách đã nói ở trên.
SP ( stack pointer ): con trỏ ngăn xếp. SP luôn trỏ vào đỉnh hiện thời của ngăn xếp
nằm trong đoạn ngăn xếp SS. Địa chỉ đỉnh ngăn xếp ứng với SS:SP và được xác định
theo cách đã nói ở trên.
SI ( source index ): chỉ số gốc hay nguồn. SI chỉ vào dữ liệu trong đoạn dữ liệu DS
mà địa chỉ cụ thể đầy đủ ứng với DS:SI và được xác định theo cách đã nói ở trên.
DI ( destination index ): chỉ số đích. DI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa
chỉ cụ thể đầy đủ ứng với DS:DI và được xác định theo cách đã nói ở trên.

Riêng trong các lệnh thao tác với dữ liệu kiểu chuổi thì cặp ES:DI luôn ứng với địa
chỉ của phần tử thuộc chuỗi đích còn cặp DS:SI ứng với địa chỉ của phần tử thuộc
chuỗi gốc.
16

8


8/29/2011

Thanh ghi cờ FR ( Flag Register )
• Đây là thanh ghi khá đặc biệt trong CPU, mỗi
bit của nó được dùng để phản ánh một trạng
thái nhất định của kết quả phép toán do ALU
thực hiện hoặc một trạng thái hoạt động của
EU. Dựa vào các cờ này người lập trình có thể
có các lệnh thích hợp tiếp theo cho bộ vi xử lý
(các lệnh nhảy có điều kiện). Thanh ghi cờ
gồm 16 bit nhưng người ta chỉ dùng hết 9 bit
của nó để làm các bit cờ.
17

Thanh ghi cờ FR (Flag Register)(tt)
• 6 bit cờ trạng thái: AF,CF,SF,PF,ZF,OF.
• AF ( auxilialyry carry flag )
• CF ( carry flag )
• SF ( sign flag )
• PF ( parity flag )
• ZF ( zero flag )
• OF ( over flow flag )

• 3 bit cờ điều khiển:
• TF ( trap flag )
• IF ( interrupt enable flag )
• DF ( direction flag )
18

9


8/29/2011

II. Mô tả tập lệnh của bộ vi xử lý 8086/88.










1. Nhóm lệnh chuyển: MOV, PUSH, POP, XCHG, XLAT, LEA, LDS, LES, IN, INC,
OUT, ....
2. Nhóm lệnh xử lý số học: ADD, ADC, INC, DAA, AAA, SUB, SBB, DEC, NEG,
DAS,…
3. Các lệnh logic: AND, OR, XOR, NOT,....
4. Dịch chuyển và quay: SAL, SHL, SHR, SAR, ROL, ROR, RCL, RCR,.....
5. Nhóm lệnh xử lý chuỗi: MOVS, CMPS, SCAS, LODS, STOS,.....
6. Nhóm lệnh chuyển điều khiển chương trình: JA, JAE, JB, JBE, JC, JCXZ, JE,

JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC,....
7. Các lệnh xử lý ngắt (interrupt): INT, INTO, INT n, IRET.
8. Các lệnh điều khiển quay vòng thực hiện chương trình: LOOP, LOOPE,
LOOPZ, LOOPNE, LOOPNZ,…
Nhóm các lệnh khác: Nhóm các lệnh này gồm các lệnh dựng và xoá cờ, các
lệnh điều khiển trạng thái của bộ VXL, gồm: CLC, CMC, STC, CLD, STD, CLI,
STI, HLT, WAIT, ....
19

Lệnh CMP và TEST






<Dest>,<Src>

Thực hiện phép trừ Dest cho Src, kết quả không
được giữ lại, các cờ hiệu bị thay đổi.




CMP

Test

<Dest>,<Src>


Thực hiện phép AND Dest với Src, kết quả không
được giữ lại, các cờ hiệu bị thay đổi.
Hai tác vụ này được phối hợp cùng với các lệnh
chuyển điều khiển theo điều kiện.

20

10


8/29/2011

Các lệnh chuyển điều khiển theo điều kiện
• Lệnh chuyển điều khiển theo điều kiện có
dạng thức chung như sau :
<Jump_command>

<Label>

• <Label> là một tên nhãn đánh dấu một vị trí
trong chương trình. Khi điều kiện kiểm tra là
đúng, CPU sẽ chuyển đến thực hiện lệnh tại vị
trí <Label> , nếu điều kiện kiểm tra là sai CPU
sẽ thực hiện lệnh kế tiếp
21

Lệnh chuyển điều khiển theo điều kiện so
sánh
Số không dấu Số có dấu


So sánh

JA
JAE , JNB
JE , JZ

JG
JGE , JNL
JE , JZ

>
>=
=

JBE , JNA
JB
JNE , JNZ

JLE , JNG
JL
JNE , JNZ

<=
<
<>

22

11



8/29/2011

Lệnh chuyển điều khiển theo cờ hiệu

Lệnh làm thay đổi cờ hiệu trực tiếp

Lệnh

Điều kiện

Lệnh

Điều kiện

JC

CF = 1

STC

CF = 1

JNC

CF = 0

CLC

CF = 0


JZ

ZF = 1

STD

DF = 1

JNZ

ZF = 0

CLD

DF = 0

JO

OF = 1

STI

IF = 1

JNO

OF = 0

CLI


IF = 0

JP

PF = 1

JNP

PF = 0

JS

SF = 0

JNS

SF = 0

JNS

SF = 0

JCXZ

CX = 0

Các lệnh chuyển điều khiển theo điều kiện thường đi theo sau lệnh CMP
Các lệnh chuyển điều khiển không làm thay đổi giá trị của các cờ hiệu.


23

III. Cách mã hoá lệnh


Để tìm hiểu cách mã hoá lệnh, ta xét lệnh MOV des,src dùng để chuyển dữ
liệu giữa hai thanh ghi hay một ô nhớ và một thanh ghi.



Đối với các lệnh MOV. Để chuyển dữ liệu kiểu:
o Thanh ghi  thanh ghi ( trừ thanh ghi đoạn )
o hoặc Bộ nhớ  thanh ghi ( trừ thanh ghi đoạn )

thì 6 bit đầu này luôn là 100010. Đối với các thanh ghi đoạn thì điều này lại
khác.
24

12


8/29/2011

III. Cách mã hoá lệnh(tt)
• Để mã hóa lệnh MOV, ta cần dùng ít nhất là 2
byte trong đó 6 bit dùng cho mã lệnh

• Bit D xác định hướng truyền của dữ liệu, D = 0
xác định dữ liệu sẽ đi từ thanh ghi cho bởi 3
bit Reg, D = 1 xác định dữ liệu sẽ đi đến thanh

ghi cho bởi 3 bit Reg.
• Bit W xác định sẽ truyền 1 byte (W = 0) hay 1
word (W = 1).

25

III. Cách mã hoá lệnh(tt)
• 3 bit REG dùng để chọn thanh ghi sử dụng:

26

13


8/29/2011

III. Cách mã hoá lệnh(tt)


2 bit MOD ( chế độ ) cùng với 3 bit R/M ( thanh ghi/bộ nhớ ) tạo ra 5 bit
dùng để chỉ ra chế độ địa chỉ cho các toán hạng của lệnh. Bảng sau cho ta
thấy cách mã hoá các chế độ địa chỉ :

27

III. Cách mã hoá lệnh(tt)

Đối với các lệnh MOV. Để chuyển dữ liệu kiểu:
•Thanh ghi  thanh ghi ( trừ thanh ghi đoạn )
•hoặc Bộ nhớ  thanh ghi ( trừ thanh ghi đoạn )

thì 6 bit đầu này luôn là 100010. Đối với các thanh ghi đoạn thì điều này lại khác
28

14


8/29/2011




Ví dụ 1: Xét lệnh MOV AL, BL; copy nội dung thanh ghi cho thanh ghi
Trong tr-ờng hợp, nếu ta lấy AL là thanh ghi cho trong byte 2 là REG =
000 thì trong byte 1 bit D =1. Và nh- vậy toán hạng còn lại là thanh ghi
BL sẽ t-ơng ứng với MOD = 11 và R/M = 011. Các byte lệnh là:
Byte 1
1



0

0

0

Byte 2

1


0

1

0

1

1

0

0

0

1

1

Còn nếu lấy BL là thanh ghi cho trong byte 2 là REG =011, thì trong byte
1 bit D = 0. Toán hạng còn lại là AL t-ơng ứng với MOD =11 và R/M
=000. Khi đó, giá trị của nó là:
Byte 1
1




0


0

0

0

Byte 2

1

0

0

0

1

1

0

1

1

0

0


0

Ví dụ 2: Xét lệnh MOV [BX], CL
Trong tr-ờng hợp này, ta chỉ có CL là thanh ghi cho trong byte 2 là REG
=001 và trong byte 1 bit D=0. Toán hạng còn lại là ô nhớ địa chỉ trong
BX sẽ t-ơng ứng với MOD = 00 và R/M =111. Các byte lệnh là
Byte 1
1

0

0

0

1

Byte 2
0

0

0

0

0

0


0

1

1

1

1

29

IV. MNG V CC CH A CH


Mng mt chiu:
Mng mt chiu l mt danh sỏch cỏc phn t cựng loi v cú trt t. Cú trt t cú
ngha l cú phn t th nht , phn t th hai , phn t th ba ...



V trớ cỏc phn t ca mt mng:
a ch ca mt phn t ca mng cú th c xỏc nh bng cỏch cng mt hng
s vi a ch c s . Gi s A l mt mng v S ch ra s byte ca mt phn t ca
mng ( S=1 i vi mng byte v S=2 i vi mng t ) . V trớ ca cỏc phn t ca
mng A cú th tớnh nh sau :

30


15


8/29/2011

Ví dụ : Trao đổi phần tử thứ 10 và thứ 25 của mảng
từ W.
Phần tử thứ 10 là W*10+ có địa chỉ là:
W+9x2=W+18
Phần tử thứ 25 là W*25+ có địa chỉ là:
W+24x2=W+48
Vì vậy có thể trao đổi chúng như sau :
MOV AX,W+18 ; AX = W[10]
XCHG W+48,AX ; AX= W[25]
MOV W+18, AX ; complete exchange

31

Các chế độ địa chỉ (addressing modes)
Cách thức chỉ ra toán hạng trong lệnh gọi là chế độ địa chỉ . Các chế
độ địa chỉ thường dùng là :
• Chế độ địa chỉ bằng thanh ghi ( register mode) : toán hạng là thanh ghi
• Chế độ địa chỉ tức thời ( immediate mode) : toán hạng là hằng số
• Chế độ địa chỉ trực tiếp ( direct mode) : toán hạng là biến
Ví dụ :
MOV AX,0 ; AX là register mode còn 0 là immediate mode
ADD ALPHA,AX ; ALPHA là direct mode
Ngoài ra còn có 4 chế độ địa chỉ khác là :
• Chế độ địa chỉ gián tiếp bằng thanh ghi ( register indirect mode )
• Chế độ địa chỉ cơ sở ( based mode)

• Chế độ địa chỉ chỉ số ( indexed mode)
• Chế độ địa chỉ chỉ số sơ sở ( based indexed mode)
32

16


8/29/2011

Các chế độ địa chỉ(tt)

Ví dụ: chế độ địa chỉ thanh ghi
MOV BX, DX ; chuyển nội dung DX vào BX.
MOV DX,AX ; chuyển nội dung AX vào DX
ADD AL,DL ; cộng nội dung AL và DL rồi đưa vào AL

33

Chế độ địa chỉ gián tiếp bằng thanh ghi.
• Trong chế độ địa chỉ gián tiếp bằng thanh ghi , địa chỉ
offset của toán hạng được chưá trong 1 thanh ghi.
Chúng ta nói rằng thanh ghi là con trỏ ( pointer) của vị trí
nhớ . Dạng toán hạng là [register]. Trong đó register là
các thanh ghi BX, SI, DI, BP. Đối với các thanh ghi BX, SI,
DI thì thanh ghi đoạn là DS . Còn thanh ghi đoạn của BP
là SS .
• Ví dụ 1: giả sử rằng SI = 100h và từ nhớ(word) tại địa chỉ
DS:0100h có nội dung là 1234h.
Lệnh MOV AX,*SI+ sẽ copy 1234h vào AX .
34


17


8/29/2011

Ví dụ 2: Giả sử rằng nội dung các thanh ghi và nội dung của bộ nhớ tương ứng là như sau : Hãy
cho biết lệnh nào sau đây là hợp l{, offset nguồn và kết qủa của các lệnh hợp l{ ?







a.
b.
c.
d.
e.

MOV AX,[AX]
MOV CX,[SI]
MOV BX,[AX]
ADD [SI],[DI]
INC [DI]

• Lời giải :
Source offset
Result

• a. 1000h
1BACh
• b. 2000h
20FFh
• c. illegal source register ( must be BX,SI,DI)
• d. illegal memory-memory add
• e. 3000h
031Eh

35

Ví dụ 3 : Viết đoạn mã để cộng vào AX 10 phần tử của một mảng
W định nghĩa như sau :
W DW 10,20,30,40,50,60,70,80,90,100

• Giải :
XOR AX,AX ; xoá AX
LEA SI,W ; SI trỏ tới địa chỉ cơ sở ( base)
;của mảng W .
MOV CX,10 ; CX chưá số phần tử của mảng
ADDITION:
ADD AX,*SI+ ; AX=AX + phần tử thứ nhất
ADD SI,2
; tăng con trỏ lên 2
LOOP ADDITION ; lặp
36

18



8/29/2011

Ví dụ 3: Viết thủ tục để đảo ngược một mảng n từ có nghĩa là phần tử thứ 1 sẽ đổi thành
phần tử thứ n , phần tử thứ hai sẽ thành phần tử thứ n-1 ... Chúng ta sẽ dùng SI như là con
trỏ của mảng còn BX chứa số phần tử của mảng ( n từ ) .
Giải : Số lần trao đổi là N/2 lần . Nhớ rằng phần
tử thứ N của mảng có địa chỉ A+2x(N-1). Đoạn
mã như sau :
REVERSE PROC
; input: SI= offset of array
; BX= number of elements
; output : reverse array
PUSH AX ; cất các thanh ghi
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; DI chỉ tới phần tử thứ n
MOV DI,SI ; DI trỏ tới từ thứ nhất
MOV CX,BX ; CX=BX=n : số phần tử
DEC BX
; BX=n-1
SHL BX,1
;BX=2x(n-1)
ADD DI,BX ;DI = 2x(n-1) + offset của mảng :
;chỉ tới phần tử thứ n

SHR CX,1
;CX=n/2 : số lần trao đổi
; trao đổi các phần tử

XCHG_LOOP:
MOV AX,[SI] ; lấy 1 phần tử ở nửa thấp của
;mảng
XCHG AX,[DI] ; đưa nó lên nửa cao của
;mảng
MOV [SI],AX ; hoàn thành trao đổi
ADD SI,2 ; SI chỉ tới phần tử tiếp theo của
;mảng
SUB DI,2 ; DI chỉ tới phần tử thứ n-1
LOOP XCHG_LOOP
POP DI
POP SI
POP CX
POP BX
POP AX
RET
REVERSE ENDP
37

Chế độ địa chỉ chỉ số và Chế độ địa chỉ cơ sở
Trong các chế độ địa chỉ này , địa chỉ offset của toán hạng có được bằng cách
cộng một số gọi là displacement với nội dung của một thanh ghi .
Displacement có thể là :
– địa chỉ offset của một biến , ví dụ A
– một hằng ( âm hoặc dương ), ví dụ -2
– địa chỉ offset của một biến cộng với một hằng số , ví dụ A+4
Cú pháp của một toán hạng có thể là một trong các kiểu tương đương sau :
– [ register + displacement]
– [displacement + register]
– [ register]+ displacement

– [ displacement]+ register
– displacement[register]
Các thanh ghi phải là BX , SI , DI ( địa chỉ đoạn phải là thanh ghi DS) và BP (thanh
ghi SS chứa địa chỉ đoạn )

38

19


8/29/2011

Chế độ địa chỉ chỉ số và Chế độ địa chỉ cơ
sở (tt)


Chế độ địa chỉ được gọi là cơ sở ( based) nếu thanh ghi BX( base register)
hoặc BP ( base pointer) được dùng .



Chế độ địa chỉ được gọi là chỉ số ( indexed) nếu thanh ghi SI( source index) hoặc DI (
destination index) được dùng .
Ví dụ : Giả sử rằng W là mảng từ và BX chưá 4 . Trong lệnh MOV AX,W*BX+
displacement là địa chỉ offset của biến W. Lệnh này sẽ di chuyển phần tử có điạ chỉ W+4
vào thanh ghi AX . Lệnh này cũng có thể viết dưới các dạng tương đương sau :



MOV AX, [W+BX]




MOV AX, [BX+W]



MOV AX, W+[BX]



MOV AX, [BX]+W

39

Ví dụ 1: Viết đoạn mã để cộng vào AX 10 phần tử của một
mảng
W
định
nghĩa
như
sau:
W DW 10,20,30,40,50,60,70,80,90,100

• Với chế độ địa chỉ cơ sở có thể viết code cho bài toán
tính tổng 10 phần tử của mảng như sau :

XOR AX,AX ; xoá AX

XOR BX,BX ; xoá BX ( thanh ghi cơ sở )


MOV CX,10 ; CX= số phần tử =10

ADDITION:

ADD AX,W[BX] ; sum=sum+element

ADD BX,2 ; trỏ tới phần tử thứ hai

LOOP ADDITION
40

20


8/29/2011

Ví dụ 2: Với chế độ địa chỉ chỉ số có thể viết lại
code cho bài toán tính tổng 10 phần tử
• Giải :
XOR AX,AX ; xoá AX
LEA SI,W ; SI trỏ tới địa chỉ cơ sở ( base)
;của mảmg W .
MOV CX,10 ; CX chưá số phần tử của mảng
ADDITION:
ADD AX,*SI+ ; AX=AX + phần tử thứ nhất
ADD SI,2
; tăng con trỏ lên 2
LOOP ADDITION ; lặp
41


Chế độ địa chỉ chỉ số cơ sở


Trong chế độ này , địa chỉ offset của toán hạng là tổng của :
1. nội dung của thanh ghi cơ sở ( BX or BP)
2. nội dung của thanh ghi chỉ số ( SI or DI)
3. địa chỉ offset của 1 biến ( tuz chọn)
4. một hằng âm hoặc dương ( tuz chọn)



Nếu thanh ghi BX được dùng thì DS chứa số đoạn của địa chỉ toán hạng .Nếu BP được dùng
thì SS chưá số đoạn. Toán hạng được viết theo 4 cách dưới đây:
1. variable[base_register][index_register]
2. [base_register + index_register + variable + constant ]
3. variable [ base_register + index_register + constant]
4. constant [ base _ register + index_register + variable]



Trật tự của các thành phần trong dấu ngoặc là tuz ý .

Ví dụ : giả sử W là biến từ , BX=2 và SI =4 . Lệnh MOV AX, W[BX][SI] sẽ di chuyển nội dung của
mảng tại địa chỉ W+2+4 = W+6 vào thanh ghi AX
Lệnh này cũng có thể viết theo 2 cách sau :
MOV AX,[W+BX+SI]
MOV AX,W[BX+SI]
42


21


8/29/2011

43

44

22


8/29/2011

V. Hệ thống ngắt
• Ngắt là việc CPU dừng phục vụ chương trình chính để
chuyển sang phục vụ chương trình con để thực hiện
một chức năng nào đó khi có một yêu cầu ngắt. Và
sau khi thực hiện xong chương trình con xử lý ngắt
đó thì CPU quay về phục vụ tiếp cho chương trình
chính ngay tại điểm bị ngắt.
• Các loại ngắt chính:
– Các ngắt bên trong là các ngắt được xắp đặt ở trong CPU
– Các ngắt bên ngoài là các ngắt được tạo bởi phần cứng bên
ngoài.
– Các ngắt mềm là các ngắt được khởi tạo bởi 1 lệnh INT hay
INTO.
45

Ví dụ: Các ngắt của DOS


46

23


8/29/2011

Ví dụ : INT 21H - Các chức năng của DOS


Cách thức: gán AH là số hiệu(hàm) chức năng cần sử dụng, sau đó gọi ngắt INT
21H.
• Cụ thể:
• Hàm 01h: nhập một k{ tự từ bàn phím và hiện k{ tự nhập ra màn hình.
Nếu không có k{ tự nhập, hàm 01h sẽ đợi cho đến khi nhập.
Gọi: AH = 01h
Trả về: AL chứa mã ASCII của k{ tự nhập
MOV AH,01h
INT 21h ; AL chứa mã ASCII của k{ tự nhập
• Hàm 02h: xuất một k{ tự trong thanh ghi DL ra màn hình tại vị trí con trỏ
hiện hành
Gọi AH = 02h, DL = mã ASCII của k{ tự
Trả về: không có
MOV AH,02h
MOV DL,'A'
47
INT 21h

Một số chức năng hệ thống đơn giản của BIOS:












Chờ đọc một phím, không in lại phím này ra màn hình
mov
ah,0
int
016h
Sau khi thực hiện
AL = mã ASCII của phím được gõ vào
AH = scan code của phím
AL bằng 0 khi một số các phím chức năng được bấm
Đọc trạng thái của bàn phím
mov
ah,2
int
016h
Sau khi thực hiện
AL = byte trạng thái của bàn phím

48


24


8/29/2011

In chuỗi ký tự với thuộc tính màu, bắt đầu tại vị trí row và
col:












mov
ax,01301h
mov
bh,0
mov
bl,<color_code>
mov
bp,offset <chuoi_can_in>
mov
cx,<So_ky_tu_trong_chuoi>
mov

dh,<row>
; 0 - 24
mov
dl,<col> ; 0 - 79
int
010h
Màn hình PC trong text mode có 25 dòng, mỗi dòng 80 ký tự.
Màu của ký tự được tạo thành từ màu nền (Background color) và màu ký
tự (Foreground/Text color) theo công thức sau:
Color_code = Foreground_Color + 16*Background_Color

49

VI. Giới thiệu chung chương trình hợp ngữ
1. Cú pháp của chương trình hợp ngữ:
Một dòng lệnh của chương trình hợp ngữ có thể có những trường sau (không nhất
thiết phải có đủ hết tất cả các trường hợp):
Tên Mã lệnh Các toán dạng
Chú giải
Một ví dụ dòng lệnh gợi nhớ:
Tên Mã lệnh Các toán dạng
Chú giải
Nhan : MOV
AH, {BX} {SI} ; nạp vào AH nội dung ô
; nhớ có địa chỉ DS : (BX+SI)
Ví dụ trên:tại trường Tên ta có nhãn Nhan,
tại trường Mã lệnh ta có lệnh MOV
tại trường Toán hạng ta có các thanh ghi AH, BX và SI
tại phần Chú giải gồm có các dòng ; nạp vào AH nội dung ô
; nhớ có địa chỉ DS : (BX+SI)

• Ta có thể viết các dòng lệnh này bằng chữ hoa hoặc chữ thường và chúng sẽ được
coi là tương đương vì đối với dòng lệnh chương trình dịch không phân biệt kiểu
chữ.
• Mỗi dòng chú giải đó phải bắt đầu bằng dấu chấm phẩy.
• Xem thêm trong tài liệu
50

25


×