KY THUAT VI XU LI
Chia sẻ bởi Hồ Minh Sắc |
Ngày 29/04/2019 |
68
Chia sẻ tài liệu: KY THUAT VI XU LI thuộc Bài giảng khác
Nội dung tài liệu:
Bài giảng Kỹ thuật Vi xử lý
Ngành Điện tử-Viễn thông Đại học Bách khoa Đà Nẵng
của Hồ Viết Việt, Bộ môn KTMT, Khoa ĐTVT
Tài liệu tham khảo
[1] Văn Thế Minh, Kỹ thuật vi xử lý, NXB Giáo dục, 1997
[2] Đỗ Xuân Tiến, Kỹ thuật vi xử lý và Lập trình Assembly cho hệ vi xử lý, NXB Khoa học & Kỹ thuật, 2001
[3] Barry B. Brey, The Intel Microprocessors 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium II, Pentium III, Pentium 4 Architecture, Programming, and Interfacing, 6th Edition, Prentice Hall, 2003
Chương 3
BỘ VI XỬ LÝ 8086/8088 của INTEL
3.1 Kiến trúc và hoạt động của 8086/8088
- Nguyên lý hoạt động
- Chu kỳ lệnh, Chu kỳ máy
- Pipelining
- Sơ đồ khối chức năng
3.2 Cấu trúc thanh ghi của 8086/8088
3.3 Phương pháp quản lý bộ nhớ
3.4 Mô tả tập lệnh Assembly
Lấy lệnh - Giải mã lệnh - Thực hiện lệnh
Tìm và copy
các byte lệnh từ bộ nhớ
Giải mã lệnh
Tạo ra các tín hiệu điều khiển
để thực hiện lệnh
3.1 Kiến trúc và Hoạt động của 8086/8088
3 hoạt động của một bộ vi xử lý:
Khái niệm Chu kỳ lệnh và Chu kỳ máy
Chu kỳ lệnh: Tổng thời gian tìm lệnh, giải mã lệnh và thực hiện 1 lệnh
Nói chung, Chu kỳ lệnh của các lệnh khác nhau là khác nhau
Chu kỳ lệnh bao giờ cũng bằng một số nguyên lần chu kỳ máy
Chu kỳ máy: Nghịch đảo của tần số hoạt động (tốc độ đồng hồ) của bộ vi xử lý
Không Pipelining
Một thủ tục đơn giản gồm 3 bước:
Lấy lệnh từ bộ nhớ
Giải mã lệnh
Thực hiện lệnh:
Lấy các toán hạng từ bộ nhớ (nếu có)
Lưu trữ kết quả
Fetch
1
Decode
1
Execute
1
Fetch
2
Decode
2
Execute
2
…...
Busy
Idle
Busy
…...
Busy
Idle
Busy
Microprocessor
Bus
Cơ chế Pipelining
Sơ đồ khối chức năng của 8088
Đơn vị giao tiếp Bus - BIU
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 I thông qua D-Bus
Ghi dữ liệu ra các cổng O thông qua D-Bus
Đơn vị thực hiện - EU
Bao gồm CU và ALU
CU : Giải mã lệnh để tạo ra các tín hiệu điều khiển nhằm thực hiện lệnh đã được giải mã
ALU: thực hiện các thao tác khác nhau đối với các toán hạng của lệnh
3.2 Cấu trúc thanh ghi của 8086/8088
8086/8088 có 14 thanh ghi 16-bit, gồm các nhóm:
Các thanh ghi đa năng, segment và offset của 8086/8088
AH
BH
CH
DH
AL
BL
CL
DL
0
7
0
7
0
15
Accumulator
Base
Counter
Data
Instruction Pointer
Stack Pointer
Base Pointer
Source Index
Destination Index
}
}
}
AX
BX
CX
DX
AH
BH
CH
DH
AL
BL
CL
DL
0
7
0
7
Accumulator
Base
Counter
Data
AX
BX
CX
DX
Có thể truy cập như các thanh ghi 8-bit
Lưu trữ tạm thời dữ liệu để truy cập nhanh hơn
và tránh khỏi phải truy cập bộ nhớ
- Có công dụng đặc biệt đối với một số câu lệnh
Các thanh ghi đa năng
Các thanh ghi segment
Lưu trữ địa chỉ segment của một ô nhớ cần truy cập
Kết hợp với các thanh ghi offset nhất định
Lưu trữ địa chỉ offset của một ô nhớ cần truy cập
Kết hợp với các thanh ghi segment nhất định
Các thanh ghi offset
Instruction Pointer
Stack Pointer
Base Pointer
Source Index
Destination Index
x
x
x
x
OF
DF
IF
TF
SF
ZF
x
AF
x
PF
x
CF
0
15
Thanh ghi cờ 16-bit của 8086/8088
- Không phải tất cả các bit đều được sử dụng
- Mỗi bit được sử dụng được gọi là một cờ
- Các cờ đều có tên và có thể được Lập/Xoá riêng lẽ
- Bao gồm các cờ trạng thái và các cờ điều khiển
3.3 Phương pháp quản lý bộ nhớ
- Bộ nhớ được xem là một tập hợp các ô nhớ
- Mỗi ô nhớ được nhận dạng bằng một Địa chỉ vật lý duy nhất 20-bit
- Trong hoạt động truy cập một ô nhớ, Địa chỉ vật lý của nó được tạo ra từ hai giá trị 16-bit: Địa chỉ segment và Địa chỉ Offset
- Địa chỉ logic = Địa chỉ segment:Địa chỉ offset
Mối liên hệ
giữa Địa chỉ vật lý và Địa chỉ logic của một ô nhớ
Dịch địa chỉ segment sang trái 4 bit rồi cộng với địa chỉ offset sẽ nhận được địa chỉ vật lý:
Địa chỉ logic 0000:0010
Địa chỉ vật lý: 00000+0010 = 00010
Địa chỉ logic 1234:0010
Địa chỉ vật lý: 12340+0010 = 12350
Địa chỉ logic 4C56:0016
Địa chỉ vật lý: 4C560+0016 = 4C576
Địa chỉ vật lý: 00010
Địa chỉ logic: 0000:0010, 0001:0000
Địa chỉ vật lý: 00020
Địa chỉ logic: 0000:0020, 0002:0000, 0001:0010
3.4 Mô tả tập lệnh Assembly của 8086/8088
Khuôn dạng: Mnemonics Các toán hạng
Nhóm lệnh chuyển số liệu
- Nhóm lệnh số học
Nhóm lệnh logic
Nhóm lệnh Rẽ nhánh
Nhóm lệnh thao tác string
Nhóm lệnh hỗn hợp
Nhóm lệnh chuyển số liệu
Data Transfer Instructions
Chuyển số liệu (sao chép số liệu) từ vị trí này sang vị trí khác
Nguồn số liệu không thay đổi
Đich sẽ có giá trị như giá trị của Nguồn
Các lệnh chuyển số liệu không ảnh hưởng đến các cờ trạng thái trên thanh ghi cờ
Một số lệnh tiêu biểu: MOV, XCHG
MOV
Khuôn dạng: MOV Đích,Nguồn
Tác dụng: (Đích) (Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Một số lưu ý đối với MOV
Đích và Nguồn phải có cùng kích cỡ
Đích và Nguồn không thể đồng thời thuộc bộ nhớ
Nếu Đích là một thanh ghi segment của VXL thì Nguồn không thể là một giá trị cụ thể (nói cách khác, không thể nạp giá trị trực tiếp cho một thanh ghi segment bằng lệnh MOV)
XCHG
Khuôn dạng: XCHG T/h1,T/h2
Tác dụng: (T/h1) tráo đổi với (T/h2)
T/h1: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
T/h2: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Một số lưu ý đối với XCHG
T/h1 và T/h2 phải có cùng kích cỡ
T/h1 và T/h2 không thể đồng thời thuộc bộ nhớ
T/h1 và T/h2 không thể là các thanh ghi segment
Các mode địa chỉ
Khi thực hiện lệnh, VXL sẽ thực hiện những thao tác nhất định trên số liệu, các số liệu này được gọi chung là các toán hạng.
Các toán hạng trong một câu lệnh có thể là một phần của câu lệnh (ở dạng mã máy), có thể nằm ở một thanh ghi của VXL hoặc ở Bộ nhớ
Cách xác định toán hạng trong các câu lệnh được gọi là các mode (định) địa chỉ
Các mode địa chỉ
Mode địa chỉ thanh ghi: MOV AX,BX
Mode địa chỉ tức thì: MOV AL,55h
Các mode địa chỉ bộ nhớ: Các cách thức xác định địa chỉ vât lý của toán hạng nằm trong bộ nhớ:
Mode địa chỉ trực tiếp
Các mode địa chỉ gián tiếp …
Mode địa chỉ trực tiếp
(Direct Addressing Mode)
Mode địa chỉ gián tiếp thanh ghi
(Register Indirect Addressing Mode)
Nhớ các mode địa chỉ bộ nhớ như thế nào?
Tất cả bắt đầu trong bảng sau đây:
Lấy ra 0 hoặc 1 phần tử từ mỗi cột
(Không lấy 2 phần tử từ một cột)
Phải lấy ít nhất 1 phần tử từ bảng
Các ví dụ
Các ví dụ
Các ví dụ
Nhóm lệnh Số học
Bên cạnh tác dụng, cần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng thái
Các lệnh số học th/thường: ADD, SUB, …
Các lệnh số học khác: CMP. NEG, INC, DEC, …
Ảnh hưởng đến các cờ trạng thái
CF
OF Phụ thuộc vào quá trình thực hiện phép toán
AF
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
ADD
Khuôn dạng: ADD Đích,Nguồn
Tác dụng: (Đích) (Đích)+(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Ảnh hưởng của ADD
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
CF được lập nếu tràn không dấu (có nhớ từ MSB)
OF được lập nếu tràn có dấu:
- Có nhớ từ MSB, Không có nhớ vào MSB
- Có nhớ vào MSB, Không có nhớ từ MSB
AF được lập nếu có nhớ từ nibble thấp vào nibble cao (từ bit 3 vào bit 4)
Các cờ trên thanh ghi cờ
Các bit nhất định trên thanh ghi cờ điều khiển hoạt động hoặc phản ánh trạng thái của vi xử lý
Các cờ điều khiển (TF, IF, DF)
Quyết định cách đáp ứng của vi xử lý trong các tình huống nhất định
Các cở trạng thái (CF, PF, AF, ZF, SF, OF)
Bị ảnh hưởng bởi các phép toán nhất định
Phục vụ cho các lệnh có điều kiện
Các cờ điều khiển
DF - Direction flag (Cờ hướng)
DF = 1: huớng xuống
DF = 0: hướng lên
IF – Interrupt flag (Cờ ngắt)
IF = 1: cho phép ngắt ngoài
IF = 0: cấm ngắt ngoài (đối với ngắt che được)
TF - Trace flag
TF = 1: vi xử lý thực hiện từng lệnh một
SUB
Khuôn dạng: SUB Đích,Nguồn
Tác dụng: (Đích) (Đích)-(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Ảnh hưởng của SUB
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
CF được lập nếu tràn không dấu (có mượn vào MSB)
OF được lập nếu tràn có dấu:
- Có mượn vào MSB, Không có mượn từ MSB
- Có mượn từ MSB, Không có mượn vào MSB
AF được lập nếu có mượn từ nibble cao vào nibble thấp (từ bit 4 vào bit 3)
CMP
Khuôn dạng: CMP Đích,Nguồn
Tác dụng: (Đích)-(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
INC, DEC, NEG
INC T/h
Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
Tác dụng: (T/h) (T/h)+1
DEC T/h
Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
Tác dụng: (T/h) (T/h)-1
Lưu ý: Các lệnh INC và DEC không ảnh hưởng đến cờ CF
Lệnh NEG T/h: Đảo dấu của T/h (Lấy bù 2)
Lệnh NEG sẽ lập cờ OF nếu giá trị của T/h là giá trị âm nhất trong dải giá trị của các số có dấu tương ứng
Nhóm lệnh Logic
Các lệnh logic th/thường: NOT, AND, OR, XOR
Cần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng thái:
NOT không ảnh huởng đến các cờ trạng thái.
Các lệnh AND, OR, XOR:
CF = 0
OF = 0
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
AF không xác định
Một số ví dụ
1100 1010
NOT AL
AL
0011 0101
AL
AL
BL
0011 0101
0110 1101
AND AL, BL
0010 0101
AL
AL
BL
0011 0101
0110 1101
OR AL, BL
0111 1101
AL
AL
BL
0011 0101
0110 1101
XOR AL, BL
0101 1000
AL
AL
BL
0011 0101
0000 1111
AND AL, BL
0000 0101
AL
AL
BL
0011 0101
0000 1111
OR AL, BL
0011 1111
AL
Một số ứng dụng
Bài toán Xoá bit: Xoá một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Lập bit: Lập một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Đảo bit: Đảo một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Kiểm tra bit: Xác định một bit nào đó của một toán hạng là bằng 0 hay 1 mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó (thông qua giá trị của một cờ trạng thái, ví dụ ZF)
Nhóm lệnh logic
Các lệnh logic khác: Lệnh TEST, Các lệnh dịch (Shift) và Các lệnh quay (Rotate)
Lệnh TEST chỉ khác lệnh AND là không giữ lại kết quả của phép toán
Các lệnh dịch và Các lệnh quay đều có hai khuôn dạng:
Khuôn dạng 1: Mnemonic Toán hạng,1
Khuôn dạng 2: Mnemonic Toán hạng,CL
Tác dụng của một câu lệnh theo khuôn dang 2 giống như tác dụng liên tiếp của N câu lệnh tương ứng theo khuôn dạng 1, với N là giá trị của thanh ghi CL
Các lệnh Dịch trái: SHL, SAL
Shift right SHR
Shift right SAR
(Quay trái/phải thông qua carry)
Rotate left/right
(Quay trái/phải không qua carry)
ROL
Nhóm lệnh rẽ nhánh
Làm thay đổi trật tự thực hiện lệnh bình thường của vi xử lý
Lệnh nhảy không điều kiện: JMP
Các lệnh nhảy có điều kiện: Jxxx
Lệnh lặp: LOOP và các biến thể của nó
Các lệnh có liên quan đến Chương trình con:
- CALL (gọi chương trình con)
- RET (trở về chương trình gọi)
Các lệnh có liên quan đến Chương trình con phục vụ ngắt
- INT (gọi chương trình con phục vụ ngắt - Gọi ngắt)
- IRET (quay về chương trình gọi ngắt)
Lệnh nhảy không điều kiện
JMP nhãn
Nhảy gần: E9 xx xx (3 byte)
Nhảy ngắn: EB xx (2 byte)
Nhảy xa: EA xx xx xx xx (5 byte)
Nhãn: tên do ngườI lập trình tự đặt ra theo qui tắc đặt tên của Assembler và có thể đặt vào trước một câu lệnh bất kỳ trong chương trình cùng với dấu :
nhãn: Câu lệnh cần thực hiện
Nhãn sẽ được dịch thành địa chỉ
Khoảng cách nhảy: Khoảng cách đại số (có dấu) từ lệnh nhảy đến lệnh cần thực hiện
Cơ chế thực hiện lệnh nhảy
Các lệnh nhảy ngắn và gần chỉ làm thay đổi giá trị của thanh ghi IP
Lệnh nhảy ngắn cộng khoảng cách nhảy 8-bit có dấu vào giá trị hiện thời của IP
Lệnh nhảy gần cộng khoảng cách nhảy 16-bit có dấu vào giá trị hiện thời của IP
Lệnh nhảy xa làm thay đổi cả CS và IP
Gán cho CS và IP các giá trị mới
Các lệnh nhảy có điều kiện
Jxxx nhãn
Có gần 40 menmonic khác nhau
Các lệnh nhảy điều kiện đơn: phụ thuộc vào giá trị của 1 cờ.
JNZ/JNE - Nhảy nếu cờ ZF = 0, nghĩa là kết quả của phép toán trước đó khác không
JC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó lập cờ carry
JZ/JE (ZF = 1)
JNC (CF = 0)
Các lệnh nhảy có điều kiện
Tất cả các lệnh nhảy có điều kiện phải là nhảy ngắn
khoảng cách nhảy: -128 to +127 bytes
Tổ hợp với lệnh nhảy không điều kiện để có thể vượt qua giới hạn này.
Các lệnh nhảy điều kiện kép: phụ thuộc vào giá trị của nhiều cờ
JB/JNAE
JNL/JGE
ứng dụng của các lệnh nhảy có điều kiện
Kết hợp với JMP để xây dựng các cấu trúc lập trình cơ bản:
- Cấu trúc điều kiện
- Cấu trúc lặp
Các lệnh nhảy thường theo sau các lệnh làm thay đổi giá trị của các cờ trạng thái:
CMP
TEST …
Cấu trúc điều kiện
mov ax,n
cmp ax,7
jz nhan1; ZF = 1
CONGVIEC1
jmp nhan2
nhan1:CONGVIEC2
nhan2:lệnh 3
Cấu trúc lặp
mov ax,n
nhan1: cmp ax,0
jz nhan2
lệnhi
sub ax,2
jmp nhan1
nhan2: lệnhk
Lệnh LOOP
LOOP nhan
Giảm CX đi 1
Nếu (CX) khác 0 thì JMP nhan. Nếu không thì tiếp tục thực hiện lệnh theo trật tự bình thường
mov cx,9
nhan: lệnh 1
lệnh 2
lệnh 3
loop nhan
LOOPZ/E và LOOPNZ/E
Đây là các biến thể của LOOP
Giá trị của cờ ZF có thể làm kết thúc sớm vòng lặp
LOOPZ: Lặp khi (CX) khác 0 và ZF =1
LOOPNZ: Lặp khi (CX) khác 0 và ZF =0
Lưu ý: Các lệnh LOOP giảm CX nhưng không ảnh huởng đến các cờ
LOOPZ == LOOPE
LOOPNZ==LOOPNE
Các lệnh trong vòng lặp có thể tác động đến cờ ZF (CMP, TEST)
Chương trình con
Chương trình con trong ngôn ngữ Assembly được gọi là Thủ tục (Procedure)
Một thủ tục có thể được thực hiện nhiều lần
Stack là cơ cở của chương trình con:
- Stack lưu giữ Địa chỉ quay về
- Stack lưu giữ giá trị của các thanh ghi của vi xử lý (nếu cần)
Stack
Cấu trúc dữ liệu LIFO ở RWM
- PUSH : ghi dữ liệu vào stack,
- POP: đọc dữ liệu từ stack
(SS:SP) trỏ đến đỉnh của stack (theo LIFO)
(SS:BP) truy cập stack ngẫu nhiên (không theo LIFO)
PUSH
PUSH nguồn
Push nguồn vào stack
PUSHF
Push thanh ghi cờ vào stack
Lệnh PUSH trước hết sẽ giảm SP đi 2 rồi lưu giá trị của nguồn vào vị trị nhớ được trỏ bởi (SS:SP)
Ví dụ PUSH
PUSH AX
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0006
01
06
4C
SS:0340
AX: 0123
POP
POP đích
Pop dữ liệu từ đỉnh stack vào đích
POPF
Pop dữ liệu từ đỉnh stack vào thanh ghi cờ
Lệnh POP trước hết copy dữ liệu được trỏ bởi (SS:SP) đến đích rồi tăng SP lên 2
Ví dụ POP
POP ES
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0008
01
06
4C
SS:0340
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0006
01
06
4C
SS:0340
ES: 0123
Tràn stack!
Stack Overflow
Stack Underflow
SP:000D
SS:0340
Stack Size: 000C
SP:FFFE
SS:0340
Stack Size: 000C
Khai báo thủ tục
Tên_Thủ_tục PROC kiểu
;thân của thủ tục
RET ;quay về chuơng trình gọi
Tên_Thủ_tục ENDP
kiểu là NEAR hoặc FAR
ngầm định là NEAR
Một thủ tục có thể có nhiều lệnh RET
Lệnh CALL và RET
Gọi một thủ tục (NEAR)
CALL Tên_Thủ_tục
push IP vào stack
copy địa chỉ của Tên_Thủ_tục vào IP
Trở về từ một thủ tục (NEAR)
RET
pop giá trị ở đỉnh stack vào IP
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
Gọi ngắt
Gọi ngắt là một lời gọi thủ tục đặc biêt
FAR
Thanh ghi cờ phải được bảo toàn
INT Số ngắt
Thanh ghi cờ được push, TF và IF bị xoá
CS và rồI IP được push
Địa chỉ của một chương trình con phục vụ ngắt (Vector ngắt) tương ứng với Số ngắt được copy vào CS và IP
Trở về từ ngắt
IRET
Tác dụng của lênh:
Giá trị ở đỉnh của stack được pop vào IP
Giá trị ở đỉnh của stack được pop vào CS
Giá trị ở đỉnh của stack được pop vào thanh ghi cờ
Chương trình bị ngắt tiếp tục thực hiện dường như không có chuyện gì xảy ra
Xuất ký tự ra màn hình PC
Ngắt 21h
Ngắt này hỗ trợ rất nhiều dịch vụ trên PC
Nhận dạng dịch vụ bằng số dịch vụ (số hàm). Số dịch vụ cần được nạp voà thanh ghi AH
Tuỳ theo từng dịch vụ, có thể cần thêm một số đối số khác được nạp vào các thanh ghi xác định
AH = 2, DL = Mã ASCII của ký tự cần xuất
Ký tự được hiển thị tại vị trí hiện thời của con trỏ
Xuất xâu ký tự ra màn hình PC
Dịch vụ 09h của ngắt 21h
DX = Địa chỉ Offset của xâu (trong đoạn dữ liệu)
DS = Địa chỉ segment của xâu
Xâu ký tự phải kết thúc bằng ký tự `$`
Để nạp địa chỉ offset của xâu vào DX, có thể:
LEA DX, Tênxâu
MOV DX, OFFSET Tên xâu
Nhập 1 ký tự từ bàn phím PC
Dịch vụ 01h của ngắt 21h
Khi NSD gõ một ký tự từ bàn phím:
Ký tự sẽ hiện trên màn hình
AL sẽ chứa mã ASCII của ký tự đó
AL=0 nếu ký tự được nhập là ký tự điều khiển
Nhóm lệnh thao tác string
Chúng ta hiểu: string là một mảng byte hoặc từ nằm trong bộ nhớ
Các thao tác string:
Sao chép
Tìm kiếm
Lưu trữ
So sánh
Các đặc điểm
Nguồn: (DS:SI), Đích: (ES:DI)
DS, ES chứa Địa chỉ Segment của string
SI, DI chứa Địa chỉ Offset của string
Cờ hướng DF (0 = Up, 1 = Down)
DF = 0 - Tăng địa chỉ (trái qua phải)
DF = 1 - Giảm địa chỉ (phảI qua trái)
Chuyển (Sao chép)
MOVSB, MOVSW
Chuyển 1 byte hoặc 1 word từ vị trí nhớ này sang vị trí nhớ khác
Tác dụng của lệnh:
Sao chép byte/word từ (DS:SI) đến (ES:DI)
Tăng/Giảm SI và DI 1 hoặc 2 giá trị
Nếu CX chứa một giá trị khác không:
REP MOVSB hoặc REP MOVSW sẽ tự động sao chép (CX) lần và CX sẽ về không
Ví dụ:Sao chép mảng
; Sao chép 10 byte từ mảng a sang mảng b, giả sử (DS) = (ES)
mov cx, 10
mov di, offset b
mov si, offset a
cld ;xoá cờ DF
rep movsb
Ví dụ: Tịnh tiến các ô nhớ
mov cx, 7
mov di, offset a+9
mov si, offset a+6
std ;lập cờ DF
rep movsb
DI
a
SI
Ví dụ
pattern db "!@#*"
db 96 dup (?)
mov cx,96
mov si, offset pattern
mov di, offset pattern+4
cld
rep movsb
!
@
#
*
DI
a
SI
Lưu trữ string
STOSB, STOSW
Copy AL hoặc AX vào một mảng byte hoặc word
Đích (ES:DI)
Tăng hoặc Giảm DI
phụ thuộc DF
Thường được sử dụng có tiền tố REP và số lần lặp trong CX
Ví dụ:
arr dw 200 dup (?)
mov ax,50A0h
mov di,offset arr
mov cx,200
cld
rep stosw
A0
50
A0
50
arr
50
A0
AX
DI
Nạp String
LODSB, LODSW
Byte hoặc word tại (DS:SI) được copy vào AL hoặc AX
SI tăng hoặc giảm 1 hoặc 2 giá trị phụ thuộc DF
Thường được dùng với STOSx trong một vòng lặp để xử lý từng phần tử trong một mảng
Ví dụ:
mov di, offset b
mov si, offset a
mov cx,30
cld
lp:
lodsb
and al,0DFh
stosb
loop lp
Quét String
SCASB, SCASW
So sánh AL hoặc AX với byte hoặc word tạI (ES:DI) và tự động tăng hoặc giảm DI
Lệnh này ảnh hưởng đến các cờ trạng thái
Tuỳ theo kết quả so sánh
Dùng trong một vòng lặp REPs
REPZ, REPE, REPNZ, REPNE
Ví dụ
arr db `abcdefghijklmnopqrstuvwxyz`
mov di, offset arr
mov cx,26
cld
mov al,target
repne scasb
jne nomatch
So sánh String
CMPSB, CMPSW
So sánh byte hoặc word tại (DS:SI) với byte hoặc word tạI (ES:DI), tác động đến các cờ và tăng hoặc giảm SI và DI
Thường dùng để so sánh hai mảng với nhau
Ví dụ
mov si, offset str1
mov di, offset str2
cld
mov cx, 12
repe cmpsb
jl str1smaller
jg str2smaller
;the strings are equal - so far
;if sizes different, shorter string is less
Nhóm lệnh hỗn hợp
- Các lệnh Lập/Xoá trực tiếp các cờ:
STC, CLC
STD, CLD
STI, CLI
- Lệnh NOP (No Operation): Không làm gì!!!
- Lệnh NOP thường được dùng trong các vòng lặp tạo trễ (delay)bằng phần mềm
- Các lệnh Nhập/Xuất dữ liệu đối với các cổng I/O
IN
OUT
Lệnh IN
Nếu Địa chỉ của cổng nhỏ hơn hoặc bằng FFh:
IN Acc, Địa chỉ cổng
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
Nếu Địa chỉ của cổng lớn hơn FFh:
MOV DX, Địa chỉ cổng
IN Acc, DX
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
Lệnh OUT
Nếu Địa chỉ của cổng nhỏ hơn hoặc bằng FFh:
OUT Địa chỉ cổng, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
Nếu Địa chỉ của cổng lớn hơn FFh:
MOV DX, Địa chỉ cổng
OUT DX, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
Tóm tắt chương
-Tính tương thích về Cấu trúc thanh ghi của các vi xử lý họ x86
-Tính tương thích về Tập lệnh của các vi xử lý họ x86
Tính tương thích về
Cấu trúc thanh ghi
của các vi xử lý họ x86
Accumulator
EAX
AH
AL
AX
Base
EBX
BH
BL
BX
Count
ECX
CH
CL
CX
Data
EDX
DH
DL
DX
General Purpose
Instr Pointer
EIP
IP
Flags
EFLAG
FLAG
Special Registers
Stack Segment
Code Segment
CS
Data Segment
DS
Extra Segment
ES
SS
FS
GS
Segment Registers
Stack Pointer
ESP
SP
Base Pointer
EBP
BP
Dest Index
EDI
DI
Source Index
ESI
SI
Index Registers
Thanh ghi cờ 32-bit
8086, 8088, 80186
80286
80386, 80486DX
80486SX
AC (Alignment check)
(VM) Virtual mode
(RF) Resume
(NT) Nested task
(IOPL) Input/output
privilege level
(O) Overflow
(D) Direction
(I) Interrupt
(T) Trace
(S) Sign
(Z) Zero
(A) Auxiliary Carry
(P) Parity
(C) Carry
Ngành Điện tử-Viễn thông Đại học Bách khoa Đà Nẵng
của Hồ Viết Việt, Bộ môn KTMT, Khoa ĐTVT
Tài liệu tham khảo
[1] Văn Thế Minh, Kỹ thuật vi xử lý, NXB Giáo dục, 1997
[2] Đỗ Xuân Tiến, Kỹ thuật vi xử lý và Lập trình Assembly cho hệ vi xử lý, NXB Khoa học & Kỹ thuật, 2001
[3] Barry B. Brey, The Intel Microprocessors 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium II, Pentium III, Pentium 4 Architecture, Programming, and Interfacing, 6th Edition, Prentice Hall, 2003
Chương 3
BỘ VI XỬ LÝ 8086/8088 của INTEL
3.1 Kiến trúc và hoạt động của 8086/8088
- Nguyên lý hoạt động
- Chu kỳ lệnh, Chu kỳ máy
- Pipelining
- Sơ đồ khối chức năng
3.2 Cấu trúc thanh ghi của 8086/8088
3.3 Phương pháp quản lý bộ nhớ
3.4 Mô tả tập lệnh Assembly
Lấy lệnh - Giải mã lệnh - Thực hiện lệnh
Tìm và copy
các byte lệnh từ bộ nhớ
Giải mã lệnh
Tạo ra các tín hiệu điều khiển
để thực hiện lệnh
3.1 Kiến trúc và Hoạt động của 8086/8088
3 hoạt động của một bộ vi xử lý:
Khái niệm Chu kỳ lệnh và Chu kỳ máy
Chu kỳ lệnh: Tổng thời gian tìm lệnh, giải mã lệnh và thực hiện 1 lệnh
Nói chung, Chu kỳ lệnh của các lệnh khác nhau là khác nhau
Chu kỳ lệnh bao giờ cũng bằng một số nguyên lần chu kỳ máy
Chu kỳ máy: Nghịch đảo của tần số hoạt động (tốc độ đồng hồ) của bộ vi xử lý
Không Pipelining
Một thủ tục đơn giản gồm 3 bước:
Lấy lệnh từ bộ nhớ
Giải mã lệnh
Thực hiện lệnh:
Lấy các toán hạng từ bộ nhớ (nếu có)
Lưu trữ kết quả
Fetch
1
Decode
1
Execute
1
Fetch
2
Decode
2
Execute
2
…...
Busy
Idle
Busy
…...
Busy
Idle
Busy
Microprocessor
Bus
Cơ chế Pipelining
Sơ đồ khối chức năng của 8088
Đơn vị giao tiếp Bus - BIU
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 I thông qua D-Bus
Ghi dữ liệu ra các cổng O thông qua D-Bus
Đơn vị thực hiện - EU
Bao gồm CU và ALU
CU : Giải mã lệnh để tạo ra các tín hiệu điều khiển nhằm thực hiện lệnh đã được giải mã
ALU: thực hiện các thao tác khác nhau đối với các toán hạng của lệnh
3.2 Cấu trúc thanh ghi của 8086/8088
8086/8088 có 14 thanh ghi 16-bit, gồm các nhóm:
Các thanh ghi đa năng, segment và offset của 8086/8088
AH
BH
CH
DH
AL
BL
CL
DL
0
7
0
7
0
15
Accumulator
Base
Counter
Data
Instruction Pointer
Stack Pointer
Base Pointer
Source Index
Destination Index
}
}
}
AX
BX
CX
DX
AH
BH
CH
DH
AL
BL
CL
DL
0
7
0
7
Accumulator
Base
Counter
Data
AX
BX
CX
DX
Có thể truy cập như các thanh ghi 8-bit
Lưu trữ tạm thời dữ liệu để truy cập nhanh hơn
và tránh khỏi phải truy cập bộ nhớ
- Có công dụng đặc biệt đối với một số câu lệnh
Các thanh ghi đa năng
Các thanh ghi segment
Lưu trữ địa chỉ segment của một ô nhớ cần truy cập
Kết hợp với các thanh ghi offset nhất định
Lưu trữ địa chỉ offset của một ô nhớ cần truy cập
Kết hợp với các thanh ghi segment nhất định
Các thanh ghi offset
Instruction Pointer
Stack Pointer
Base Pointer
Source Index
Destination Index
x
x
x
x
OF
DF
IF
TF
SF
ZF
x
AF
x
PF
x
CF
0
15
Thanh ghi cờ 16-bit của 8086/8088
- Không phải tất cả các bit đều được sử dụng
- Mỗi bit được sử dụng được gọi là một cờ
- Các cờ đều có tên và có thể được Lập/Xoá riêng lẽ
- Bao gồm các cờ trạng thái và các cờ điều khiển
3.3 Phương pháp quản lý bộ nhớ
- Bộ nhớ được xem là một tập hợp các ô nhớ
- Mỗi ô nhớ được nhận dạng bằng một Địa chỉ vật lý duy nhất 20-bit
- Trong hoạt động truy cập một ô nhớ, Địa chỉ vật lý của nó được tạo ra từ hai giá trị 16-bit: Địa chỉ segment và Địa chỉ Offset
- Địa chỉ logic = Địa chỉ segment:Địa chỉ offset
Mối liên hệ
giữa Địa chỉ vật lý và Địa chỉ logic của một ô nhớ
Dịch địa chỉ segment sang trái 4 bit rồi cộng với địa chỉ offset sẽ nhận được địa chỉ vật lý:
Địa chỉ logic 0000:0010
Địa chỉ vật lý: 00000+0010 = 00010
Địa chỉ logic 1234:0010
Địa chỉ vật lý: 12340+0010 = 12350
Địa chỉ logic 4C56:0016
Địa chỉ vật lý: 4C560+0016 = 4C576
Địa chỉ vật lý: 00010
Địa chỉ logic: 0000:0010, 0001:0000
Địa chỉ vật lý: 00020
Địa chỉ logic: 0000:0020, 0002:0000, 0001:0010
3.4 Mô tả tập lệnh Assembly của 8086/8088
Khuôn dạng: Mnemonics Các toán hạng
Nhóm lệnh chuyển số liệu
- Nhóm lệnh số học
Nhóm lệnh logic
Nhóm lệnh Rẽ nhánh
Nhóm lệnh thao tác string
Nhóm lệnh hỗn hợp
Nhóm lệnh chuyển số liệu
Data Transfer Instructions
Chuyển số liệu (sao chép số liệu) từ vị trí này sang vị trí khác
Nguồn số liệu không thay đổi
Đich sẽ có giá trị như giá trị của Nguồn
Các lệnh chuyển số liệu không ảnh hưởng đến các cờ trạng thái trên thanh ghi cờ
Một số lệnh tiêu biểu: MOV, XCHG
MOV
Khuôn dạng: MOV Đích,Nguồn
Tác dụng: (Đích) (Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Một số lưu ý đối với MOV
Đích và Nguồn phải có cùng kích cỡ
Đích và Nguồn không thể đồng thời thuộc bộ nhớ
Nếu Đích là một thanh ghi segment của VXL thì Nguồn không thể là một giá trị cụ thể (nói cách khác, không thể nạp giá trị trực tiếp cho một thanh ghi segment bằng lệnh MOV)
XCHG
Khuôn dạng: XCHG T/h1,T/h2
Tác dụng: (T/h1) tráo đổi với (T/h2)
T/h1: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
T/h2: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Một số lưu ý đối với XCHG
T/h1 và T/h2 phải có cùng kích cỡ
T/h1 và T/h2 không thể đồng thời thuộc bộ nhớ
T/h1 và T/h2 không thể là các thanh ghi segment
Các mode địa chỉ
Khi thực hiện lệnh, VXL sẽ thực hiện những thao tác nhất định trên số liệu, các số liệu này được gọi chung là các toán hạng.
Các toán hạng trong một câu lệnh có thể là một phần của câu lệnh (ở dạng mã máy), có thể nằm ở một thanh ghi của VXL hoặc ở Bộ nhớ
Cách xác định toán hạng trong các câu lệnh được gọi là các mode (định) địa chỉ
Các mode địa chỉ
Mode địa chỉ thanh ghi: MOV AX,BX
Mode địa chỉ tức thì: MOV AL,55h
Các mode địa chỉ bộ nhớ: Các cách thức xác định địa chỉ vât lý của toán hạng nằm trong bộ nhớ:
Mode địa chỉ trực tiếp
Các mode địa chỉ gián tiếp …
Mode địa chỉ trực tiếp
(Direct Addressing Mode)
Mode địa chỉ gián tiếp thanh ghi
(Register Indirect Addressing Mode)
Nhớ các mode địa chỉ bộ nhớ như thế nào?
Tất cả bắt đầu trong bảng sau đây:
Lấy ra 0 hoặc 1 phần tử từ mỗi cột
(Không lấy 2 phần tử từ một cột)
Phải lấy ít nhất 1 phần tử từ bảng
Các ví dụ
Các ví dụ
Các ví dụ
Nhóm lệnh Số học
Bên cạnh tác dụng, cần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng thái
Các lệnh số học th/thường: ADD, SUB, …
Các lệnh số học khác: CMP. NEG, INC, DEC, …
Ảnh hưởng đến các cờ trạng thái
CF
OF Phụ thuộc vào quá trình thực hiện phép toán
AF
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
ADD
Khuôn dạng: ADD Đích,Nguồn
Tác dụng: (Đích) (Đích)+(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Ảnh hưởng của ADD
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
CF được lập nếu tràn không dấu (có nhớ từ MSB)
OF được lập nếu tràn có dấu:
- Có nhớ từ MSB, Không có nhớ vào MSB
- Có nhớ vào MSB, Không có nhớ từ MSB
AF được lập nếu có nhớ từ nibble thấp vào nibble cao (từ bit 3 vào bit 4)
Các cờ trên thanh ghi cờ
Các bit nhất định trên thanh ghi cờ điều khiển hoạt động hoặc phản ánh trạng thái của vi xử lý
Các cờ điều khiển (TF, IF, DF)
Quyết định cách đáp ứng của vi xử lý trong các tình huống nhất định
Các cở trạng thái (CF, PF, AF, ZF, SF, OF)
Bị ảnh hưởng bởi các phép toán nhất định
Phục vụ cho các lệnh có điều kiện
Các cờ điều khiển
DF - Direction flag (Cờ hướng)
DF = 1: huớng xuống
DF = 0: hướng lên
IF – Interrupt flag (Cờ ngắt)
IF = 1: cho phép ngắt ngoài
IF = 0: cấm ngắt ngoài (đối với ngắt che được)
TF - Trace flag
TF = 1: vi xử lý thực hiện từng lệnh một
SUB
Khuôn dạng: SUB Đích,Nguồn
Tác dụng: (Đích) (Đích)-(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
Ảnh hưởng của SUB
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
CF được lập nếu tràn không dấu (có mượn vào MSB)
OF được lập nếu tràn có dấu:
- Có mượn vào MSB, Không có mượn từ MSB
- Có mượn từ MSB, Không có mượn vào MSB
AF được lập nếu có mượn từ nibble cao vào nibble thấp (từ bit 4 vào bit 3)
CMP
Khuôn dạng: CMP Đích,Nguồn
Tác dụng: (Đích)-(Nguồn)
Đích: có thể là:
1. Một thanh ghi 8 hoặc 16 bit của VXL
2. Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
Nguồn: có thể là:
Một thanh ghi 8 hoặc 16 bit của VXL
Một vị trí nhớ (1 hoặc 2 ô nhớ liên tiếp nhau)
3. Một giá trị cụ thể
INC, DEC, NEG
INC T/h
Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
Tác dụng: (T/h) (T/h)+1
DEC T/h
Trong đó: T/h có thể là các thanh ghi hoặc vị trí nhớ
Tác dụng: (T/h) (T/h)-1
Lưu ý: Các lệnh INC và DEC không ảnh hưởng đến cờ CF
Lệnh NEG T/h: Đảo dấu của T/h (Lấy bù 2)
Lệnh NEG sẽ lập cờ OF nếu giá trị của T/h là giá trị âm nhất trong dải giá trị của các số có dấu tương ứng
Nhóm lệnh Logic
Các lệnh logic th/thường: NOT, AND, OR, XOR
Cần chú ý đến ảnh hưởng của lệnh đối với các cờ trạng thái:
NOT không ảnh huởng đến các cờ trạng thái.
Các lệnh AND, OR, XOR:
CF = 0
OF = 0
ZF = 1 nếu Kết quả bằng 0
SF = 1 nếu MSB của Kết quả = 1
PF = 1 nếu byte thấp của kết quả có Parity chẳn
AF không xác định
Một số ví dụ
1100 1010
NOT AL
AL
0011 0101
AL
AL
BL
0011 0101
0110 1101
AND AL, BL
0010 0101
AL
AL
BL
0011 0101
0110 1101
OR AL, BL
0111 1101
AL
AL
BL
0011 0101
0110 1101
XOR AL, BL
0101 1000
AL
AL
BL
0011 0101
0000 1111
AND AL, BL
0000 0101
AL
AL
BL
0011 0101
0000 1111
OR AL, BL
0011 1111
AL
Một số ứng dụng
Bài toán Xoá bit: Xoá một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Lập bit: Lập một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Đảo bit: Đảo một bit nào đó của một toán hạng mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó
Bài toán Kiểm tra bit: Xác định một bit nào đó của một toán hạng là bằng 0 hay 1 mà không làm ảnh hưởng đến các bit còn lại của toán hạng đó (thông qua giá trị của một cờ trạng thái, ví dụ ZF)
Nhóm lệnh logic
Các lệnh logic khác: Lệnh TEST, Các lệnh dịch (Shift) và Các lệnh quay (Rotate)
Lệnh TEST chỉ khác lệnh AND là không giữ lại kết quả của phép toán
Các lệnh dịch và Các lệnh quay đều có hai khuôn dạng:
Khuôn dạng 1: Mnemonic Toán hạng,1
Khuôn dạng 2: Mnemonic Toán hạng,CL
Tác dụng của một câu lệnh theo khuôn dang 2 giống như tác dụng liên tiếp của N câu lệnh tương ứng theo khuôn dạng 1, với N là giá trị của thanh ghi CL
Các lệnh Dịch trái: SHL, SAL
Shift right SHR
Shift right SAR
(Quay trái/phải thông qua carry)
Rotate left/right
(Quay trái/phải không qua carry)
ROL
Nhóm lệnh rẽ nhánh
Làm thay đổi trật tự thực hiện lệnh bình thường của vi xử lý
Lệnh nhảy không điều kiện: JMP
Các lệnh nhảy có điều kiện: Jxxx
Lệnh lặp: LOOP và các biến thể của nó
Các lệnh có liên quan đến Chương trình con:
- CALL (gọi chương trình con)
- RET (trở về chương trình gọi)
Các lệnh có liên quan đến Chương trình con phục vụ ngắt
- INT (gọi chương trình con phục vụ ngắt - Gọi ngắt)
- IRET (quay về chương trình gọi ngắt)
Lệnh nhảy không điều kiện
JMP nhãn
Nhảy gần: E9 xx xx (3 byte)
Nhảy ngắn: EB xx (2 byte)
Nhảy xa: EA xx xx xx xx (5 byte)
Nhãn: tên do ngườI lập trình tự đặt ra theo qui tắc đặt tên của Assembler và có thể đặt vào trước một câu lệnh bất kỳ trong chương trình cùng với dấu :
nhãn: Câu lệnh cần thực hiện
Nhãn sẽ được dịch thành địa chỉ
Khoảng cách nhảy: Khoảng cách đại số (có dấu) từ lệnh nhảy đến lệnh cần thực hiện
Cơ chế thực hiện lệnh nhảy
Các lệnh nhảy ngắn và gần chỉ làm thay đổi giá trị của thanh ghi IP
Lệnh nhảy ngắn cộng khoảng cách nhảy 8-bit có dấu vào giá trị hiện thời của IP
Lệnh nhảy gần cộng khoảng cách nhảy 16-bit có dấu vào giá trị hiện thời của IP
Lệnh nhảy xa làm thay đổi cả CS và IP
Gán cho CS và IP các giá trị mới
Các lệnh nhảy có điều kiện
Jxxx nhãn
Có gần 40 menmonic khác nhau
Các lệnh nhảy điều kiện đơn: phụ thuộc vào giá trị của 1 cờ.
JNZ/JNE - Nhảy nếu cờ ZF = 0, nghĩa là kết quả của phép toán trước đó khác không
JC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó lập cờ carry
JZ/JE (ZF = 1)
JNC (CF = 0)
Các lệnh nhảy có điều kiện
Tất cả các lệnh nhảy có điều kiện phải là nhảy ngắn
khoảng cách nhảy: -128 to +127 bytes
Tổ hợp với lệnh nhảy không điều kiện để có thể vượt qua giới hạn này.
Các lệnh nhảy điều kiện kép: phụ thuộc vào giá trị của nhiều cờ
JB/JNAE
JNL/JGE
ứng dụng của các lệnh nhảy có điều kiện
Kết hợp với JMP để xây dựng các cấu trúc lập trình cơ bản:
- Cấu trúc điều kiện
- Cấu trúc lặp
Các lệnh nhảy thường theo sau các lệnh làm thay đổi giá trị của các cờ trạng thái:
CMP
TEST …
Cấu trúc điều kiện
mov ax,n
cmp ax,7
jz nhan1; ZF = 1
CONGVIEC1
jmp nhan2
nhan1:CONGVIEC2
nhan2:lệnh 3
Cấu trúc lặp
mov ax,n
nhan1: cmp ax,0
jz nhan2
lệnhi
sub ax,2
jmp nhan1
nhan2: lệnhk
Lệnh LOOP
LOOP nhan
Giảm CX đi 1
Nếu (CX) khác 0 thì JMP nhan. Nếu không thì tiếp tục thực hiện lệnh theo trật tự bình thường
mov cx,9
nhan: lệnh 1
lệnh 2
lệnh 3
loop nhan
LOOPZ/E và LOOPNZ/E
Đây là các biến thể của LOOP
Giá trị của cờ ZF có thể làm kết thúc sớm vòng lặp
LOOPZ: Lặp khi (CX) khác 0 và ZF =1
LOOPNZ: Lặp khi (CX) khác 0 và ZF =0
Lưu ý: Các lệnh LOOP giảm CX nhưng không ảnh huởng đến các cờ
LOOPZ == LOOPE
LOOPNZ==LOOPNE
Các lệnh trong vòng lặp có thể tác động đến cờ ZF (CMP, TEST)
Chương trình con
Chương trình con trong ngôn ngữ Assembly được gọi là Thủ tục (Procedure)
Một thủ tục có thể được thực hiện nhiều lần
Stack là cơ cở của chương trình con:
- Stack lưu giữ Địa chỉ quay về
- Stack lưu giữ giá trị của các thanh ghi của vi xử lý (nếu cần)
Stack
Cấu trúc dữ liệu LIFO ở RWM
- PUSH : ghi dữ liệu vào stack,
- POP: đọc dữ liệu từ stack
(SS:SP) trỏ đến đỉnh của stack (theo LIFO)
(SS:BP) truy cập stack ngẫu nhiên (không theo LIFO)
PUSH
PUSH nguồn
Push nguồn vào stack
PUSHF
Push thanh ghi cờ vào stack
Lệnh PUSH trước hết sẽ giảm SP đi 2 rồi lưu giá trị của nguồn vào vị trị nhớ được trỏ bởi (SS:SP)
Ví dụ PUSH
PUSH AX
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0006
01
06
4C
SS:0340
AX: 0123
POP
POP đích
Pop dữ liệu từ đỉnh stack vào đích
POPF
Pop dữ liệu từ đỉnh stack vào thanh ghi cờ
Lệnh POP trước hết copy dữ liệu được trỏ bởi (SS:SP) đến đích rồi tăng SP lên 2
Ví dụ POP
POP ES
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0008
01
06
4C
SS:0340
3C
09
A4
40
2C
FF
A2
23
2A
09
46
SP:0006
01
06
4C
SS:0340
ES: 0123
Tràn stack!
Stack Overflow
Stack Underflow
SP:000D
SS:0340
Stack Size: 000C
SP:FFFE
SS:0340
Stack Size: 000C
Khai báo thủ tục
Tên_Thủ_tục PROC kiểu
;thân của thủ tục
RET ;quay về chuơng trình gọi
Tên_Thủ_tục ENDP
kiểu là NEAR hoặc FAR
ngầm định là NEAR
Một thủ tục có thể có nhiều lệnh RET
Lệnh CALL và RET
Gọi một thủ tục (NEAR)
CALL Tên_Thủ_tục
push IP vào stack
copy địa chỉ của Tên_Thủ_tục vào IP
Trở về từ một thủ tục (NEAR)
RET
pop giá trị ở đỉnh stack vào IP
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
Gọi ngắt
Gọi ngắt là một lời gọi thủ tục đặc biêt
FAR
Thanh ghi cờ phải được bảo toàn
INT Số ngắt
Thanh ghi cờ được push, TF và IF bị xoá
CS và rồI IP được push
Địa chỉ của một chương trình con phục vụ ngắt (Vector ngắt) tương ứng với Số ngắt được copy vào CS và IP
Trở về từ ngắt
IRET
Tác dụng của lênh:
Giá trị ở đỉnh của stack được pop vào IP
Giá trị ở đỉnh của stack được pop vào CS
Giá trị ở đỉnh của stack được pop vào thanh ghi cờ
Chương trình bị ngắt tiếp tục thực hiện dường như không có chuyện gì xảy ra
Xuất ký tự ra màn hình PC
Ngắt 21h
Ngắt này hỗ trợ rất nhiều dịch vụ trên PC
Nhận dạng dịch vụ bằng số dịch vụ (số hàm). Số dịch vụ cần được nạp voà thanh ghi AH
Tuỳ theo từng dịch vụ, có thể cần thêm một số đối số khác được nạp vào các thanh ghi xác định
AH = 2, DL = Mã ASCII của ký tự cần xuất
Ký tự được hiển thị tại vị trí hiện thời của con trỏ
Xuất xâu ký tự ra màn hình PC
Dịch vụ 09h của ngắt 21h
DX = Địa chỉ Offset của xâu (trong đoạn dữ liệu)
DS = Địa chỉ segment của xâu
Xâu ký tự phải kết thúc bằng ký tự `$`
Để nạp địa chỉ offset của xâu vào DX, có thể:
LEA DX, Tênxâu
MOV DX, OFFSET Tên xâu
Nhập 1 ký tự từ bàn phím PC
Dịch vụ 01h của ngắt 21h
Khi NSD gõ một ký tự từ bàn phím:
Ký tự sẽ hiện trên màn hình
AL sẽ chứa mã ASCII của ký tự đó
AL=0 nếu ký tự được nhập là ký tự điều khiển
Nhóm lệnh thao tác string
Chúng ta hiểu: string là một mảng byte hoặc từ nằm trong bộ nhớ
Các thao tác string:
Sao chép
Tìm kiếm
Lưu trữ
So sánh
Các đặc điểm
Nguồn: (DS:SI), Đích: (ES:DI)
DS, ES chứa Địa chỉ Segment của string
SI, DI chứa Địa chỉ Offset của string
Cờ hướng DF (0 = Up, 1 = Down)
DF = 0 - Tăng địa chỉ (trái qua phải)
DF = 1 - Giảm địa chỉ (phảI qua trái)
Chuyển (Sao chép)
MOVSB, MOVSW
Chuyển 1 byte hoặc 1 word từ vị trí nhớ này sang vị trí nhớ khác
Tác dụng của lệnh:
Sao chép byte/word từ (DS:SI) đến (ES:DI)
Tăng/Giảm SI và DI 1 hoặc 2 giá trị
Nếu CX chứa một giá trị khác không:
REP MOVSB hoặc REP MOVSW sẽ tự động sao chép (CX) lần và CX sẽ về không
Ví dụ:Sao chép mảng
; Sao chép 10 byte từ mảng a sang mảng b, giả sử (DS) = (ES)
mov cx, 10
mov di, offset b
mov si, offset a
cld ;xoá cờ DF
rep movsb
Ví dụ: Tịnh tiến các ô nhớ
mov cx, 7
mov di, offset a+9
mov si, offset a+6
std ;lập cờ DF
rep movsb
DI
a
SI
Ví dụ
pattern db "!@#*"
db 96 dup (?)
mov cx,96
mov si, offset pattern
mov di, offset pattern+4
cld
rep movsb
!
@
#
*
DI
a
SI
Lưu trữ string
STOSB, STOSW
Copy AL hoặc AX vào một mảng byte hoặc word
Đích (ES:DI)
Tăng hoặc Giảm DI
phụ thuộc DF
Thường được sử dụng có tiền tố REP và số lần lặp trong CX
Ví dụ:
arr dw 200 dup (?)
mov ax,50A0h
mov di,offset arr
mov cx,200
cld
rep stosw
A0
50
A0
50
arr
50
A0
AX
DI
Nạp String
LODSB, LODSW
Byte hoặc word tại (DS:SI) được copy vào AL hoặc AX
SI tăng hoặc giảm 1 hoặc 2 giá trị phụ thuộc DF
Thường được dùng với STOSx trong một vòng lặp để xử lý từng phần tử trong một mảng
Ví dụ:
mov di, offset b
mov si, offset a
mov cx,30
cld
lp:
lodsb
and al,0DFh
stosb
loop lp
Quét String
SCASB, SCASW
So sánh AL hoặc AX với byte hoặc word tạI (ES:DI) và tự động tăng hoặc giảm DI
Lệnh này ảnh hưởng đến các cờ trạng thái
Tuỳ theo kết quả so sánh
Dùng trong một vòng lặp REPs
REPZ, REPE, REPNZ, REPNE
Ví dụ
arr db `abcdefghijklmnopqrstuvwxyz`
mov di, offset arr
mov cx,26
cld
mov al,target
repne scasb
jne nomatch
So sánh String
CMPSB, CMPSW
So sánh byte hoặc word tại (DS:SI) với byte hoặc word tạI (ES:DI), tác động đến các cờ và tăng hoặc giảm SI và DI
Thường dùng để so sánh hai mảng với nhau
Ví dụ
mov si, offset str1
mov di, offset str2
cld
mov cx, 12
repe cmpsb
jl str1smaller
jg str2smaller
;the strings are equal - so far
;if sizes different, shorter string is less
Nhóm lệnh hỗn hợp
- Các lệnh Lập/Xoá trực tiếp các cờ:
STC, CLC
STD, CLD
STI, CLI
- Lệnh NOP (No Operation): Không làm gì!!!
- Lệnh NOP thường được dùng trong các vòng lặp tạo trễ (delay)bằng phần mềm
- Các lệnh Nhập/Xuất dữ liệu đối với các cổng I/O
IN
OUT
Lệnh IN
Nếu Địa chỉ của cổng nhỏ hơn hoặc bằng FFh:
IN Acc, Địa chỉ cổng
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
Nếu Địa chỉ của cổng lớn hơn FFh:
MOV DX, Địa chỉ cổng
IN Acc, DX
- Trong đó: Acc có thể là AL hoặc AX
- Nhập dữ liệu từ cổng vào Acc
Lệnh OUT
Nếu Địa chỉ của cổng nhỏ hơn hoặc bằng FFh:
OUT Địa chỉ cổng, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
Nếu Địa chỉ của cổng lớn hơn FFh:
MOV DX, Địa chỉ cổng
OUT DX, Acc
- Trong đó: Acc có thể là AL hoặc AX
- Xuất dữ liệu từ Acc ra cổng
Tóm tắt chương
-Tính tương thích về Cấu trúc thanh ghi của các vi xử lý họ x86
-Tính tương thích về Tập lệnh của các vi xử lý họ x86
Tính tương thích về
Cấu trúc thanh ghi
của các vi xử lý họ x86
Accumulator
EAX
AH
AL
AX
Base
EBX
BH
BL
BX
Count
ECX
CH
CL
CX
Data
EDX
DH
DL
DX
General Purpose
Instr Pointer
EIP
IP
Flags
EFLAG
FLAG
Special Registers
Stack Segment
Code Segment
CS
Data Segment
DS
Extra Segment
ES
SS
FS
GS
Segment Registers
Stack Pointer
ESP
SP
Base Pointer
EBP
BP
Dest Index
EDI
DI
Source Index
ESI
SI
Index Registers
Thanh ghi cờ 32-bit
8086, 8088, 80186
80286
80386, 80486DX
80486SX
AC (Alignment check)
(VM) Virtual mode
(RF) Resume
(NT) Nested task
(IOPL) Input/output
privilege level
(O) Overflow
(D) Direction
(I) Interrupt
(T) Trace
(S) Sign
(Z) Zero
(A) Auxiliary Carry
(P) Parity
(C) Carry
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Hồ Minh Sắc
Dung lượng: |
Lượt tài: 4
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)