Tổ CNTT - Trường Cao Đẳng Bến Tre
S6 được giữ ở trạng thái thấp nếu CPU đang sử dụng hệ thống bus ngoài.
S7 lưu giữ trạng thái của
BHE
ở chu kỳ máy thứ nhất.
RD
: CPU dùng tín hiệu này để đọc số liệu từ ô nhớ hay từ các thiết bị ngoại vi.
Ready: Ô nhớ hoặc ngoại vi có thể dùng tín hiệu này để báo cho CPU biết nó đang sẳn sàng chuyển dữ
liệu.
TEST
: Khi ta dùng lệnh WAIT thì CPU ở trạng thái nghỉ cho đến khi tín hiệu ở chân này xuống thấp thì
CPU mới thi hành lệnh kế sau lệnh WAIT.
INTR: Các ngoại vi tác động vào chân này khi cần ngắt CPU.
NMI (non maskable interrupt): Đây là ngã vào của ngắt không che, ngắt không che có ưu tiên tuyệt đối.
Reset: Khởi động lại hệ thống.
CPU 8086 có hai chế độ vận hành MAX (
MX
) và MIN (MN). Nhiệm vụ của các chân tương ứng với 2
chế độ vận hành như sau:
MIN (MN) MAX (
MX
)
HOLD
0/ GTRQ
HALD
1/ GTRQ
WR Lock
IOM /
2S
RDT /
1S
DEN
0S
ALE QS0
INTA
QS1
Chế độ MN (hiệu điện thế ở chân
MXMN /
cao)
DEN
(data enable): Cho phép số liệu được nhận vào CPU hoặc đưa ra bus số liệu tuỳ theo tín hiệu ở
chân
RDT /
. Nếu chân
RDT /
có hiệu thế cao, CPU đưa số liệu ra bus hệ thống. Nếu
RDT /
có hiệu thế
thấp, CPU nhận số liệu từ bus hệ thống.
IOM /
(memory / input output): Chân này ở trạng thái cao nếu CPU liên hệ với bộ nhớ. Nó ở trạng thái
thấp nế CPU làm việc với ngoại vi.
HOLD: Các ngoại vi tác động vào chân này nếu muốn sử dụng bus hệ thống.
HLDA (hold acknowledge): CPU dùng tín hiệu này để báo cho ngoại vi biết nó đang thả nổi bus hệ
thống.
ALE (address latch enable): Tín hiệu ở chân này cho biết địa chỉ của ô nhớ đã được đưa ra bus hệ thống.
INTA
(interrupt latch enable): Đây là tín hiệu cho biết CPU đã công nhận ngắt mà ngoại vi yêu cầu.
WR
: Tín hiệu dùng để viết số liệu vào bộ nhớ.
Chế độ MX (hiệu điện thế ở chân
MXMN /
thấp)
S0, S1, S2 kết hợp, ý nghĩa như sau:
S0 S1 S2 Ý nghĩa
0 0 0 Công nhận ngắt
0 0 1 Đọc từ ngoại vi
0 1 0 Viết ra ngoại vi
0 1 1 Trạng thái dừng (HALT)
1 0 0 Tìm lệnh
1 0 1 Đọc bộ nhớ
1 1 0 Viết vào bộ nhớ
1 1 1 Không có hoạt động
0/ GTRQ
(request / grant): Ngoại vi tạo một xung thấp ở chân này để báo cho CPU biết nó cần sử
dụng bus hệ thống. CPU báo lại bằng một xung âm cho biết nó đã thả nổi bus hệ thống.
1/ GTRQ
giống như
0/ GTRQ
nhưng ưu tiên thấp hơn.
Trang 5 Chủ biên Võ Thanh Ân
Giáo trình Assembler
QS0 và QS1 cho biết trạng thái của hàng chờ lệnh như sau:
QS0 QS1 Ý nghĩa
0 0 Chưa có tác vụ
0 1 Byte thứ nhất của lệnh được thực hiện
1 0 Hàng chờ lệnh đã đầy
1 1 Byte kế tiếp của lệnh đang được lấy đi từ hàng chờ lệnh
LOCK: Đây là tín hiệu báo CPU đang sử dụng bus hệ thống.
GND (ground): là chân mass (0 volt). V
cc
là hiệu điện thế nguồn 5 volt.
CPU 8086 phải dùng chung với một số vi mạch khác như: vi mạch điều khiển bus, vi mạch tạo xung nhịp
(clock),… mới tạo thành một máy vi tính.
II. CÁC LỆNH THƯỜNG DÙNG CỦA CPU 8086
1. Giới thiệu
Bộ xử lý 8086 có tập lệnh gồm 111 lệnh, chiều dài của lệnh từ 1 byte đến vài byte.
Tập lệnh của bộ xử lý Intel ngày càng có nhiều lệnh mạnh và phức tạp. Bộ xử lý
Intel 80386 có 206 lệnh, các lệnh có chiều dài từ 1 đến 15 byte, một số lệnh cần 1000
chu kỳ xung nhịp để thực hiện.
Sau đây chúng ta chỉ đề cập một số lệnh thường dùng của CPU 8086. Tập lệnh đầy
đủ của bộ xử lý 8086 được nêu ở phụ lục. Tập lệnh của bộ xử lý 80386 và Pentium
không đề cập trong giáo trình này vì quá phức tạp.
Chúng ta dùng các qui ước sau:
° Reg (register): Thanh ghi.
° Reg8, Reg16: Thanh ghi 8 bit, 16 bit.
° Mem (memory): Ô nhớ.
° Mem8, Mem16: Ô nhớ 8 bit, 16 bit.
° Immed (immediate): Tức thì.
° Immed8, Immed16: Toán hạng tức thì 8 bit, 16 bit.
° Segreg (segment register): Thanh ghi đoạn.
2. Nhóm di chuyển số liệu
MOV (move): Di chuyển.
MOV đích, nguồn
Lệnh này di chuyển số liệu từ nguồn sang đích. Nguồn có thể là Reg,
Mem, Immed; đích có thể là Reg, Mem.
Ví dụ: MOV CX, BX
Lệnh trên thực hiện chuyển nội dung của thanh ghi BX vào thanh ghi
CX. Nội dung của thanh ghi BX giữ nguyên. Sau lệnh này thì BX và CX
có cùng nội dung.
PUSH (push): đẩy vào.
PUSH nguồn
Nguồn có thể là Reg16, Mem16.
Lệnh PUSH là giảm con trỏ ngăn xếp SP xuống 2 đơn vị.
Ví dụ: PUSH AX
Chủ biên Võ Thanh Ân Trang 6
Tổ CNTT - Trường Cao Đẳng Bến Tre
Lệnh trên thực hiện chuyển nội dung của thanh ghi AX vào ngăn xếp,
đồng thời con trỏ SP giảm 2 đơn vị.
POP (pop: lấy, di chuyển): lấy dữ liệu ra từ ngăn xếp.
POP đích
Đích có thể là Reg16, Mem16.
Lệnh POP là tăng con trỏ ngăn xếp SP xuống 2 đơn vị.
Ví dụ: POP BX
Lệnh trên thực hiện chuyển nội dung 2 byte ô nhớ mà SP trỏ tới để đưa
vào BX, byte có địa chỉ thấp đưa vào BL, byte có địa chỉ cao đưa vào
BH, đồng thời con trỏ SP tăng 2 đơn vị.
Ghi chú: Qua 2 lệnh PUSH và POP, ta thấy ngăn xếp ô nhớ đi từ ô nhớ có địa chỉ
cao, đến ô nhớ có địa chỉ thấp, nghĩa là số liệu đưa vào ngăn xếp trước thì địa chỉ cao,
số liệu đưa và ngăn xếp sau thì ở địa chỉ thấp hơn.
3. Nhóm lệnh chuyển địa chỉ
LEA (load effective address): nạp địa chỉ hiệu dụng.
LEA Reg16, Mem16
Chuyển độ dời của ô nhớ Mem16 vào thang ghi Reg16.
Ví dụ: LEA DX, StringVar
Lệnh trên thực hiện chuyển độ dời của biến StringVar vào thanh ghi DX.
Ta cũng có thể viết (MASM): MOV DX, offset StringVar tương đương
lệnh trên.
4. Nhóm lệnh chuyển cờ hiệu (thanh ghi trạng thái)
PUSHF (push flag): lưu giữ cờ.
PUSHF (không có đối)
Đây là lệnh lưu giữ thanh ghi cờ vào ngăn xếp.
POPF (pop flag): lấy cờ ra.
POPF (không có đối)
Đây là lệnh lấy 2 byte từ ngăn xếp đưa vào thanh ghi cờ.
Ví dụ: Để đưa nội dung của thanh ghi cờ vào thanh ghi AX ta làm như
sau:
PUSHF
POP AX
5. Nhóm lệnh vào ra ngoại vi
IN (in: vào): lấy số liệu từ ngoại vi.
IN AL, địa chỉ cổng 8bit
Đây là lệnh đưa số liệu lưu giữ ở ô nhớ đệm ngã ra của cổng vào thanh
ghi AL.
Nếu địa chỉ của cổng là 16bit thì phải đưa địa chỉ của cổng này vào thanh
ghi DX trước khi sử dụng lệnh IN.
Ví dụ:
IN AL, 3FH ;3FH là địa chỉ của cổng 8bit.
Trang 7 Chủ biên Võ Thanh Ân
Giáo trình Assembler
MOV DX, 3F8H ;3F8H là địa chỉ cổng 16 bit.
IN AL, DX
OUT (out: ra): đưa số liệu ra ngoại vi.
OUT địa chỉ cổng 8bit, AL
MOV DX, địa chỉ cổng 16 bit.
OUT DX, AL
6. Nhóm lệnh điều khiển
JMP (jump: nhảy): đây là lệnh nhảy vô điều kiện đến một địa chỉ khác.
JMP đích
Nhảy đến địa chỉ được đánh dấu bằng một nhãn hay một con số ám chỉ
độ dời. Nhãn nằm trong đoạn CS hiện tại.
Tuỳ theo khoảng cách của đích đến lệnh JMP mà ta có 3 kiểu lệnh này.
JMP near đích
Lệnh này (còn được viết: JMP đích) nhảy đến đoạn nằm trong CS hiện
tại.
JMP short đích
Dùng để nhảy đến địa chỉ trong khoảng –128 đến +127 tính từ lệnh JMP.
JMP far đích
Dùng để nhảy ra khỏi đoạn CS hiện tại.
Lệnh nhảy có điều kiện: Lệnh này kiểm tra điều kiện trước khi nhảy. Nếu
điều kiện đúng thì nhảy tới đích, ngược lại thi hành lệnh kế đó một cách
bình thường.
JA (jump if above: nhảy nếu lớn hơn). Nếu 2 cờ CF=ZF=0 thì nhảy đến
đích.
JB (jump if below: nhảy nếu nhỏ hơn). Nếu cờ CF=1 thì nhảy đến đích.
JZ (jump if zero: nhảy nếu bằng 0). Nếu cờ ZF=1 (phép toán trước đó
bằng 0 hoặc so sánh bằng nhau) thì nhảy.
JNZ (jump if not zero: nhảy nếu khác 0). Nếu cờ ZF=0 (phép toán trước
đó khác 0 hoặc so sánh khác nhau) thì nhảy.
7. Nhóm lệnh so sánh
Lệnh CMP
CMP trái, phải
Nếu trái > phải thì ZF = 0 và CF =0
Nếu trái = phải thì ZF = 1 và CF =0
Nếu trái < phải thì ZF = 0 và CF =1
Ví dụ:
MOV AX, 1000H
CMP AX, 200H
JZ NHANDEN ; nhãn đến
…
…
NHANDEN:
ADD AX, BX
Chủ biên Võ Thanh Ân Trang 8
Tổ CNTT - Trường Cao Đẳng Bến Tre
8. Nhóm lệnh vòng lặp
LOOP (loop: nhảy vòng): Lệnh này làm giảm thanh ghi CX xuống 1 và
nhảy tới một nhãn (trong vòng –128 đến 127) nếu CX khác 0.
Ví dụ:
MOV AH, 02H
MOV DL, 48
MOV CX, 10; lặp 10 lần
BATDAU:
INT 21H
INC DL
LOOP BATDAU
…
…
LOOPZ (loop if zero: nhảy nếu bằng 0)
Nhảy vòng nếu cờ ZF =1.
LOOPNZ (loop if not zero: nhảy nếu khác 0)
Nhảy vòng nếu cờ ZF =0.
9. Nhóm lệnh gọi chương trình con
CALL (call: gọi): lệnh gọi chương trình con.
CALL Nhản (hoặc tên chương trình con)
Lệnh gọi chương trình con là một lệnh đặc biệt vì trước khi nhảy tới
nhãn thì CPU tự động lưu địa chỉ trở về (là địa chỉ sau lệnh CALL) vào
ngăn xếp.
RET (return: trở về). Lệnh kết thúc chương trình con.
Khi gặp lệnh này thì CPU 8086 lấy địa chỉ trở về ở ngăn xếp để tiếp tục
thi hành lệnh ở chương trình chính.
Ví dụ: Chương trình sau sử dụng Macro, Procedure.
INCHU Macro
mov ah,02
mov dl, 'A'
int 21h
ENDM
dulieu segment
thongbao db 'hello!$'
dulieu ends
malenh1 segment
P2 Proc far
mov ah,02
mov dl, 'C'
int 21h
ret
P2 Endp
malenh1 ends
malenh2 segment
malenh group malenh1, malenh2
assume cs: malenh, ds: dulieu
batdau: mov ax, dulieu
mov ds, ax ; khoi dong
lea dx, thongbao ; in thong bao nhap chuoi
Trang 9 Chủ biên Võ Thanh Ân
Giáo trình Assembler
mov ah, 09h
int 21h
inchu ;goi macro
call pinchu ;goi ctrinh con
call p2 ;goi ctrinh con
mov ah, 4ch
int 21h
PINCHU Proc near
mov ah,02
mov dl, 'B'
int 21h
ret
PINCHU Endp
malenh2 ends
end batdau
10.Nhóm lệnh tính toán số học
ADD (add: cộng): cộng 2 số nguyên, lấy nguồn cộng vào đích và kết
quả lưu ở đích.
ADD đích, nguồn
Đích là Reg, Mem; nguồn là Reg, Mem hoặc Immed.
Ví dụ:
MOV AL, 02
ADD AL, 06
(Sau 2 lệnh này AL = 08 tức là AL = 02+06)
INC (increment: tăng)
INC đích
Đích là Reg, Mem. Lệnh này tăng nội dung của đích lên 1 đơn vị.
Ví dụ:
MOV AL, 02
INC AL ;Sau 2 lệnh này AL = 3.
SUB (subtract: trừ ra): lấy đích trừ nguồn và kết quả lưu ở đích.
SUB đích, nguồn
Đích là Reg, Mem; nguồn là Reg, Mem hoặc Immed.
Ví dụ:
MOV AL, 09
SUB AL, 06
(Sau 2 lệnh này AL = 03 tức là AL = 09-06)
DEC (decrement: giảm)
DEC đích
Đích là Reg, Mem. Lệnh này giảm nội dung của đích xuống 1 đơn vị.
Ví dụ:
MOV AL, 02
DEC AL ;Sau 2 lệnh này AL = 1.
MUL (multiplication: phép nhân): nhân số không dấu.
MUL nguồn
Chủ biên Võ Thanh Ân Trang 10
Tổ CNTT - Trường Cao Đẳng Bến Tre
Nguồn là Reg, Mem. Lệnh này lấy thanh ghi tích luỹ (AX) nhân cho
nguồn.
Nếu nguồn 8bit thì số này được nhân AL và kết quả đặt trong AX.
Nếu nguồn là 16 bit, số này được nhân với AX và kết quả để trong
DX:AX (DX:AX là một số 32 bit, 16 bit cao trong DX và 16 bit thấp
trong AX).
Ví dụ:
MOV AL, 9
MOV BL, 2
MUL BL
(Sau 3 lệnh này AL có giá trị bằng 18).
DIV (division: phép chia): chia số không dấu.
DIV nguồn
Nguồn là Reg, Mem. Lệnh này lấy thanh ghi tích lũy (AX) chia cho
nguồn.
Nếu nguồn 8bit thì lấy AX chia cho nguồn, kết quả đặt trong AL và số
dư đặt trong AH.
Nếu nguồn là 16 bit thì lấy DX:AX chia cho nguồn. Thương số đặt trong
AX, số dư đặt trong DX.
Ví dụ:
MOV AX, 9520
MOV BL, 100
DIV BL
(Sau 3 lệnh này AL = 95 và AH = 20 vì 9520 : 100 = 95 và
dư 20).
11.Nhóm lệnh dịch chuyển và quay
SHL (logical shift left): dịch trái logic.
SHL đích, 1 ; dịch trái toán hạng đích 1 bit (dịch từ 2 bit trở lên
phải đặt số lần dịch trong CL).
SHL đích, CL; dịch trái toán hạng số bit bằng nội dung của CL.
7 2 1 0
CF
← ← ← 0
Toán hạng đích
Trong hình trên, giả sử toán hạng đích là 8bit thì lệnh SHL đích, 1 làm bít thứ 7
dịch sang bit CF (cờ), bít 6 chuyển sang bit7, bít5 sang bit6,… bit0 qua bit1 và số 0 vào
bit0.
SHR (logical shift right): dịch phải logic.
Lệnh này giống như SHL nhưng bây giờ dịch phải.
7 6
0 → →
0
→
CF
Toán hạng đích
Trong hình trên, giả sử toán hạng đích là 8bit thì lệnh SHR đích, 1 làm 0 vào bít7,
bit7 sang bít 6,… bit0 dịch sang bit CF (cờ).
Trang 11 Chủ biên Võ Thanh Ân
Giáo trình Assembler
SAL (shift arithmetic left): dịch trái số học.
Giống như lệnh SHL nhưng bit0 được giữ nguyên
7 2 1 0
CF
← ←
Toán hạng đích
SAR (shift arithmetic right): dịch phải số học.
Giống như lệnh SHL nhưng bit cao nhất được giữ nguyên.
7 6
→
0
→
CF
Toán hạng đích
ROL (rotate left): quay vòng sang trái.
ROL đích, 1 ; quay vòng sang trái toán hạng đích 1 bit (quay
vòng sang trái từ 2 bit trở lên phải đặt số lần dịch trong CL).
ROL đích, CL ; dịch trái toán hạng số bit bằng nội dung của CL.
7 2 1 0
CF
← ←
Toán hạng đích
ROR (rotate right): quay vòng sang phải (giống như quay vòng sang
trái nhưng bây giờ sang phải).
ROR đích, 1
ROL đích, CL
RCL (rotate through carry left): quay vòng qua bit số giữ sang trái,
giống như lệnh ROL nhưng có sự tham gia của bit số giữ.
7 2 1 0
CF
← ←
Toán hạng đích
RCR (rotate through carry right): quay vòng qua bit số giữ sang phải,
giống như lệnh RCL nhưng sang phải.
12.Nhóm lệnh logic
AND (and: và): lệnh này lấy từng bit của toán hạng đích and với từng
bit của toán hạng nguồn, kết quả lưu ở đích.
AND đích, nguồn
Đích là Reg, Mem; nguồn là Reg, Mem hoặc Immed.
Ví dụ:
MOV AL, 01010101B
AND AL, 00001111B
(Sau 2 lệnh này AL = 00000101B)
Chủ biên Võ Thanh Ân Trang 12
Tổ CNTT - Trường Cao Đẳng Bến Tre
OR (or: hoặc): lệnh này lấy từng bit của toán hạng đích or với từng bit
của toán hạng nguồn, kết quả lưu ở đích.
OR đích, nguồn
Đích là Reg, Mem; nguồn là Reg, Mem hoặc Immed.
Ví dụ:
MOV AL, 01010101B
OR AL, 00001111B
(Sau 2 lệnh này AL = 01011111B)
XOR (xor: hoặc loại): lệnh này lấy từng bit của toán hạng đích xor với
từng bit của toán hạng nguồn, kết quả lưu ở đích.
XOR đích, nguồn
Đích là Reg, Mem; nguồn là Reg, Mem hoặc Immed.
Ví dụ:
MOV AL, 01010101B
XOR AL, 00001111B
(Sau 2 lệnh này AL = 01011010B)
NOT (not: đảo): lệnh này lấy đảo từng bit của toán hạng đích.
NOT đích
Đích là Reg, Mem.
Ví dụ:
MOV AL, 01010101B
NOT AL
(Sau 2 lệnh này AL = 10101010B)
TEST (test: trắc nghiệm): lệnh này giống như lệnh AND nhưng không
lưu giữ kết quả mà chỉ ảnh hưởng đến các cờ.
TEST đích, nguồn
13.Nhóm lệnh xử lý chuỗi
MOVSB (move string byte): di chuyển chuỗi từng byte một.
MOVSW (move string word): di chuyển chuỗi từng 16 bit.
CMPSB (compare string byte): so sánh chuỗi từng byte một.
CMPSW (compare string word): so sánh chuỗi từng 16 bit.
SCASB (scan string byte): quét chuỗi từng byte một.
SCASW (scan string word): quét chuỗi từng 16 bit.
LODSB (load string byte): nạp chuỗi từng byte một.
LODSW (load string word): nạp chuỗi từng 16 bit.
STOSB (store string byte): lưu chuỗi từng byte một.
STOSW (store string word): lưu chuỗi từng 16 bit.
Cách dùng các lệnh giống nhau và thường phải qua các
bước sau:
Bước 1: Xác định chiều xử lý chuỗi.
DF = 0: chuỗi xử lý theo chiều địa chỉ tăng.
DF = 1: chuỗi xử lý theo chiều địa chỉ giảm.
Bước 2: Số lượng phần tử cần xử lý được nạp vào thanh ghi đếm CX.
Trang 13 Chủ biên Võ Thanh Ân
Giáo trình Assembler
Bước 3: Đưa địa chỉ của chuỗi vào đúng vị trí.
Địa chỉ chuỗi nguồn đưa vào DS:SI.
Địa chỉ chuỗi đích đưa vào ES:DI.
Bước 4: Chọn một vòng lặp thích hợp REP, REPE, REPNE.
Lệnh REP (repeat: lặp lại): lặp lại lệnh theo sau nó đến khi
CX=0.
Lệnh REPE (repeat if equal: lặp lại nếu bằng nhau): lặp lại lệnh
theo sau nó nếu ZF=1.
Lệnh REPNE (repeat if not equal: lặp lại nếu không bằng nhau):
lặp lại lệnh theo sau nó nếu ZF=0.
Bước 5: Đặt lệnh xử lý chuỗi thích hợp.
Ví dụ 1: Chuyển 100 byte từ ô nhớ nguồn đến ô nhớ đích.
CLD ;DF=0, SI và DI tự động tăng 1 sau mỗi lần lặp, ;lệnh
này được giới thiệu phần dưới.
LEA SI, nguồn
LEA DI, đích
MOV CX, 50
REP MOVSW ; Tự động chuyển 100 byte.
Ví dụ 2: So sánh 10 byte của 2 vùng ô nhớ trong DS.
CLD ;DF=0, muốn DF=1 ta dùng lệnh STD.
PUSH DS
PUSH ES
MOV SI, 7000H
MOV DI, F000H
MOV CX, 10
REPE CMPSB
JNZ NOTEQ ;NOTEQ là một nhãn chương trình sẽ nhảy
;tới nếu xuất hiện 2 byte không giống nhau.
Ví dụ 3: Tìm chữ 'A' trong chuỗi 100 ký tự.
CLD ;DF=0, muốn DF=1 ta dùng lệnh STD.
MOV CX, 100
LEA DI, chuỗi
MOV AL, 'A'
REPNE SCASB ;so sánh mỗi byte của chuỗi với ký tự 'A'.
JCXZ NOTE ;NOTE là một nhãn chương trình sẽ nhảy
;tới nếu không tìm thấy 'A'.
;(jump if CX equal zero)
14.Các lệnh khác
CLC (clear carry flag): xóa cờ zero - CF.
CLD (clear direction flag): xóa cờ hướng - DF.
CLD (clear interrupt flag): xóa cờ ngắt - IF.
CMC (complement carry flag): đổi ngược cờ CF.
Chủ biên Võ Thanh Ân Trang 14
Không có nhận xét nào:
Đăng nhận xét