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
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:
- bai_giang_ky_thuat_vi_xu_ly_chuong_iii_vi_xu_ly_8088_intel.pdf