- PCI (Peripheral Component Interconnect) Bus: Phiên bản đầu tiên của PCI Bus chạy ở tốc độ 33 Mhz và đường truyền dữ liệu 32 bit, hỗ trợ qua trình truyền
1. Tập lệnh của CPU họ 80x8 6:
1.1 Các chế độ định vị địa chỉ (Addressing Mode). - Định nghĩa chế độ địa chỉ.
- Các chế độ địa chỉ của họ CPU 80x86 (lưu ý là có một số tài liệu phân chia theo một cách khác):
• Chế độ địa chỉ thanh ghi (Register Addresing mode).
Thí dụ:
MOV AL, BL; đưa nội dung thanh ghi BL vào AL
MOV DS, AX; đưa nội dung thanh ghi AX vào thanh ghi DS
• Chế độ địa chỉ tức thì (Immediate Addressing mode).
Thí dụ:
MOV AX, 16H; Đưa trị giá 16H vào thanh ghi AX
MOV byte ptr [BX],01 ; Đưa 1 byte có trị giá 01 vào ô nhớ có địa chỉ DS:BX
• Chế độ địa chỉ trực tiếp (Direct Addressing mode).
Thí dụ:
MOV CL,[1234H]; Đưa nội dung của ô nhớ có địa chỉ DS:1234H vào thanh ghi CL.
• Chế độ địa chỉ chỉ số cộng với cơ sở(Base-Plus- index addressing mode).
Thí dụ:
MOV AX, [BX+SI]; Đưa nội dung của hai ô nhớ liên tiếp DS:BX+SI và DS:BX+ SI +1 vào thanh ghi AX
• Chế độ địa chỉ tương đối thanh ghi ( Register Relative Addressing).
Thí dụ:
MOV AL, {BX+8]; Đưa nội dung của ô nhớ có địa chỉ DS:BX+8 vào thanh ghi AL
• Chế độ địa chỉ tương đối chỉ số cơ sở (Base Relative – Plus-Index Addressing).
Thí dụ:
MOV DL, {SI + BX +10]; Đưa nội dung của ô nhớ có địa chỉ DS:SI+BX+10 vào thanh ghi DL
Vấn đề ngầm định thanh ghi đoạn:
Toán hạng Thanh ghi segment ngầm định [offset] [BX] [SI] [DI] [BX] + Disp [DI] + Disp [SI] + Disp [BX] + [DI] + DS
Trong tình huống muốn loại bỏ sự ngầm định này, trong khi viết lệnh ta phải ghi rõ thanh ghi segment nào sẽ được dùng để tính địa chỉ kèm thêm dấu “:” trước thanh ghi offset:
Thí dụ:
MOV AL, ES:[408H]; Đưa nội dung của ô nhớ có địa chỉ ES:408H vào thanh ghi AL.
1.2 Tập lệnh của CPU 80x86
Tập lệnh của họ CPU 80x86 khá phức tạp, để đơn giản cho việc học tập và nghiên cứu, tập lệnh ở đây được trình bày theo từng nhóm và chủ yếu dựa trên CPU 8086. Cũng cần phải nhắc lại rằng tập lệnh của các CPU họ 80x86 khá nhiều, do đó trong từng nhóm lệnh, chúng tôi chỉ trình bày một số lệnh có tính cơ bản và thường hay được sử dụng trong lập trình hợp ngữ, khi hiểu được các lệnh này sinh viên có thể suy luận ra các lệnh khác tương ứng với từng nhóm lệnh.
a. Các lệnh chuyển dời dữ liệu.
- Lệnh MOV:
Cú pháp.: MOV Destination, Source
Ý nghĩa: Đưa nội dung toán hạng Source vào toán hạng Destination mà không làm thay đổi nội dung toán hạng Source.
Thí dụ:
MOV AL, 89H MOV BL, AL Kết quả là BL=AL = 89H
- Lệnh PUSH (Push word on the stack): Cất 1 từ vào Stack
Cú pháp: PUSH Source
Ý nghĩa: Giảm SP đi 2 (SP = SP –2) đưa 8 bit thấp của Source vào ô nhớ SS:SP và 8 bit cao của Source vào SS:SP+1.
Ý nghĩa: Giảm SP đi 2 (SP = SP-2), đưa 8 bit thấp của thanh ghi cờ vào ô nhớ SS:SP và 8 bit cao của thanh ghi cờ vào ô nhớ SS:SP+1.
- Lệnh POPF
Cú pháp: POPF (pop Word from top of Stack to Flag Register) Lấy 1 từ từ đỉnh của ngăn xếp đưa vào thanh ghi cờ
Ý nghĩa: Đưa ô nhớ có địa chỉ cho bởi SS:SP vào 8 bit thấp của thanh ghi cờ và SS:SP+1 vào 8 bit cao của thanh ghi cờ. Sau đó tăng SP lên 2 (SP = SP +2). Để làm rõ thêm các lệnh PUSH và POP, xét đoạn chương trình thí dụ sau:
MOV AX,1234H (Lệnh 1) MOV BX, 5678H (Lệnh 2) PUSH AX (Lệnh 3) PUSH BX (Lệnh 4) POP AX (Lệnh 5) POP BX (Lệnh 6)
Lệnh 1 và lệnh 2 làm cho AX = 1234H và BX = 5678H. Vẽ nội dung của Stack trong ộ nhớ:
- Sau lệnh 1 và lệnh 2:
Nội dung của bộ
nhớ Địa chỉ xx 00000H … xx xx xx xx
nhớ xx 00000H … xx xx xx SS:SP 34H 12H xx xx … xx FFFFFH - Sau lệnh 4:
Nội dung của bộ
nhớ Địa chỉ xx 00000H … xx SS:SP 78H 56H 34H 12H xx
… xx 78H 56H SS:SP 34H 12H xx xx … xx FFFFFH - Sau lệnh 6: BX = 1234H
Nội dung của bộ nhớ Địa chỉ xx 00000H … xx 78H 56H 34H 12H SS:SP xx xx …
LEA DX, TB
Thì DX sẽ chứa địa chỉ offset của TB.
- Lệnh LODSB (Load String Byte) Nạp vào AL một phần tử của chuỗi Byte.
Cú pháp: LODSB
Ý nghĩa: Đưa nội dung của ô nhớ cho bởi DS:SI vào thanh ghi AL. Nếu DF = 0 thì SI = SI + 1, không thì SI = SI –1.
- Lệnh LODSW (Load String Word) Nạp vào AX một phần tử của chuỗi Word.
Cú pháp: LODSW
Ý nghĩa: Đưa nội dung của ô nhớ cho bởi DS:SI vào thanh ghi AL và DS:SI + 1 vào thanh ghi AH. Nếu DF = 0 thì SI = SI + 2, không thì SI = SI –2.
- Lệnh STOSB (Store AL in String Byte) Cất AL vào 1 phần tử của chuỗi
Byte.
Cú pháp: STOSB
Ý nghĩa: + AL → ES:DI
+ Nếu DF = 0 thì DI = DI +1, không thì DI = DI –1.
- Lệnh STOSW (Store AXL in String Word) Cất AX vào 1 phần tử của chuỗi Word.
Cú pháp: STOSW
Ý nghĩa: + AL → ES:DI và AH → ES:DI +1
+ Nếu DF = 0 thì DI = DI + 2, không thì DI = DI –2.
- Lệnh MOVSB (Move String Byte) Chuyển 1 phần tử Byte của chuỗi sang một
phần tử Byte của chuỗi khác Cú pháp: MOVSB
Ý nghĩa: + DS: SI → ES:DI.
+ Nếu DF = 0 thì SI = SI +1 và DI = DI +1 không thì SI = SI -1 và DI = DI -1.
- Lệnh XCHG: Tráo nội dung hai toán hạng Cú pháp: XCHG OP1, OP2
Ý nghĩa: OP1 ↔ OP2 Thí dụ: MOV AL,10H
MOV BL,5H XGHG AL,BL Kết quả: AL = 5H, BL =10H.
- Lệnh XLAT (Translate a byte in AL) Đổi nội dung của AL theo bảng cho trước Cú pháp: XLAT
Ý nghĩa: DS: [BX+ AL] → AL
- Lệnh IN (Input Data From a Port) Đọc dữ liệu từ cổng vào thanh ghi tích lũy (AX hoặc AL).
Cú pháp: IN AL, DX
Ý nghĩa: Đọc 1 byte từ cổng có địa chỉ cho bởi thanh ghi DX vào thanh ghi AL Cú pháp: IN AX, DX
Ý nghĩa: Đọc 1 Word từ cổng có địa chỉ cho bởi thanh ghi DX vào thanh ghi AX Trong trường hợp địa chỉ cổng là 8 bit thì có thể dùng hằng số làm địa chỉ cổng thay vì phải thông qua thanh ghi DX.
- Lệnh OUT (Output a byte or word to a port) Đưa dữ liệu từ thanh ghi tích lũy (AL hoặc AX) ra cổng.
Cú pháp: OUT DX, AL
Ý nghĩa: Xuất 1 byte trong thanh ghi AL ra cổng có địa chỉ cho bởi thanh ghi DX
Cú pháp: OUT DX, AX
Thí dụ:
MOV AL,9 MOV CL,7 ADD AL,CL Kết quả CL = 7, AL =16
- Lệnh ADC: (Add with carry) Cộng có nhớ Cú pháp: ADC Destination, Source
Ý nghĩa: Source + Destination + CF → Destination - Lệnh SUB: (Subtract) Trừ 2 toán hạng
Cú pháp: SUB Destination, Source
Ý nghĩa: Destination - Source→ Destination Thí dụ:
MOV AL,7 MOV BL,3 SUB AL,BL
Kết quả là BL = 3, AL = 4.
- Lệnh SBB: (Subtract With Borrow) Trừ có mượn. Cú pháp: SBB Destination, Source
Ý nghĩa: Destination – Source - CF→ Destination
- Lệnh CMP: (Compare byte or word) so sánh 2 byte hoặc 2 word Cú pháp: CMP Op1, Op2
Ý nghĩa: Lấy Op1 trừ Op2 không thay đổi Op1, Op2 chỉ phản ánh kết quả lên thanh ghi cờ. Một số kết quả cần lưu ý:
+ Nếu Destination là 16 bit thì tích có thị giá 32 bit được lưu ở hai thanh ghi DX-AX = AX x Destination. Có nghĩa là DX chứa 16 bit cao của kết quả và AX chứa 16 bit thấp của kết quả.
Thí dụ bên dưới sẽ làm rõ điều này: MOV BL, 12H
MOV AL,7H MUL BL
Do BL là thanh ghi 8 bit nên phép toán nhân 8 bit được thực hiện. Kết quả: BL = 12H, AX = 7EH
Xét thí dụ khác:
MOV AX,1000H MUL AX
Do AX là thanh ghi 16 bit nên phép toán nhân 16 bit được thực hiện. Kết quả là 1000000H, do đó DX = 100H và AX = 0000H.
- Lệnh DIV: (Unsigned divide) Chia 2 số không dấu Cú pháp: DIV Destination
Ý nghĩa: Tuỳ theo kích thước của Destination mà có hai trường hợp chia xảy ra. + Nếu Destination là 8 bit thì số bị chia là số không dấu 16 bit chưá trong
AX, kết quả gồm 2 phần, thương chứa trong AL và số dư chứa trong AH. + Nếu Destination là 16 bit thì số bị chia là số không dấu 32 bit chưá trong
cặp thanh ghi DXAX, kết quả gồm 2 phần, thương chứa trong AX và số dư chứa trong DX.
Thí dụ bên dưới sẽ làm rõ các tình huống này: MOV BL, 10
MOV AX, 48 DIV BL
Do thanh ghi BL là 8 bit nên số bị chia là AX, kết quả: AL = thương = 4, AH = số dư = 8.
- Lệnh AND : Thực hiện phép AND theo từng bit của 2 toán hạng Cú pháp: AND Destination, Source
Ý nghĩa: Destination AND Source → Destination Thí dụ: MOV AL,23H
AND AL,0FH Kết quả: AL = 03H.
- Lệnh OR: Thực hiện phép OR theo từng bit của 2 toán hạng Cú pháp: OR Destination, Source
Ý nghĩa: Destination OR Source → Destination
- Lệnh XOR: Thực hiện phép XOR theo từng bit của 2 toán hạng Cú pháp: XOR Destination, Source
Ý nghĩa: Destination XOR Source → Destination - Lệnh NOT: Thực hiện đảo bit toán hạng
Cú pháp: AND Destination
Ý nghĩa: Đảo bit của Destination → Destination - Lệnh NEG: Đảo dấu của một toán hạng (Bù 2)
Cú pháp: NEG Destination
Ý nghĩa: Lấy bù 2 của Destination → Destination Thí dụ: MOV AL,1 NEG AL Kết quả: AL = - 1 ( = FFH). Các lệnh dịch chuyển: - Lệnh SHL: Dịch trái logic
Ý nghĩa: Dịch sang phải Destination 1 lần. Cú pháp: SHR Destination, CL
Ý nghĩa: Dịch sang phải Destination, số lần dịch chứa trong thanh ghi CL
- Lệnh SAL: Xem lệnh SHL - Lệnh SAR: Dịch phải số học
Cú pháp: SAR Destination, 1
Ý nghĩa: Dịch phải số học Destination 1 lần. Cú pháp: SAR Destination, CL
Ý nghĩa: Dịch phải số học Destination, số lần dịch chứa trong thanh ghi CL
Các lệnh quay vòng:
- Lệnh ROL: Quay vòng sang trái Cú pháp: ROL Destination, 1
Ý nghĩa: Quay vòng sang trái Destination 1 lần. Cú pháp: ROL Destination, CL
Ý nghĩa: Quay vòng sang trái Destination với số lần quay chứa trong thanh ghi CL
- Lệnh ROR: Quay vòng sang phải Cú pháp: ROR Destination, 1
Ý nghĩa: Quay vòng sang phải Destination 1 lần.
MSB LSB CF MSB LSB CF 0 MSB LSB CF 0
Ý nghĩa: Quay trái Destination thông qua cờ nhớ 1 lần. Cú pháp: RCL Destination, CL
Ý nghĩa: Quay trái Destination thông qua cờ nhớ, số lần quay chứa trong thanh ghi CL
- Lệnh RCR: Quay phải thông qua cờ nhớ Cú pháp: RCR Destination, 1
Ý nghĩa: Quay phải Destination thông qua cờ nhớ 1 lần. Cú pháp: RCR Destination, CL
Ý nghĩa: Quay phải Destination thông qua cờ nhớ, số lần quay chứa trong thanh ghi CL.
c. Các lệnh điều khiển chương trình
Nhóm lệnh nhảy:
- Lệnh nhảy không điều kiện JMP
Lệnh này khiến cho vi xử lý thực hiện một lệnh mới tại địa chỉ được mô tả trong dòng lệnh, bao gồm các dạng lệnh sau:
+ JMP NHAN
Lệnh mới bắt đầu tại vị trí đánh nhãn là NHAN. Căn cứ vào khoảng cách giữa vị trí của NHAN và lệnh nhảy mà trình biên dịch sẽ xác định xem lệnh này sẽ thuộc một trong ba lệnh sau:
• Nhảy ngắn (Short Jmp): Trong trường hợp này NHAN nằm cách xa trong phạm vi -128 …+127 byte so với lệnh tiếp theo sau lệnh JMP. Để định hướng
MSB LSB
CF
Opcode Disp JMP SHORT
NHAN (EBH) 1 byte
Opcode IP low IP high JMP NEAR NHAN
(E9H) 2 byte
Opcode IP low IP high CS low CS high JMP FAR NHAN
(EAH) 4 byte
+ Nhảy với thanh ghi làm toán hạng (thí dụ JMP BX): Trong trường hợp này thanh ghi ( trong thí dụ là BX) chứa thành phần offset (cho IP) của vị trí lệnh định nhảy đến trong đoạn CS. Khi thực hiện lệnh này thì thanh ghi (trong ví dụ là BX)→ IP
+ JMP [BX]: Trong trường hợp này DS: BX và DS:BX+1 chứa thành phần offset (cho IP) của vị trí lệnh định nhảy đến trong đoạn CS. Khi thực hiện lệnh này nên dùng lệnh ở dạng JMP WORD PTR [BX}
+ JMP DWORD PTR [BX]: Trong trường hợp này DS: BX và DS:BX+1 chứa thành phần offset (cho IP), DS:BX+2 và DS:BX+3 chứa thành phần Segment (cho CS) của vị trí lệnh định nhảy đến trong đoạn CS.
Thí dụ bên dưới nhằm minh hoạ lệnh nhảy không điều kiện: MOV AL,8 MOV CL,5 JMP TRU ADD AL,CL TRU: SUB AL,CL Kết quả là AL = 3. CL =5.
JAE C = 0 Nhảy nếu lớn hơn hoặc bằng
JB C = 1 Nhảy nếu nhỏ hơn
JBE C =1 hoặc Z –1 Nhảy nếu nhỏ hơn hoặc bằng
JC C =1 Nhảy nếu cờ nhớ (Carry) thiết lập
JE hoặc JZ Z = 1 Nhảy nếu bằng
JG Z =0 và S = 0 Nhảy nếu lớn hơn
JGE S = 0 Nhảy nếu lớn hơn hoặc bằng
JL S ≠ 0 Nhảy nếu nhỏ hơn
JLE Z =1 hoặc S =0 Nhảy nếu nhỏ hơn hoặc bằng
JNC C = 0 Nhảy nếy cờ nhớ (Carry) bị xoá
JNE hoặc JNZ Z = 0 Nhảy nếu không bằng
JNO O = 0 Nhảy nếu không tràn
JNS S = 0 Nhảy nếu cờ dấu không thiết lập
JNP P = 0 Nhảy nếu cờ Parity không thiết
lập
JO O = 1 Nhảy nếu cở tràn thiết lập
JP P = 1 Nhảy nếu cờ parity thiết lập
JS S = 1 Nhảy nếu cờ dấu thiết lập
JCXZ CX = 0 Nhảy nếu thanh ghi CX = 0
Lưu ý là các lệnh JA, JAE, JE, JNE, JB và JBE dùng cho các số không dấu. JG, JGE, JE, JNE và JLE dùng cho các số có dấu.
Thí dụ bên dưới minh họa lệnh nhảy có điều kiện: MOV CX,AX CMP AX, BX JB TONG SUB CX,BX JMP THOAT TONG:
Ý nghĩa: CX = CX –1; Nếu CX ≠ 0 thì nhảy đến vị trí được đánh nhãn là NHAN lưu ý là NHAN phải cách xa trong khoảng –128 … + 127 so với lệnh tiếp theo sau lệnh LOOP.
Thí dụ: MOV CX,10 MOV AL,0 MOV BL,0 LAP: ADD AL,BL INC BL LOOP LAP Kết quả: AL = 0 + 1 + …+ 9 = 45
+ Lệnh REP: Lặp lại lệnh viết sau đó đến khi CX = 0 Ví dụ: REP MOVSB
Ý nghĩa: Lặp lại lệnh MOVSB cho đến khi CX = 0. - Các lệnh lặp có điều kiện:
+ Lệnh LOOPE: Lặp lại đoạn chương trình cho đến khi CX = 0 hoặc ZF = 0.
+ Lệnh LOOPNE: Lặp lại đoạn chương trình cho đến khi CX = 0 hoặc ZF = 1.
+ Lệnh LOOPZ giống LOOPE + Lệnh LOOPNZ giống LOOPNE - Các lệnh thao tác với chương trình con:
+ Lệnh CALL Có các trường hợp sau:
• Gọi chương trình con ở gần (Near Call), tức gọi chương trình con trong cùng đoạn mã lệnh.
PUSH IP
IP = Offset của chương trình con; CS = Segment của chương trình con
Khi gặp lệnh RET ở cuối chương trình con thì thực hiện lệnh POP IP, POP CS.
Khi đó chương trình con phải được khai báo là ten_ctc proc far.
• Gọi chương trình con với thanh ghi chứa địa chỉ:
Thí dụ: CALL BX lúc này BX → IP (Gần giống với với Near Call)
• CALL WORD PTR [BX}: Gọi chương trình con nằm trong cùng đoạn mã, chương trình con có địa chỉ CS:IP thì hai ô nhớ DS: BX và DS:BX+1 chứa địa chỉ IP của chương trình con còn trị CS thì không đổi.
• JMP DWORD PTR [BX]: Gọi chương trình con không nằm trong cùng đoạn mã, chương trình con có địa chỉ CS:IP và trị giá gán cho IP lưu ở hai ô nhớ DS: BX và DS:BX+1, trị giá gán cho CS lưu ở hai ô nhớ DS: BX+2 và DS:BX+3.
- Lệnh trở về từ chương trình con:
RET hoặc RET n, (n là số nguyên dương). Lệnh RET này được đặt ở cuối chương trình con để CPU lấy lại địa chỉ trở về từ ngăn xếp (xem thêm lệnh CALL). Đối với lệnh RET n thì sau khi lấp địa chỉ trả về thì SP = SP + n (nhảy qua n byte trong ngăn xếp).
1.3 Khái niệm về ngắt :
- Khái niệm:
Cất các thanh ghi Chương trình chính
- Phân loại: Trong vi xử lý 8088/8086 có thể chia các nguyên nhân gây ra ngắt trong CPU thành 3 loại:
- Bảng Vector ngắt:
Địa chỉ Bộ nhớ Ý nghĩa 00000H IP-0
00002H CS-0
Vector 0 : Divide - error 00004H IP-1
00006H IP-1
Vector 1: Single – step
003FC H IP-255 003FE H CS-255
Vector 255 : dành cho người lập trình
Thí dụ: Chương trình con gọi ngắt 40 được cài đặt ở địa chỉ 28000H. Viết đoạn chương trình cài đặt vào bảng Vector ngắt để xử lý ngắt này?