Bài giảng Kỹ thuật Vi xử lý - Chương III: Vi xử lý 8088-Intel

3.1 Kiến trúc và hoạt động của 8088

- Nguyên lý hoạt động

- Sơ đồ khối chức năng

3.2 Cấu trúc thanh ghi của 8088

3.3 Phương pháp quản lý bộ nhớ

3.4 Mô tả tập lệnh Assembly

pdf122 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: yen2110 | Lượt xem: 433 | Lượt tải: 1download
Tóm tắt nội dung Bài giảng Kỹ thuật Vi xử lý - Chương III: Vi xử lý 8088-Intel, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
i cả CS và IP
– Gán cho CS và IP các giá trị mới
Mã máy của lệnh nhảy
1106:0100 EB2A JMP 012C
• 012C-0102=002A
1106:0102 EBFC JMP 0100
• 0100-0104=FFFC
1106:0104 E97F00 JMP 0186
• 0186-0106=0080 (too far for short!)
• 0186-0107=007F
1106:0107 E9F5FE JMP FFFF
• FFFF-010A=FEF5
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
• JNC
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
lệnh 1
jmp nhan2 
nhan1:lệnh 2
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 
Cấu trúc điều kiện - AND
char n; int w,x;
if (n>='A' && w==x)
whatever();
;if(n>='A'&&w==x)
mov ah,n
cmp ah,'A'
jl nogo
mov ax,w
cmp ax,x
jne no_go
;then-part
call whatever
nogo:
Cấu trúc điều kiện - OR
char n,k; unsigned int w;
if (nk || w<=10)
whatever();
;if(nk||w<=10)
mov ah,n
cmp ah,k
jne then_
cmp w,10
ja end_if
then_:
call whatever
end_if:
Lệnh LOOP
• LOOP nhan
– Giảm CX đi 1
– Nếu (CX) 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
• 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
• Loop while ZF/equal 
&& CX!=0
• Loop while (NZ/ not 
equal) && CX!=0
• Lưu ý: 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 ?) 
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
• Có liên quan đến stack:
- lưu giữ Địa chỉ quay về
- lưu giữ giá trị của các thanh ghi của vi xử 
lý
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
• (SS:BP) truy cập stack ngẫu nhiên (không
theo LIFO)
Stack Initialization
• The .stack directive hides an array 
allocation statement that looks like this
– The_Stack DB Stack_Size dup (?)
• On program load
– SS is set to a segment address containing this 
array (usually The_Stack starts at offset 0)
– SP is set to the offset of The_Stack+Stack_Size 
which is one byte past the end of the stack array
• This is the condition for an empty stack
Initial Stack Configuration
.stack 12 ;Reserve space for the stack
• Loader determines actual segment address 
for the start of the stack
– This is an empty stack
SP:000CSP:000CSS:0340SS:0340
Stack Size: 000C
How Does The Stack Work?
• The stack grows backwards through 
memory towards the start of the stack 
segment
• Push decrements stack pointer
Pop increments stack pointer
SP:0008SP:0008SS:0340SS:0340
Stack Size: 000C
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 43 2A 09 46
SP:0008SP:0008
07 06 4C
SS:0340SS:0340
Stack Size: 000C
3C 09 A4 40 2C FF A2 23 2A 09 46
SP:0006SP:0006
01 06 4C
SS:0340SS:0340
AX: 0123AX: 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:0008SP:0008
01 06 4C
SS:0340SS:0340
3C 09 A4 40 2C FF A2 23 2A 09 46
SP:0006SP:0006
01 06 4C
SS:0340SS:0340
ES: 0123ES: 0123
Tràn stack!
• Stack Overflow
• Stack Underflow
SP:000DSP:000DSS:0340SS:0340
Stack Size: 000C
SP:FFFESP:FFFESS:0340SS:0340
Stack Size: 000C
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
A050A050
arr
50A0AX
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, CLCSTD, CLDSTI, 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/OINOUT
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ổngIN 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ổngOUT 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

File đính kèm:

  • pdfbai_giang_ky_thuat_vi_xu_ly_chuong_iii_vi_xu_ly_8088_intel.pdf