8/29/2011

1

CÁC NỘI DUNG CHÍNH

1. CẤU TRÚC VI XỬ LÝ 8086/8088 2. MÔ TẢ TẬP LỆNH CỦA BỘ VI XỬ LÝ 8086/88 3. CÁCH MÃ HOÁ LỆNH 4. CÁC CHẾ ĐỘ ĐIA CHỈ 5. HỆ THỐNG NGẮT 6. LẬP TRÌNH HỢP NGỮ 7. 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:

6

3

- 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ả.

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.

8

4

• 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/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:

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

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:

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

12

Đị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 do một bộ tạo địa chỉ thực hiện.

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ì

14

7

CS:IP ~ FOOOHx10H + FFFOH = FOOOOH + FFFOH = FFFFOH

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,…

JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC,....

• 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,

• 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,…

19

• 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, ....

Lệnh CMP và TEST

CMP

,

Test

,

– 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. – 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 :

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

JG

>

JAE , JNB

JGE , JNL

>=

JE , JZ JBE , JNA JB JNE , JNZ

JE , JZ 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

STC CF = 1 JC CF = 1

CLC CF = 0 JNC CF = 0

STD DF = 1 JZ ZF = 1

CLD DF = 0 JNZ ZF = 0

STI IF = 1 JO OF = 1

CLI IF = 0 JNO OF = 0

JP

PF = 1

JNP PF = 0

JS SF = 0

JNS SF = 0

JNS SF = 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

JCXZ CX = 0

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.

o Thanh ghi  thanh ghi ( trừ thanh ghi đoạn ) o hoặc Bộ nhớ  thanh ghi ( trừ thanh ghi đoạn )

• Đối với các lệnh MOV. Để chuyển dữ liệu kiểu:

24

12

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.

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)

27

• 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ỉ :

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

Byte 1

Byte 2

1

0

0

0

1

0

1

0

1

1

0

0

0

0

1

1

• 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

Byte 2

1

0

0

0

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

Byte 2

1

0

0

0

1

0

0

0

0

0

0

0

1

1

1

1

29

• 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µ:

IV. MẢNG VÀ CÁC CHẾ ĐỘ ĐỊA CHỈ

– Mảng một chiều là một danh sách các phần tử cùng loại và có trật tự. Có trật tự có

nghĩa là có phần tử thứ nhất , phần tử thứ hai , phần tử thứ ba ...

• Mảng một chiều:

– Địa chỉ của một phần tử của mảng có thể được xác định bằng cách cộng một hằng số với địa chỉ cơ sở . Giả sử A là một mảng và S chỉ ra số byte của một phần tử của mảng ( S=1 đối với mảng byte và S=2 đối với mảng từ ) . Vị trí của các phần tử của mảng A có thể tính như sau :

30

15

• Vị trí các phần tử của một mảng:

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)

32

16

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)

8/29/2011

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

33

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

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. MOV AX,[AX] b. MOV CX,[SI] c. MOV BX,[AX] d. ADD [SI],[DI] e. 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 :

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

REVERSE PROC ; input: SI= offset of array ; BX= number of elements ; output : reverse array

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

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 :

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

;chỉ tới phần tử thứ n

REVERSE ENDP

37

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

– [ register + displacement] – [displacement + register] – [ register]+ displacement – [ displacement]+ register – displacement[register]

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 :

38

19

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 )

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 sau: mảng

nghĩa

như

W

định 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ở )

ADDITION:

ADD AX,W[BX] ; sum=sum+element ADD BX,2 ; trỏ tới phần tử thứ hai

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

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.

MOV AH,01h INT 21h ; AL chứa mã ASCII của k{ tự nhập

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

47

• 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' INT 21h

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

mov int Sau khi thực hiện

48

24

• Chờ đọc một phím, không in lại phím này ra màn hình • ah,0 • 016h • 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 • ah,2 • 016h • AL = byte trạng thái của bàn phím mov int Sau khi thực hiện

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:

; 0 - 24

ax,01301h bh,0 bl, bp,offset cx, dh, dl, ; 0 - 79 010h mov mov mov mov mov mov mov int

49

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

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ớ: Chú giải Tên Mã lệnh Các toán dạng 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ữ.

50

25

• 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

8/29/2011

VI. Giới thiệu chung chương trình hợp ngữ(tt)

2. Dữ liệu cho chương trình

Các dữ liệu có thể được cho dưới dạng số hệ hai, hệ mười, hệ mười sáu hoặc dưới dạng ký tự. Ví dụ các số viết đúng:

0011B 1234 0ABBAH 1EF1H “abcd”

; Số hệ hai. ; Số hệ mười ; Số hệ mười sáu ; Số hệ mười sáu. ; dạng k{ tự.

51

Biến và hằng

Để định nghĩa các kiểu dữ liệu biến khác nhau ta thường dùng các lệnh giả sau:

DB (define byte) DW (define word) DD (define double word)

: định nghĩa biến kiểu byte : định nghĩa biến kiểu từ : định nghĩa biến kiểu từ kép.

Dạng tổng quát như sau:

giá_ trị_khởi_đầu giá_ trị_khởi_đầu giá_ trị_khởi_đầu

Tên Tên Tên

DB DW DD

Ví dụ:

B1 DB W1 DW

4 ; B1 chiếm 1 byte trong bộ nhớ 40 ; W1 chiếm 2 byte trong bộ nhớ

Chúng ta cũng có thể sử dụng dấu ? chỉ để định nghĩa và dành 1 byte cho biến byte B2 và 2 byte trong bộ nhớ cho biến từ W2 mà không gán giá trị đầu cho nó bằng dòng lệnh sau:

B2

DB

? W2

?

DW Biến mảng: một dãy liên tiếp các phần tử cùng loại byte hoặc từ. Ví dụ: M1 DB 4, 5, 6, 7, 8, 9 ; biến mảng M1 chiếm 6 byte trong bộ nhớ. Biến kiểu xâu kí tự: Ví dụ: STR1

DB STR3

'string' DB

73h, 74h, 'x' 'i', 6Eh, 67h

Hằng có tên:

EQU

;CR là carriage return

CR CHAO EQU

0Dh 'Hello'

52

26

8/29/2011

3. Khung của một chương trình hợp ngữ

Khai báo quy mô sử dụng bộ nhớ

Cú pháp:

.MODEL

Kiểu_kích_thước_bộ_nhớ Các kiểu kích thước bộ nhớ cho chương trình hợp ngữ:

Đối với ta thông thường các ứng dụng đòi hỏi mã chương trình dài nhất cũng chỉ cần chứa trong một đoạn (64KB), dữ liệu cho chương trình nhiều nhất cũng chỉ cần chứa trong một đoạn, thích hợp nhất nên chọn Kiểu_ kích_thước_bộ_nhớ là Small (nhỏ) hoặc nếu như tất cả mã và dữ liệu có thể gói trọn được trong một đoạn thì có thể chọn Tiny(hẹp).

53

3. Khung của một chương trình hợp ngữ(tt)

• Khai báo đoạn ngăn xếp

Cú pháp:

.Stack Kích_thước

• Kích_thước sẽ quyết định số byte dành cho ngăn xếp. Nếu ta không khai Kích_thước thì chương trình dịch sẽ tự động gán cho Kích_thước giá trị 1 KB, đây là kích thước ngăn xếp quá lớn đối với một ứng dụng thông thường. Trong thực tế các bài toán của ta thông thường với 100-256 byte là đủ để làm ngăn xếp và ta có thể khai báo kích thước cho nó như sau:

Hoặc

.Stack .Stack

100 100H

54

27

8/29/2011

3. Khung của một chương trình hợp ngữ(tt)

• Khai báo đoạn dữ liệu

Đoạn dữ liệu chứa toàn bộ các định nghĩa cho các biến của chương trình. Các hằng cũng nên được định nghĩa ở đây để đảm bảo tính hệ thống. Cú pháp: .Data

MSG DB DB CR EQU LF

'hello!$' 13 10

55

3. Khung của một chương trình hợp ngữ(tt)

• Khai báo đoạn mã

Đoạn mã chứa mã lệnh của chương trình. Việc khai báo đoạn mã được thực hiện nhờ hướng dẫn chương trình dịch .CODE như sau: .CODE

Tên_CTC Proc

; Các lệnh của thân chương trình chính

:

CALL Tên_ ctc; gọi ctc

: Tên_CTC

Endp

56

28

8/29/2011

3. Khung của một chương trình hợp ngữ(tt)

Trong chương trình chính thường có 2 đoạn lệnh là khởi tạo DS và quay về DOS. ;Khởi đầu cho DS MOV AX, @Data MOV DS, AX ;Trở về DOS dùng hàm 4CH của INT 21H

MOV AH, 4CH INT 21 H

Giống như chương trình chính ct con cũng được định nghĩa dưới dạng một thủ tục nhờ các lệnh giả PROC và ENDP theo mẫu sau:

Tên_ctc Proc ; các lệnh thân chương trình con :

57

Khung của chương trình hợp ngữ để dịch ra chương trình .EXE

RET Tên_ctc Endp

.Model small .Stack 100 .Data

; các định nghĩa cho biến và hằng để tại đây

.Code

MAIN Proc

; Khởi đầu cho DS MOV AX, @Data MOV DS, AX

; Các lệnh của chương trình chính để tại đây ; Trở về DOS dùng hàm 4CH của INT 21H

MOV AH, 4CH INT 21H

MAIN Endp

; các chương trình con (nếu có )để tại đây

• • • • • • • • • • • • • • • •

END MAIN

58

29

8/29/2011

Chương trình 1: Chương trình Hello.EXE

.MODEL SMALL .STACK 100H .DATA

MSG DB "HELLO!$"

.CODE

MAIN PROC

; khoi tao DS

MOV AX,@DATA MOV DS,AX

; hien thi chuoi

LEA DX,MSG ; lay chuoi MOV AH,9 ; goi ham hien thi chuoi INT 21h ; thi hanh MOV AH,1 ; cho tac dong tu ban phim INT 21h

; tro ve DOS

MOV AH,4Ch INT 21h

• • • • • • • • • • • • • • • • • • • •

MAIN ENDP END MAIN

59

VD2: Chúng ta sẽ viết một chương trình hợp ngữ nhằm đọc một ký tự từ bàn phím và in nó trên đầu dòng mới.

; nhảy đến dòng mới

MOV AH,2 ; hàm xuất 1 ký tự MOV DL,0DH ; ký tự carriage return INT 21H ; thực hiện carriage return

.MODEL SMALL .STACK 100H .CODE MAIN PROC ; display dấu nhắc

MOV DL,0AH ; ký tự line feed INT 21H ; thực hiện line feed

; xuất ký tự

MOV DL,BL ; đưa ký tự vào DL INT 21H ; xuất ký tự

; trở về DOS

MOV AH,2 MOV DL,‘_' INT 21H ; nhập 1 ký tự

MOV AH,4CH ; hàm thoát về DOS INT 21H ; exit to DOS

MAIN ENDP

MOV AH,8 ; hàm đọc ký tự INT 21H ; ký tự được đưa vào AL MOV BL,AL ; cất ký tự trong BL

60

30

8/29/2011

VD 3: Chương trình đổi chữ thường sang chữ hoa

TITLE PGM3: CASE COVERT PROGRAM

;nhập vào một ký tự thường và đổi nó thành ký tự hoa

MOV AH,1 ; nhập vào 1 ký tự INT 21H ; cất nó trong AL

.MODEL SMALL .STACK 100H .DATA

SUB AL,20H ; đổi thành chữ hoa và cất nó vao AL MOV CHAR, AL ; cất ký tự trong biến CHAR

MSG1 DB ‘NHAP CHU THUONG:$' MSG2 DB 0DH,0AH,‘CHU IN HOA LA :'

; xuất ký tự trên dòng tiếp theo

CHAR DB ?,'$' ; định nghĩa biến CHAR có giá trị

;ban đầu chưa xác định

LEA DX, MSG2 ; lấy thông điệp thứ 2 MOV AH,9 INT 21H ; xuất chuỗi ký tự thứ hai , vì MSG2

.CODE MAIN PROC ; KHOI TAO DS

;không kết thúc bởi ký tự $ nên nó ;tiếp tục xuất ký tự có trong biến CHAR

;dos exit

MOV AX,@DATA MOV DS,AX ;IN RA MAN HINH

MOV AH,4CH INT 21H ; dos exit

MAIN ENDP END MAIN

LEA DX,MSG1 ; lấy thông điệp số 1 MOV AH,9 INT 21H ; xuất nó ra màn hình

61

Khung của chương trình hợp ngữ để dịch ra chương

trình .COM

START: JMP CONTINUE ;các định nghĩa cho biến và hằng để tại đây

;các lệnh của chương trình chính để tại đây ; Trở về DOS

62

31

; các chương trình con (nếu có) để tại đây • .Model Tiny • .Code • ORG 100h • • • CONTINUE : • MAIN Proc • • INT 20H • MAIN Endp • • END START

8/29/2011

Môđun chương trình .COM và .EXE trong bộ nhớ.

63

Ví dụ: Chương trình hiện lên màn hình dòng chữ “CHAO CAC BAN”

;Hien thi loi chao .MODEL TINY .CODE ORG 100H

START: JMP CONTINUE DB 13,10,’$’ CRLF CHAO DB ‘CHAO CAC BAN!$’

CONTINUE: MAIN PROC MOV AH,9 LEA DX,CHAO INT 21H ;Tro ve DOS INT 20H MAIN ENDP END START

64

32

;Xuong dong moi MOV AH,9 LEA DX,CRLF INT 21H

8/29/2011

Bài tập: Thêm một câu “How are you" nằm cách lời chào "Hello!" một dòng.

;Tao vong lap

.MODEL SMALL .STACK 100H .DATA

MSG1 DB "HELLO!$" MSG2 DB "How are you$" CRLF DB 13,10,'$'

.CODE

MOV CX,2 LAP: LEA DX,CRLF INT 21H LOOP LAP LEA DX,MSG2 ; lay chuoi INT 21h ; thi hanh ; tro ve DOS

MAIN PROC

; khoi tao DS

MOV AH,4Ch INT 21h MAIN ENDP

MOV AX,@DATA MOV DS,AX

END MAIN

; hien thi chuoi

MOV AH,9 LEA DX,MSG1 ; lay chuoi INT 21h ; thi hanh

65

Các cấu trúc lập trình cơ bản thực hiện bằng hợp ngữ

Giải 1.Cấu trúc tuần tự Cú pháp:

Lệnh1

Lệnh2 . . . . . Lệnhn

Ta có thể thực hiện công việc trên bằng mẫu chương trình sau: XOR AX, AX ; tổng tại AX lúc đầu là 0. AX, BX ;cộng thêm b. ADD ADD AX, CX ;cộng thêm c. SHL AX, 1 ;nhân đôi kết quả trong AX. RA: ;lối ra của cấu trúc.

Ví dụ Các thanh ghi CX và BX chứa các giá trị của biến c và b. Hãy tính giá trị của biểu thức a = 2 (c+b) và chứa kết quả trong thanh ghi AX.

66

33

8/29/2011

2. Cấu trúc IF - THEN

Cú pháp:

67

VD 2: Giả sử AL và BL chứa mã ASCII của k{ tự. Kiểm tra nếu AL<=BL thì hiện ra màn hình k{ tự trong AL, còn không thì hiện k{ tự trong BL.

• 1) IF < Điều kiện > THEN < Công việc > 2) IF < Điều kiện > THEN < Công việc 1 > ELSE < Công việc 2 >

Hiện ký tự trong BL

Giải Thuật giải Đoạn chương trình như sau: IF_: IF AL<=BL THEN Hiện ký tự trong AL ELSE

ENDIF CMP AL,BL JA ELSE_ MOV AH,2 MOV DL, AL INT 21H JMP ENDIF_ ELSE_:

68

34

MOV AH,2 MOV DL, BL INT 21H ENDIF_:

8/29/2011

Ví dụ 3: Đọc một ktự, nếu là chữ hoa thì hiển thị.

Các nhánh với điều kiện kép Cấu trúc:

điều kiện1 AND điều kiện 2 Hay: điều kiện1 OR điều kiện 2

69

3. Cấu trúc lựa chọn CASE

Khác với cấu trúc rẽ nhánh IF-THEN chỉ rẽ được hai nhánh, cấu trúc lựa chọn có thể rẽ nhiều nhánh. Dạng tổng quát như sau:

70

35

Dạng tổng quát như sau: • CASE OF • • • • • Giá_trị_1: Công_việc_1 Giá_trị_2: Công_việc_2 …………………………. Giá_trị_N: Công_việc_N END_CASE

8/29/2011

Ví dụ: Nếu AX chứa số âm thì đưa -1 vào BX, nếu AX chứa 0 thì đưa 0 vào BX, nếu AX chứa số dương thì đưa 1 vào BX.

Giải: CASE_: Nếu nếu nếu AX < 0 thì BX =-1, AX = 0 thì BX =0, AX > 0 thì BX =1.

AM: CMP AX,0 JL AM JE KHONG JG DUONG MOV BX,-1 JMP ENDCASE_ KHONG:

MOV BX,0 JMP ENDCASE_ DUONG:

71

MOV BX,1 ENDCASE_:

4. Cấu trúc lặp với số lần xác định FOR-DO

FOR DO

ENDFOR

• Dạng tổng quát • • • • Hoạt động của cấu trúc này thể

hiện bằng lưu đồ sau:

72

36

8/29/2011

Ví dụ1: Hiện thị một dòng 80 ký tự ‘$’

Đoạn chương trình như sau: • MOV CX,80 • FOR_: • MOV AH,2 • MOV DL,’$’ • INT 21H • LOOP FOR_ • ENDFOR_:

73

74

37

8/29/2011

5. Cấu trúc lặp WHILE – DO (Cấu trúc lặp với số lần không xác định)

WHILE <Điều kiện> DO

75

Ví dụ: Đếm số ký tự được nhập từ bàn phím đến khi gặp ENTER

76

38

8/29/2011

6. Cấu trúc lặp REPEAT – UNTIL

• Dạng tổng quát

REPEAT UNTIL <Điều kiện>

• Hoạt động của cấu trúc này được thể hiện qua lưu

đồ ở trên:

77

Ví dụ: Đếm số ký tự đọc được từ bàn phím, khi gặp ký tự CR thì thôi.

JE UNTIL_;Bằng CR INC CX JMP REPEAT_

Đoạn chương trình như sau: • MOV CX,0;Chứa số k{ tự đếm được • REPEAT_: • MOV AH,1 • INT 21H • CMP AL,0DH ;Có bằng k{ tự CR không? • • • • UNTIL_:

78

39

8/29/2011

79

Lệnh CALL và RET(tt)

• Thủ tục FAR ;Gọi thủ tục (FAR) CALL Tên_thủ_tục

–lần lượt push CS và IP vào stack –copy địa chỉ của Tên_thủ_tục vào CS và IP

;Trở về từ thủ tục (FAR) RET –pop giá trị từ đỉnh stack lần lượt vào IP và CS

80

40

8/29/2011

VII. GHÉP NỐI VÀ VÀO/RA DỮ LIỆU

1. Giao tiếp vào/ra song song lập trình được 8255A — 8255A là thiết bị xuất nhập song song lập trình được. Nó là một thiết bị I/O đa dụng có thể sử dụng với bất cứ µP nào, có thể lập trình để truyền dữ liệu, từ I/O thông thường đến I/O interrupt. — 8255A có thể chia thành 3 Port: A, B và C; mỗi port 8 bit trong đó Port C có thể sử dụng như 8 bit riêng hay chia thành 2 nhóm, mỗi nhóm 4 bit: PCH (PC7 ÷ PC4) và PCL (PC3 ÷ PC0).

— 8255A có thể hoạt động ở các chế độ (mode): - Chế độ 0: tất cả các Port làm việc như các Port I/O đơn giản. - Chế độ 1 (chế độ bắt tay: handshake): các Port A và B dùng các bit của Port C làm tín hiệu bắt tay. Trong chế độ này, các kiểu truyền dữ liệu I/O có thể được cài đặt, kiểm tra trạng thái và ngắt. - Chế độ 2: Port A có thể dùng để truyền dữ liệu song hướng dùng tay từ Port C còn Port B được thiết lập ở chế độ

các tín hiệu bắt 0 hay 1

81

Så âäö khäúi cáúu truïc bãn trong cuía 8255A

82

41

8/29/2011

MÔ TẢ

1 0 0 0 0

A1 x 0 0 1 1

A0 X 0 1 0 1

Choün ra khäng choün PA PB PC CWR

83

A1, A0 địa chỉ hóa cho các thanh ghi PA, PB, PC, CWR. Địa chi của PA cũng chính là địa chỉ cơ sở của 8255A

VÍ DỤ: Xét sơ đồ kết nối sau:

• Giả sử để chọn PORTA ta phải có:

84

42

8/29/2011

Từ điều khiển của 8255A

Có 2 loại từ điều khiển CW cho 8255A: • Từ điều khiển định nghĩa cấu hình các cổng

PA,PB,PC.

• Từ điều khiển xóa/lập từng bit cho cổng PC Cả 2 từ điều khiển có cùng một địa chỉ của CWR và được bằng bit D7. D7 =0: xóa/lập từng bit D7 =1: định nghĩa cấu hình

85

Từ điều khiển định nghĩa cấu hình

Ví dụ:

86

43

8/29/2011

Từ điều khiển xóa/lập từng bit PC

• Ví dụ: Giả sử ta cần tạo một sóng chữ nhật tại bit PC3.

Để tạo một sóng chữ nhật tại PC3, ta cần 2 mức logic là 0 và 1 tại PC3. Tức là ta thực hiện xóa và lập tại PC3 tương ứng với CWR = 00000000B=00h và CWR=00000001B=01h

87

Khi sử dụng ở mode BSR, cần chú ý các điều sau:

 Để đặt hay xoá các bit ở Port C, từ điều khiển được ghi vào thanh ghi điều khiển chứ không ghi vào Port C.

 Một từ điều khiển BSR chỉ ảnh hưởng đến một

bit của Port C.

 Từ điều khiển BSR không ảnh hưởng đến I/O

mode.

88

44

8/29/2011

Mode 0: Xuất/nhập đơn giản • Trong chế độ này, mỗi port (hay nửa port của Port C) làm việc như các port nhập hay xuất với các tính chất sau: - Các ngõ ra được chốt. - Các ngõ vào không được chốt. - Các port không có khả năng bắt tay và ngắt.

• Để giao tiếp với ngoại vi thông qua 8255A cần phải: —Xác định địa chỉ của các port A, B, C và CR thông

qua các chân chọn chip CS và giải mã A1, A0.

—Ghi từ điều khiển vào thanh ghi điều khiển. —Ghi các lệnh I/O để giao tiếp với ngoại vi qua các

port A, B, C.

89

Một vài ví dụ cho 8255A

Ví dụ 1: Hãy cho biết địa chỉ thanh ghi từ điều khiển và trạng thái A2A7 trong trường hợp như sơ đồ kết nối dưới đây?

90

45

8/29/2011

Một vài ví dụ cho 8255A(tt) Ví dụ 2: Tạo một sóng chữ nhật tại bit PC2. Giả sử 8255A có các địa chỉ cơ sở là 7Ch.

CWR

D7 D6 D5 D4 D3 D2 D1 D0

Đặt PC2 = 1

0

0

0

0

0

0

0

1

=01H

Xóa PC2 = 0

0

0

0

0

0

0

0

0

=00H

Thanh ghi

Địa chỉ (cổng) 7Ch 7Dh 7Eh 7Fh

PA PB PC CWR

; Định nghĩa các hằng cho cổng EQU 7Ch PA EQU 7Dh PB PC EQU 7Eh CWR EQU 7Fh MOV AL, 01H ; Từ điều khiển BSR OUT CWR, AL ; Đặt PC2 = 1 CALL DELAY1 ; Chờ MOV AL, 00H ; Từ điều khiển BSR OUT CWR, AL ; Xóa PC2 = 0 CALL DELAY2 ; Chờ

91

Một vài ví dụ cho 8255A(tt)

• Ví dụ 3: Giả sử 8255A có các địa chỉ cơ sở là 7Ch. Lập trình để định nghĩa chế độ 0 cho 8255A với cấu hình các cổng như sau: PA=Ra; PB=Vào; PCH=Ra; PCL=Vào. Sau đó đọc các giá trị dữ liệu có tại: PB rồi đưa ra PA

• Vẽ sơ đồ kết nối?

PCL rồi đưa ra PCH. = 010011

92

46

8/29/2011

Một vài ví dụ cho 8255A(tt)

• Ví dụ 4: Lập trình chế độ Mode 0 theo cấu hình

sau:

93

Một vài ví dụ cho 8255A(tt)

• Vê duû 5: Láûp trçnh âãø bit PC4 cuía 8255A åí vê duû trãn taûo ra 256 xung våïi T=50ms,

Giaíi: Sæí duûng caïc kyï hiãûu åí vê duû trãn vaì caïc âënh nghéa måïi

PA PB PC CWR

EQU EQU EQU EQU EQU EQU

7CH 7DH 7EH 7FH 09H 08H

; tæì âiãöu khiãøn âãø PC4=1 (On): 00001001B ; tæì âiãöu khiãøn âãø PC4=0 (Off): 00001000B

PC4ON PC4OF ta coï máùu chæång trçnh sau:

; säú xung phaíi taûo ra ; cáúm ngàõt âãø yãn tám maì taûo xung

Lap:

; PC4=1

; keïo daìi 25ms.

; PC4=0

; Làûp cho âuí säú xung

MOV CX, 100H CLI MOV AL, PC4ON ; tæì âiãöu khiãøn cho PC4=1. OUT CWR, AL CALL TRE25MS MOV AL,PC4OFF ; PC4=0 OUT CWR, AL CALL TRE25MS LOOP Lap STI

; cho pheïp ngàõt tråí laûi

94

47

âäü räüng 50%. Giaí thiãút âaî coï sàôn chæång trçnh con trãù 25ms laì TRE25MS.

8/29/2011

VÍ DỤ 6: Lập trình chế độ Mode 0 theo cấu hình sau:

VÍ DỤ 7:

VÍ DỤ 8:

95

48