Bài giảng Kỹ thuật Vi xử lý - Đại học Bách khoa Đà Nẵng
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
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ánCá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,1Khuôn dạng 2: Mnemonic Toán hạng,CLTá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, SAL0RegisterCFShift right SHRRegisterCF0Shift right SARRegisterCF(Quay trái/phải thông qua carry)RCLRCRRotate left/right (Quay trái/phải không qua carry)ROLRORNhóm lệnh rẽ nhánhLà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: JMPCác lệnh nhảy có điều kiện: JxxxLệ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ệnJMP nhãnNhả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ệnNhã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ệnCơ chế thực hiện lệnh nhảyCác lệnh nhảy ngắn và gần chỉ làm thay đổi giá trị của thanh ghi IPLệ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 IPLệ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à IPGán cho CS và IP các giá trị mớiCác lệnh nhảy có điều kiệnJxxx nhãn Có gần 40 menmonic khác nhauCá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ôngJC - Nhảy nếu CF = 1, nghĩa là câu lệnh trước đó lập cờ carryJZ/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ắnkhoả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/JNAEJNL/JGE ứng dụng của các lệnh nhảy có điều kiệnKế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ặpCá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 nhan1nhan2: lệnhk Lệnh LOOPLOOP nhanGiảm CX đi 1Nế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,9nhan: lệnh 1 lệnh 2 lệnh 3 loop nhanLOOPZ/E và LOOPNZ/EĐây là các biến thể của LOOPGiá trị của cờ ZF có thể làm kết thúc sớm vòng lặpLOOPZ: Lặp khi (CX) khác 0 và ZF =1LOOPNZ: Lặp khi (CX) khác 0 và ZF =0Lưu ý: Các lệnh LOOP giảm CX nhưng không ảnh huởng đến các cờLOOPZ == LOOPELOOPNZ==LOOPNECác lệnh trong vòng lặp có thể tác động đến cờ ZF (CMP, TEST) Chương trình conChươ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ầnStack 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)PUSHPUSH nguồnPush nguồn vào stackPUSHFPush thanh ghi cờ vào stackLệ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ụ PUSHPUSH AX3C09A4402CFFA2432A0946SP:000807064CSS:0340Stack Size: 000C3C09A4402CFFA2232A0946SP:000601064CSS:0340AX: 0123POPPOP đíchPop dữ liệu từ đỉnh stack vào đíchPOPFPop 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 2Ví dụ POPPOP ES3C09A4402CFFA2232A0946SP:000801064CSS:03403C09A4402CFFA2232A0946SP:000601064CSS:0340ES: 0123Tràn stack!Stack OverflowStack UnderflowSP:000DSS:0340Stack Size: 000CSP:FFFESS:0340Stack Size: 000CKhai báo thủ tụcTên_Thủ_tục PROC kiểu;thân của thủ tụcRET ;quay về chuơng trình gọiTên_Thủ_tục ENDPkiểu là NEAR hoặc FARngầm định là NEARMột thủ tục có thể có nhiều lệnh RETLệnh CALL và RETGọi một thủ tục (NEAR) CALL Tên_Thủ_tụcpush IP vào stackcopy địa chỉ của Tên_Thủ_tục vào IPTrở về từ một thủ tục (NEAR) RET pop giá trị ở đỉnh stack vào IPThủ tục FARGọi thủ tục (FAR) CALL Tên_thủ_tụclần lượt push CS và IP vào stackcopy địa chỉ của Tên_thủ_tục vào CS và IPTrở về từ thủ tục (FAR) RET pop giá trị từ đỉnh stack lần lượt vào IP và CSGọi ngắtGọi ngắt là một lời gọi thủ tục đặc biêtFARThanh ghi cờ phải được bảo toànINT Số ngắtThanh 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ắtIRETTác dụng của lênh:Giá trị ở đỉnh của stack được pop vào IPGiá trị ở đỉnh của stack được pop vào CSGiá 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 raXuất ký tự ra màn hình PCNgắ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 địnhAH = 2, DL = Mã ASCII của ký tự cần xuấtKý 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 PCDịch vụ 09h của ngắt 21hDX = Địa chỉ Offset của xâu (trong đoạn dữ liệu)DS = Địa chỉ segment của xâuXâ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âuNhập 1 ký tự từ bàn phím PCDịch vụ 01h của ngắt 21hKhi 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ểnNhóm lệnh thao tác stringChú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épTìm kiếmLưu trữSo sánhCác đặc điểmNguồn: (DS:SI), Đích: (ES:DI)DS, ES chứa Địa chỉ Segment của stringSI, DI chứa Địa chỉ Offset của stringCờ 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, MOVSWChuyển 1 byte hoặc 1 word từ vị trí nhớ này sang vị trí nhớ khácTá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 movsbVí 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 movsbDIaSIVí dụ pattern db "!@#*" db 96 dup (?) mov cx,96 mov si, offset pattern mov di, offset pattern+4 cld rep movsb!@#*DIaSILưu trữ stringSTOSB, STOSWCopy AL hoặc AX vào một mảng byte hoặc wordĐích (ES:DI)Tăng hoặc Giảm DIphụ thuộc DFThường được sử dụng có tiền tố REP và số lần lặp trong CXVí dụ: arr dw 200 dup (?) mov ax,50A0h mov di,offset arr mov cx,200 cld rep stoswA050A050arr50A0AXDINạp StringLODSB, LODSWByte hoặc word tại (DS:SI) được copy vào AL hoặc AXSI tăng hoặc giảm 1 hoặc 2 giá trị phụ thuộc DFThườ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ảngVí dụ: mov di, offset b mov si, offset a mov cx,30 cldlp: lodsb and al,0DFh stosb loop lpQuét StringSCASB, SCASWSo 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 DILệnh này ảnh hưởng đến các cờ trạng tháiTuỳ theo kết quả so sánhDùng trong một vòng lặp REPsREPZ, REPE, REPNZ, REPNEVí dụarr db 'abcdefghijklmnopqrstuvwxyz' mov di, offset arr mov cx,26 cld mov al,target repne scasb jne nomatchSo sánh StringCMPSB, CMPSWSo 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à DIThường dùng để so sánh hai mảng với nhauVí 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 lessNhó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/O IN OUTLệnh INNế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 AccLệnh OUTNế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ổngTó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ọ x86Tính tương thích về Cấu trúc thanh ghi của các vi xử lý họ x86AccumulatorEAXAHALAXBaseEBXBHBLBXCountECXCHCLCXDataEDXDHDLDXGeneral PurposeInstr PointerEIPIPFlagsEFLAGFLAGSpecial RegistersStack SegmentCode SegmentCSData SegmentDSExtra SegmentESSSFSGSSegment RegistersStack PointerESPSPBase PointerEBPBPDest IndexEDIDISource IndexESISIIndex RegistersThanh ghi cờ 32-bit8086, 8088, 801868028680386, 80486DX80486SXAC (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
File đính kèm:
- KY THUAT VI XU LI.ppt