Bài giảng Vi xử lý - Vi điều khiển

pdf 178 trang phuongnguyen 70
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý - Vi điều khiển", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_vi_xu_ly_vi_dieu_khien.pdf

Nội dung text: Bài giảng Vi xử lý - Vi điều khiển

  1. COMPUTER ENGINEERING KỸ THU ẬT MÁY TÍNH VI XỬ LÝ VI ĐIỀU KHI ỂN Giáo trình dùng cho h ệ Đại h ọc chính quy, đào t ạo theo h ệ th ống tín ch ỉ 2011 T R ƯỜ N G ĐẠ I H Ọ C K Ỹ T H U Ậ T C Ơ N G N G H I Ệ P
  2. BÀI GI ẢNG PHÁT CHO SINH VIÊN (L ƯU HÀNH N ỘI B Ộ) Theo ch ươ ng trình 150 TC thay 180 TC ho ặc t ươ ng đươ ng Sử d ụng cho n ăm h ọc 2011 – 2012 Tên bài gi ảng: Vi x ử lý – Vi điều khi ển Số tín ch ỉ: 03 Thái Nguyên, tháng 7 n ăm 2011
  3. MỤC L ỤC CH ƯƠ NG 1. TỔNG QUAN V Ề VI X Ử LÝ – VI ĐIỀU KHI ỂN 9 1.1 Gi ới thi ệu chung v ề vi x ử lý – vi điều khi ển 10 1.1.1 Khái ni ệm 10 1.1.2 Phân biệt vi x ử lý và vi điều khi ển 11 1.1.3 Lịch s ử phát tri ển c ủa vi x ử lý 13 1.1.4 Ứng d ụng c ủa Vi x ử lý/Vi điều khi ển 14 1.2 Cấu trúc chung c ủa h ệ Vi x ử lý/Vi điều khi ển 15 1.3 Định d ạng d ữ li ệu và bi ểu di ễn thơng tin trong h ệ vi x ử lý – vi điều khi ển 16 1.3.1 Các h ệ đếm và mã BCD 16 1.3.2 Mã ký t ự - Alphanumeric CODE (ASCII, EBCDIC) 17 CH ƯƠ NG 2. VI X Ử LÝ INTEL 8086/8088 19 2.1 Tổng quan v ề vi x ử lý Intel 8086/8088 20 2.1.1 Các thành ph ần c ơ b ản c ủa CPU 20 2.1.2 Cấu trúc c ủa 8086/8088 20 Hình 2-2. Sơ đồ kh ối 8086/8088 21 2.1.3 Mơ t ả ch ức n ăng các chân 26 2.2 Ch ế độ địa ch ỉ 30 2.2.1 Mã hố l ệnh trong vi x ử lý 8086/8088 30 2.2.2 Các ch ế độ địa ch ỉ 32 2.3 Tập l ệnh Assembly 35 2.3.1 Gi ới thi ệu chung 35 2.3.2 Các nhĩm l ệnh 36 2.4 Lập trình h ợp ng ữ (Assembly) cho vi x ử lý 80x86 [12] 52 2.4.1 Gi ới thi ệu chung v ề h ợp ng ữ 52 2.4.2 Các b ước khi lập trình 53 2.4.3 Cấu trúc chung c ủa ch ươ ng trình h ợp ng ữ 55 2.4.4 Các c ấu trúc điều khi ển c ơ b ản 65 2.4.5 Ng ắt trong Assembly 67 2.4.6 Các ví d ụ 70 2.5 Ghép n ối b ộ nh ớ và thi ết bi ngo ại vi 76 2.5.1 Ghép n ối b ộ nh ớ 76 2.5.2 Ghép n ối thi ết b ị ngo ại vi 79 2.5.3 Các m ạch c ổng đơ n gi ản 80 Vi m ạch ch ốt 74LS373: 81 2.6 Câu h ỏi và bài t ập 81 CH ƯƠ NG 3. HỌ VI ĐIỀU KHI ỂN 8051 83 3.1 Gi ới thi ệu chung 84 3.1.1 Ứng d ụng c ủa vi điều khi ển 84 3.1.2 Ho ạt động c ủa vi điều khi ển. 84 3.1.3 Cấu trúc chung c ủa vi điều khi ển 85 3.2 Ki ến trúc vi điều khi ển 8051 91 3.2.1 Chu ẩn 8051 91 3.2.2 Các chân vi điều khi ển 8051 92 3.2.4 Cổng vào/ra 93 3.2.5 Tổ ch ức b ộ nh ớ 8051 97 3.2.6 Các thanh ghi ch ức n ăng đặc bi ệt (SFRs - Special Function Registers) 102 3.2.7 Bộ đếm và b ộ định th ời 106 3.2.8 Truy ền thơng nối ti ếp 106 3.2.9 Ng ắt vi điều khi ển 8051 107 3.3 Lập trình h ợp ng ữ cho 8051 107
  4. 3.3.1 Các ch ế độ địa ch ỉ 107 3.3.2 Tập l ệnh trong 8051 109 3.3.3 Cấu trúc chung ch ươ ng trình h ợp ng ữ cho 8051 116 3.4 Bộ đếm và b ộ định th ời 119 3.5 Truy ền thơng n ối ti ếp 126 3.6 Xử lý ng ắt 133 3.7 Câu h ỏi và bài t ập cu ối ch ươ ng 139 CH ƯƠ NG 4. ỨNG D ỤNG 141 4.1 Vào/ra s ố 142 4.2 Timer 145 4.3 Lập trình ng ắt ngồi. 147 4.4 Điều khi ển LED 7 thanh 147 4.5 Nh ận d ữ li ệu qua UART 149 4.6 Truy ền d ữ li ệu qua UART 151 4.7 Ghép n ối 8051 v ới ADC0804 152 4.8 Ghép n ối bàn phím s ố 154 4.9 Ghép n ối động c ơ b ước 157 CH ƯƠ NG 5. CÁC H Ệ VI ĐIỀU KHI ỂN TIÊN TI ẾN 159 5.1 Atmel AVR 160 5.1.1 Lịch s ử họ AVR 160 5.1.2 Tổng quan v ề thi ết b ị 160 5.1.3 Ki ến trúc thi ết b ị 161 5.1.4 Program Memory (Flash) 161 5.1.5 EEPROM 161 5.1.6 Ch ươ ng trình th ực thi 162 5.1.7 Tập l ệnh 162 5.1.8 Tốc độ MCU 163 5.1.9 Nh ững đặc tính 163 5.2 Vi điều khi ển PIC 165 5.2.1 Lập trình cho PIC 165 5.2.2 Các đặc tính chính 166 5.2.3 Họ vi điều khi ển PIC 8/16-bit 167 5.3 ARM 168 5.3.1 Cấu trúc ARM 168 5.3.2 Lịch s ử phát tri ển 168 5.3.3 Các d ạng lõi 170 5.3.4 Các l ưu ý v ề thi ết k ế 172 Tài li ệu tham kh ảo 173 Danh m ục hình ảnh 174 Danh m ục mã ngu ồn 176 Danh m ục b ảng 176 Ch ỉ mục 177
  5. ĐẠI HỌC THÁI NGUYÊN CỘNG HỒ XÃ HỘI CHỦ NGHĨA VIỆT NAM TTRRƯƯTRƯỜTRƯ ỜỜỜNGNG ĐĐẠẠẠẠIIII HỌHHH ỌỌỌCC ĐĐĐộĐộộộcc lc lậl ậậậpp TTTựTựựự ddoodo HHHạHạạạnhnh phúc KKKỸKỸỸỸ TTHHUUTHUẬTHU ẬẬẬTT CƠNG NGHINGHIỆỆỆỆPPPP CH ƯƠ NG TRÌNH GIÁO D ỤC ĐẠI H ỌC NGÀNH ĐÀO T ẠO: ĐIỆN – ĐIỆN T Ử, SPKT ĐIỆN – TIN, C Ơ ĐIỆN T Ử CHUYÊN NGÀNH: KH ỐI NGÀNH ĐIỆN – ĐIỆN T Ử ĐỀ C ƯƠ NG CHI TI ẾT H ỌC PH ẦN: VI X Ử LÝ – VI ĐIỀU KHI ỂN (H ọc ph ần b ắt bu ộc) 1. Tên h ọc ph ần: Vi x ử lý – vi điều khi ển. 2 . S ố tín ch ỉ: 03; 3(3; 1,5; 6)/12 3. Trình độ cho sinh viên n ăm th ứ: 3 ( Điện, Điện t ử, SPKT Điện, SPKT Tin) ho ặc 4 (C ơ điện t ử). 4. Phân b ổ th ời gian - Lên l ớp lý thuy ết: 3 (ti ết/tu ần) x 12 (tu ần) = 36 ti ết. - Th ảo lu ận: 1,5 (ti ết/tu ần) x 12 (tu ần) = 18 ti ết. 5. Các h ọc ph ần h ọc tr ước Kỹ thu ật điện t ử s ố. 6. H ọc ph ần thay th ế, h ọc ph ần t ươ ng đươ ng Vi x ử lý – vi điều khi ển (trong các ch ươ ng trình 180 TC và 260 ĐVHT) 7. M ục tiêu c ủa h ọc ph ần Sau khi h ọc xong h ọc ph ần sinh viên ph ải n ắm được c ấu trúc ph ần c ứng c ủa các b ộ vi x ử lý – vi điều khi ển tiêu bi ểu: x86, 8051; T ổ ch ức b ộ nh ớ, t ập l ệnh, ch ế độ địa ch ỉ và l ập trình cho chúng; Bi ết cách ghép n ối v ới b ộ nh ớ và thi ết b ị ngo ại vi; Bi ết khai thác kh ả n ăng ng ắt và định th ời. Cĩ kh ả n ăng thi ết k ế và xây d ựng modul (bao g ồm c ả ph ần c ứng và ph ần m ềm) s ử d ụng vi điều khi ển cho bài tốn c ụ th ể. 8. Mơ t ả v ắn t ắt n ội dung h ọc ph ần Tổng quan v ề các h ệ đếm và bi ểu di ễn thơng tin trong các h ệ vi x ử lý – vi điều khi ển. Vi x ử lý: T ổng quan v ề ki ến trúc h ệ vi x ử lý; t ổ ch ức ph ần c ứng c ủa CPU h ọ Intel 80x86, các ch ế độ đánh địa ch ỉ, t ập l ệnh, l ập trình h ợp ng ữ (assembly) cho 80x86 với nh ững bài tốn đơ n gi ản; m ột s ố vi m ạch ph ụ tr ợ trong h ệ vi x ử lý. Vi điều khi ển: C ấu trúc h ệ vi điều khi ển onchip MCS 8051; l ập trình h ợp ng ữ cho vi điều khi ển; ho ạt động định th ời, ng ắt và truy ền thơng n ối ti ếp; gi ới thi ệu m ột s ố họ vi x ử lý thơng d ụng khác. Gi ới thi ệu một s ố bài tốn ứng d ụng tiêu bi ểu.
  6. 9. Nhi ệm v ụ c ủa sinh viên 1. D ự l ớp ≥ 80 % t ổng s ố th ời l ượng c ủa h ọc ph ần. 2. Chu ẩn b ị th ảo lu ận. 3. Bài t ập, Bài t ập l ớn (dài): Khơng 10. Tài li ệu h ọc t ập - Sách, giáo trình chính: • Bộ mơn K ỹ thu ật Máy tính, Bài gi ảng “Vi x ử lý – vi điều khi ển” - Sách tham kh ảo: • Văn Th ế Minh, Kỹ thu ật vi x ử lý , NXB KHKT, 1997. • Tống V ăn On, Họ vi điều khi ển 8051 , NXB KH&KT, 2005. • Nguy ễn T ăng C ường, Phan Qu ốc Th ắng, Cấu trúc và l ập trình h ọ vi điều khi ển 8051 , NXB KH&KT, 2004. • Michael Hordeski, Personal Computer Interfaces , Mc. Graw Hill, 1995. • 11. Tiêu chu ẩn đánh giá sinh viên và thang điểm 11.1. Các h ọc ph ần lý thuy ết • Tiêu chu ẩn đánh giá 1. Chuyên c ần; 2. Th ảo lu ận, bài t ập; 3. Bài t ập l ớn (dài); 4. Ki ểm tra gi ữa h ọc ph ần; 5. Thi k ết thúc h ọc ph ần; 6. Khác. • Thang điểm - Điểm đánh giá b ộ ph ận ch ấm theo thang điểm 10 v ới tr ọng s ố nh ư sau: + Ki ểm tra gi ữa h ọc ph ần: 20 %. + Điểm th ảo lu ận: 10% + Điểm chuyên c ần: 10% + Điểm thi k ết thúc h ọc ph ần: 60 %.
  7. 12. N ội dung chi ti ết h ọc ph ần và l ịch trình gi ảng d ạy Nhĩm biên so ạn: ThS. Nguy ễn Tu ấn Anh ThS. Nguy ễn Tu ấn Linh ThS. Nguy ễn V ăn Huy ThS. Nguy ễn Ti ến Duy Th.S T ăng C ẩm Nhung Th.S Phùng Th ị Thu Hi ền Tài li ệu Hình Tu ần học t ập, Nội dung th ức th ứ tham học kh ảo Ch ươ ng I: T ổng quan v ề vi x ử lý – vi điều khi ển 1.1. Gi ới thi ệu chung v ề vi x ử lý – vi điều khi ển 1.1.1. Tổng quan 1.1.2. Lịch s ử phát tri ển c ủa các b ộ x ử lý 1.1.3. Vi x ử lý và vi điều khi ển 1.2. Cấu trúc chung c ủa h ệ vi x ử lý 1.2.1. Kh ối x ử lý trung tâm (CPU) 1 1.2.2. Bộ nh ớ (Memory) [1] - [4] Gi ảng 1.2.3. Kh ối ph ối ghép vào/ra (I/O) 1.2.4. Hệ th ống bus 1.3. Định d ạng d ữ li ệu và bi ểu di ễn thơng tin trong hệ vi x ử lý – vi điều khi ển 1.3.1. Các h ệ đếm 1.3.2. Bi ểu di ễn s ố và ký t ự 1.3.3. Các phép tốn s ố h ọc trên h ệ đếm nh ị phân Ch ươ ng II: H ọ vi x ử lý Intel 80x86 2.1. Cấu trúc ph ần c ứng c ủa b ộ vi x ử lý 8086 2 2.1.1. Tổng quan [1] - [4] Gi ảng 2.1.2. Cấu trúc bên trong và s ự ho ạt động 2.1.3. Các ch ế độ địa ch ỉ 2.2. Tập l ệnh 2.2.1. Gi ới thi ệu chung 3 [1] - [4] Gi ảng 2.2.2. Các nhĩm l ệnh 2.3. Bi ểu đồ th ời gian ghi/ đọc 2.4. Lập trình h ợp ng ữ (Assembly) cho vi x ử lý 4 80x86 [1] - [4] Gi ảng 2.4.1. Gi ới thi ệu chung v ề h ợp ng ữ
  8. 2.4.2. Cấu trúc c ủa ch ươ ng trình h ợp ng ữ 2.4.3. Các c ấu trúc điều khi ển c ơ b ản 2.4.4. Các b ước khi l ập trình 2.4.5. Các bài t ập ví d ụ 5 Th ảo lu ận Ch ươ ng III: H ệ vi điều khi ển onchip MCS 8051 3.1. Gi ới thi ệu chung v ề vi điều khi ển 3.1.1. Gi ới thi ệu chung 6 [1] - [4] Gi ảng 3.1.2. Khái ni ệm vi điều khi ển 3.1.3. Cấu trúc chung c ủa vi điều khi ển 3.2. Ki ến trúc vi điều khi ển 8051 7 Ki ến trúc vi điều khi ển 8051 (ti ếp) [1] - [4] Gi ảng 8 Ki ểm tra gi ữa k ỳ 3.3. Tập l ệnh 8051 và l ập trình h ợp ng ữ cho 8051 9 3.3.1. Tập l ệnh 8051 [1] - [4] Gi ảng 3.3.2. Thành ph ần ngơn ng ữ assembly 10 3.4. Ki ến trúc vi điều khi ển 8051 [1] - [4] Gi ảng Th ảo 11 Th ảo lu ận [1] - [4] lu ận 12 Ki ến trúc vi điều khi ển 8051 (ti ếp) [1] - [4] Gi ảng Ch ươ ng IV: Ứng d ụng Th ảo 13 [1] - [4] lu ận 14 Ch ươ ng V: Các h ệ V ĐK tiên ti ến [1] - [4] Gi ảng Th ảo 15 Th ảo lu ận [1] - [4] lu ận
  9. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển CH ƯƠ NG 1. TỔNG QUAN V Ề VI X Ử LÝ – VI ĐIỀU KHI ỂN Mục tiêu: Giúp sinh viên hi ểu v ề lịch s ử ra đời c ủa vi xử lý – vi điều khi ển; khái ni ệm, và nguyên lý c ủa h ệ vi x ử lý – vi điều khi ển; ơn l ại ki ến th ức v ề các h ệ th ống s ố đếm. Tĩm t ắt ch ươ ng: Ch ươ ng chia làm 3 ph ần: Gi ới thi ệu chung v ề vi x ử lý – vi điều khi ển Khái ni ệm Phân bi ệt vi x ử lý và vi điều khi ển Lịch s ử phát tri ển c ủa các b ộ x ử lý Ứng d ụng c ủa vi x ử lý và vi điều khi ển Cấu trúc chung c ủa h ệ vi x ử lý/vi điều khi ển Định d ạng d ữ li ệu và bi ểu di ễn thơng tin trong vi x ử lý – vi điều khi ển Các h ệ đếm Bi ểu di ễn s ố và ký t ự Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 9 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  10. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển 1.1 Giới thi ệu chung v ề vi x ử lý – vi điều khi ển 1.1.1 Khái ni ệm Vi x ử lý: hay cịn g ọi là bộ vi x ử lý (vi ết tắt là µP hay uP ) là m ột vi m ạch tích h ợp đa năng l ập trình được, th ực hi ện vi ệc xử lý d ữ li ệu nh ị phân theo các câu lệnh lưu trong b ộ nh ớ. Vi x ử lý làm vi ệc d ựa trên xung clock và các thanh ghi, nĩ tích h ợp t ất cả (ho ặc g ần nh ư tất c ả) các ch ức n ăng c ủa m ột CPU. Vi x ử lý Hình 1-1.B ộ vi x ử lý Intel th ường được s ử dụng trong máy tính ho ặc 80486DX2 các ứng d ụng đa m ục đích, yêu c ầu t ốc độ tính tốn cao trên kh ối l ượng d ữ li ệu l ớn. Dữ li ệu ra ho ặc các Dữ li ệu vào d ạng Vi x ử lý nh ị phân lệnh điều khi ển Lệnh trong bộ nh ớ Hình 1-2. Minh ho ạ ch ức n ăng c ủa vi x ử lý - Tính đa n ăng(multipurpose): tức là vi x ử lý cĩ th ể được s ử dụng để th ực hi ện nhi ều ch ức n ăng ho ặc nhi ệm v ụ tính tốn ph ức t ạp khác nhau(nh ư gi ải mã các file mp3, mp4, wmv, tìm ki ếm m ặt hàng trong c ơ s ở dữ li ệu hay thơng kê thu chi trong bài tốn qu ản lý bán hàng cho siêu th ị, tính tốn xác định v ị trí c ủa b ạn trong googlemap, tính tốn xác định qu ỹ đạo hay l ực đẩy cho t ầu khơng gian, ). - Tính l ập trình được(programable): tức là vi x ử cĩ th ể được ch ỉ dẫn để th ực hi ện các nhi ệm v ụ khác nhau trong kh ả năng c ủa nĩ. Các ch ỉ dẫn ở đậy được g ọi là ch ươ ng trình(program) và được l ưu trong b ộ nh ớ(memmory). 10 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  11. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển Vi điều khi ển: (vi ết t ắt µC , uC ho ặc MCU ) là một máy tính tích hợp trên một chip duy nh ất bao g ồm cả CPU, b ộ nh ớ (ROM+RAM) và các ngo ại vi l ập trình được. Vi điều khi ển được thi ết k ế v ới m ục tiêu ch ủ y ếu cho các h ệ th ống nhúng(embedded system), nh ằm gi ải quy ết các bài tốn chuyên bi ệt. Nĩ được ứng dụng r ộng dãi trong các thi ết b ị ho ặc các sản ph ẩm t ự động hố nh ư robot, thi ết b ị ý tế, thi ết b ị c ầm tay, đồ ch ơi, Các ứng d ụng này ch ỉ yêu c ầu t ốc độ tính tốn và d ữ li ệu x ử lý ở m ức nh ỏ ho ặc v ừa ph ải, nh ưng l ại yêu c ầu cao v ề kh ả n ăng k ết n ối, xu ất/nh ập d ữ li ệu linh ho ặc và th ời gian th ực v ới mơi tr ường bên ngồi. 1.1.2 Phân bi ệt vi x ử lý và vi điều khi ển Câu h ỏi đặt ra là vi x ử lý(microprocessor) và vi điều khi ển(microcontroller) cĩ gi ống nhau khơng? Ta kh ẳng định câu tr ả l ời là Khơng, b ởi vì vi x ử lý nằm trong(là CPU) vi điều khi ển. Chức n ăng chính của vi x ử lý là x ử lý d ữ li ệu (nh ư c ộng, tr ừ, nhân, chia, so sánh, ), nĩ khơng cĩ kh ả n ăng giao ti ếp tr ực ti ếp v ới các thi ết b ị ngo ại vi(nh ư máy in, bàn phím, ). Vi x ử lý v ượt tr ội h ơn so v ới vi điều khi ển về kh ả n ăng và t ốc độ tính tốn, cĩ th ể thay đổi ch ươ ng trình linh ho ạt theo m ục đích ng ười dùng, đặc bi ệt hi ệu qu ả đối v ới các bài tốn và h ệ th ống l ớn. Tuy nhiên đối v ới các ứng d ụng nh ỏ, chuyên bi ệt, khơng địi h ỏi kh ả n ăng tính tốn l ớn thì vi ệc ứng d ụng vi x ử lý c ần cân nh ắc. Với hệ th ống dù l ớn hay nh ỏ, n ếu dùng vi x ử lý thì c ũng địi h ỏi các kh ối mạch điện giao ti ếp ph ức t ạp. Các kh ối này bao g ồm b ộ nh ớ để ch ứa d ữ li ệu, ch ươ ng trình th ực hi ện, các m ạch điện giao ti ếp ngo ại vi để xu ất nh ập và điều khi ển. Để k ết n ối các kh ối này địi h ỏi ng ười thi ết k ế ph ải hi ểu bi ết rõ về các thành ph ần vi x ử lý, b ộ nh ớ, các thi ết b ị ngo ại vi. Cu ối cùng h ệ th ống được t ạo ra khá ph ức t ạp, chi ếm nhi ều khơng gian, giá thành cao, khơng phù h ợp để áp d ụng cho các h ệ th ống nh ỏ và chuyên bi ệt, Vì m ột s ố nh ược điểm trên nên các nhà ch ế t ạo đã tích h ợp m ột số thành ph ần cơ b ản nh ư vi x ử lý, bộ nh ớ và một s ố m ạch giao ti ếp ngo ại vi vào một IC duy nh ất được g ọi là Vi điều khi ển. Vi điều khi ển cĩ kh ả n ăng t ươ ng t ự nh ư vi x ử lý, nh ưng cấu trúc ph ần c ứng dành cho ng ười dùng đơ n gi ản h ơn nhi ều. Vi điều khi ển ra đời mang l ại s ự ti ện l ợi đối v ới ng ười dùng, h ọ khơng c ần n ắm v ững m ột kh ối l ượng ki ến th ức quá l ớn về vi m ạch nh ư ng ười dùng vi x ử lý, k ết c ấu m ạch điện c ũng tr ở Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 11 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  12. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển nên đơ n gi ản h ơn nhi ều và đặc bi ệt vi điều khi ển cĩ kh ả n ăng giao ti ếp tr ực ti ếp v ới các thi ết b ị ngo ại vi. Kh ả n ăng và t ốc độ x ử lý d ữ li ệu c ủa vi điều khi ển b ị gi ới h ạn, nh ưng l ại cĩ giá thành r ẻ, sử d ụng đơ n gi ản, do đĩ nĩ được ứng d ụng r ộng rãi vào nhi ều ứng d ụng chuyên bi ệt, khơng địi h ỏi tính tốn ph ức t ạp. Bảng 1-1. Tổng k ết so sánh gi ửa Vi x ử lý và Vi điều khi ển Microprocessor Microcontroller • CPU, timers, I/O ports, memmory • CPU, timers, I/O ports, memmory (ROM/RAM) là các IC riêng bi ệt. (ROM/RAM) được tích h ợp trong một IC duy nh ất. • Th ường được s ử dụng cho các ứng • Th ường được s ử dụng cho các ứng dụng đa n ăng (VD nh ư máy tính). dụng chuyên d ụng(nh ư máy ảnh, điện tho ại, máy gi ặt, ). • Cĩ th ể tải và th ực thi các ph ần m ền • Ph ần m ềm th ường được n ạp s ẵn một cách linh ho ặt theo ng ười s ử trong ROM và ch ỉ ph ục v ụ cho ứng dụng (Máy tính cĩ th ể cài và ch ạy dụng c ủa h ệ th ống(ph ần m ềm máy nhi ều lo ại ph ần m ềm). ảnh khơng th ể dung cho điện tho ại). • Kích th ước b ộ nh ớ, s ố lượng c ổng • Kích th ước b ộ nh ớ và s ố cổng vào ra vào ra l ớn, cĩ th ể được câu hình l ại bị hạn ch ế tu ỳ thu ộc vào lo ại vi điều để nâng c ấp. khi ển được dùng. • Kích th ước IC l ớn, tiêu hao n ăng • Kích th ước nh ỏ (càng nh ỏ càng t ốt), lượng l ớn, và chi phí đắt. tiêu hao n ăng l ượng ít, chi phí t ối thi ểu. • Tốc độ rất l ớn th ường tính b ằng • Tốc độ hạn ch ế th ường tính b ằng GHz MHz • Tập l ệnh l ớn, ph ức t ạp. • Tập l ệnh nh ỏ gọn, đơ n gian. 12 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  13. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển 1.1.3 Lịch s ử phát tri ển của vi x ử lý Hình 1-3. L ịch s ử phát tri ển c ủa VXL - Th ế hệ 1 (1971 - 1973): vi x ử lý 4 bit, đại di ện là 4004, 4040, 8080 (Intel) hay IPM-16 (National Semiconductor). • Độ dài word th ường là 4 bit (cĩ th ể lớn h ơn). • Tốc độ 10 - 60 µs / l ệnh v ới t ần s ố xung nh ịp 0.1 - 0.8 MHz. + T ập l ệnh đơ n gi ản và ph ải c ần nhi ều vi m ạch ph ụ tr ợ. - Th ế hệ 2 (1974 - 1977): vi x ử lý 8 bit, đại di ện là 8080, 8085 (Intel) hay Z80 . • Tập l ệnh phong phú h ơn. • Địa ch ỉ cĩ th ể đến 64 KB. M ột s ố bộ vi x ử lý cĩ th ể phân bi ệt 256 địa ch ỉ choiết b ị ngo ại vi. • Sử dụng cơng ngh ệ NMOS hay CMOS. • Tốc độ 1 - 8 µs / lệnh với t ần s ố xung nh ịp 1 - 5 MHz - Th ế hệ 3 (1978 - 1982): vi x ử lý 16 bit, đại di ện là 68000/68010 (Motorola) hay 8086/ 80286/ 80386 (Intel) • Tập l ệnh đa d ạng v ới các l ệnh nhân, chia và x ử lý chu ỗi. • Địa ch ỉ bộ nh ớ cĩ th ể từ 1 - 16 MB và cĩ th ể phân bi ệt t ới 64KB địa ch ỉ cho ngo ại vi • Sử dụng cơng ngh ệ HMOS. • Tốc độ 0.1 - 1 µs / l ệnh v ới t ần s ố xung nh ịp 5 - 10 MHz. - Th ế hệ 4: vi xử lý 32 bit 68020/68030/68040/68060 (Motorola) hay 80386/80486 (Intel) và vi x ử lý 32 bit Pentium (Intel) • Bus địa ch ỉ 32 bit, phân bi ệt 4 GB b ộ nh ớ. + Cĩ th ể dùng thêm các b ộ đồng x ử lý (coprocessor). • Cĩ kh ả năng làm vi ệc v ới b ộ nh ớ ảo. • Cĩ các c ơ ch ế pipeline, b ộ nh ớ cache. • Sử dụng cơng ngh ệ HCMOS. - Th ế hệ 5: vi x ử lý 64 bit Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 13 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  14. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển 1.1.4 Ứng d ụng c ủa Vi x ử lý/Vi điều khi ển Vi x ử lý chính là CPU của các lo ại máy tính ngày nay, nên tất c ả các ứng d ụng cĩ s ử dụng máy tính chính là một trong nh ững ứng d ụng c ủa vi x ử lý. Ở đây ch ỉ đư a ra các ứng d ụng ti ểu bi ểu của vi điều khi ển. Vi điều khi ển được s ử dụng để thi ết các sản ph ẩm nh ư:  Sản ph ẩm dân d ụng: o Nhà thơng minh:  Cửa t ự động  Khĩa s ố  Tự động điều ti ết ánh sáng thơng minh (b ật/t ắt đèn theo th ời gian, theo c ường độ ánh sáng, )  Điều khi ển các thi ết b ị từ xa (qua điều khi ển, qua ti ếng v ỗ tay, )  Điều ti ết h ơi ẩm, điều ti ết nhi ệt độ, điều ti ết khơng khí, giĩ  Hệ th ống v ệ sinh thơng minh o Các máy mĩc dân d ụng  Máy điều ti ết độ ẩm cho v ườn cây  Bu ồng ấp tr ứng gà/v ịt  Đồng h ồ số, đồng h ồ số cĩ điều khi ển theo th ời gian o Các s ản ph ẩm gi ải trí  Máy nghe nh ạc  Máy ch ơi game  Đầu thu k ỹ thu ật s ố, đầu thu set-top-box, o  Trong các thi ết b ị y t ế: o Máy mĩc thi ết b ị hỗ tr ợ: máy đo nh ịp tim, máy đo đường huy ết, máy đo huy ết áp, điện tim đồ, điện não đồ, o Máy c ắt/mài kính o Máy ch ụp chi ếu (city, X-quang, ) o  Các s ản ph ẩm cơng nghi ệp: o Điều khi ển động c ơ o Đo l ường ( đo điện áp, đo dịng điện, áp su ất, nhi ệt độ, ) o Cân b ăng t ải, cân toa xe, cân ơ tơ, o Điều khi ển các dây truy ền s ản xu ất cơng nghi ệp o Làm b ộ điều khi ển trung tâm cho Robot o 14 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  15. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển 1.2 Cấu trúc chung c ủa h ệ Vi x ử lý/Vi điều khi ển Chúng ta đã bi ết vi x ử lý mu ốn ho ạt động ph ải được ghép n ối v ới m ột s ố thành ph ần c ơ b ản khác để cùng làm vi ệc, ng ười ta g ọi đĩ h ệ vi x ử lý. Cịn vi điều khi ển lại chính là m ột h ệ vi x ử lý đơ n gi ản thu nh ỏ. Vì v ậy m ột s ơ đồ kh ối t ổng quát cho một h ệ vi x ử lý hay m ột vi điều khi ển được đư a ra ở Hình 1-3. CPU Memmory Input/Output (Microprocessor) Address Bus Data Bus Control Bus Hình 1-4. Sơ tổng quát c ủa h ệ vi xử lý - Memory (b ộ nh ớ): là ROM/RAM lưu tr ữ ch ươ ng trình hay các k ết qu ả trung gian. - Input/Output: bộ điều khi ển xu ất nh ập d ữ li ệu giao ti ếp v ới các thiêt b ị ngo ại vi. - CPU-Central Processing Unit( Đơ n v ị x ử lý trung tâm): Chức n ăng c ủa CPU là ti ến hành các thao tác tính tốn x ử lý, đư a ra các tín hi ệu địa ch ỉ, dữ li ệu và điều khi ển nh ằm th ực hi ện m ột nhi ệm v ụ nào đĩ do ng ười l ập trình đư a ra thơng qua các l ệnh (Instructions). - Address bus(Bus địa ch ỉ): Là các đường tín hi ệu song song 1 chi ều n ối t ừ CPU đến b ộ nh ớ, CPU g ửi giá tr ị địa ch ỉ c ủa ơ nh ớ c ần truy nh ập ( đọc/ghi) trên các đường tín hi ệu này. Độ r ộng c ủa bus địa ch ỉ là n (là s ố các đường tín hi ệu, v ới n cĩ th ể là 8, 18, 20, 24, 32 hay 64), khi đĩ số ơ nh ớ mà CPU cĩ th ể địa ch ỉ hố được sẽ là 2n. - Data bus(Bus d ữ li ệu): Là các đường tín hi ệu song song 2 chi ều, nhi ều thi ết b ị khác nhau cĩ th ể được n ối v ới bus d ữ li ệu, nh ưng t ại m ột th ời điểm ch ỉ cĩ 1 thi ết b ị duy nh ất cĩ th ể được phép đư a d ữ li ệu lên bus. Độ r ộng Bus dữ li ệu là m(v ới m cĩ th ể là 4, 8, 16, 32 hay 64), khi đĩ s ố bit mà mơi một chu k ỳ đọc/ghi cĩ th ể truy ền trên trên bus là m bits. - Control bus(Bus điều khi ển): CPU g ửi tín hi ệu thơng qua bus này để điều khi ển m ọi ho ạt động c ủa h ệ th ống. Các tín hi ệu điều khi ển th ường là: đọc/ ghi b ộ nh ớ, đọc/ ghi c ổng vào/ra, Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 15 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  16. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển 1.3 Định d ạng d ữ li ệu và bi ểu di ễn thơng tin trong h ệ vi x ử lý – vi điều khi ển 1.3.1 Các h ệ đếm và mã BCD • Hệ th ập phân – Decimal: S ử d ụng 10 ký t ự {0,1,2,3,4,5,6,7,8,9} để t ổ h ợp t ạo nên các s ố. Giá tr ị c ủa 1 s ố D trong h ệ th ập phâp t ổng quát là: = ∗ 10 VD: V ới D=123 ta cĩ n=3 v ậy D=1*10 2+2*10 1+3*10 0=123 • Hệ nh ị phân – Binary: S ử d ụng 2 ký t ự {0,1} để t ổ h ợp t ạo nên các s ố. Giá tr ị của 1 s ố B trong h ệ nh ị phâp t ổng quát là: = ∗ 2 VD: V ới B=101 ta cĩ n=3 v ậy B=1*2 2+0*2 1+1*2 0=5 • Hệ th ập l ục phân – Hexadecimal: Sử d ụng 16 ký t ự {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} để t ổ h ợp t ạo nên các s ố. Giá tr ị c ủa 1 s ố H trong h ệ th ập lục phâp t ổng quát là: = ∗ 16 VD: V ới H=123 ta cĩ n=3 v ậy H=1*16 2+2*16 1+3*16 0=291 Bảng giá tr ị các ký t ự s ố trong h ệ th ập l ục phân: Hệ th ập l ục phân Hệ th ập phân 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 16 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  17. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển • Mã BCD: Trong các h ệ th ống điện t ử và máy tính mã BCD là ph ươ ng th ức mã hố nh ị phân cho m ỗi ký t ự s ố h ệ th ập phân. Mã BCD cĩ 2 lo ại: o Mã BCD khơng nén (unpacked): mỗi m ột s ố th ập phân t ừ 0 đến 9 được mã hố b ằng 8 bit nh ị phân. o Mã BCD nén (packed): mỗi m ột s ố th ập phân t ừ 0 đến 9 được mã hố bằng 4 bit nh ị phân. Mã BCD được s ử d ụng r ộng rãi trong l ĩnh v ực điện t ử, khi c ần hi ển th ị các giá tr ị s ố trên các hệ th ống quang báo (nh ư LED 7 đoạn) mà khơng c ần đến s ự h ỗ tr ợ của m ột vi x ử lý. Tuy nhiên c ần cĩ các IC chuyên d ụng trong vi ệc gi ải mã/mã hố BCD. Ví d ụ nh ư ta c ần hi ển th ị s ố 1 lên 1 LED 7 đoạn nh ư Hình 1-5, ch ắc h ẳn ta s ẽ tìm cách c ấp ngu ồn cho 2 led f và e (ho ặc b và c), và cách làm t ươ ng t ự v ới các s ố khác t ừ 0 đến 9. Ta g ọi đĩ là gi ải mã th ủ cơng, nh ưng nh ờ cĩ mã BCD v ới s ự h ỗ tr ợ của các IC chuyên d ụng (nh ư IC gi ải mã BCD 74xx47), ng ười s ử d ụng ch ỉ c ần g ửi cho IC mã 4 bit ho ặc 8 bit c ủa s ố 1, cơng vi ệc cịn l ại để cĩ th ể hi ển th ị được s ố 1 trên LED là c ủa IC. Hình 1-5.LED 7 đoạn Số th ập phân Mã BCD (4 bit) 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Bảng 1-2. Mã BCD c ủa 10 s ố th ập 0 9 1.3.2 Mã ký t ự - Alphanumeric CODE (ASCII, EBCDIC) ASCII (American Standard Code for Information Interchange - Chu ẩn mã trao đổi thơng tin Hoa Kì), th ường được phát âm là át-xơ-ki , là b ộ kí t ự và bộ mã kí tự dựa trên bảng ch ữ cái La Tinh được dùng trong ti ếng Anh hi ện đại và các ngơn ng ữ Tây Âu khác. Nĩ th ường được dùng để hi ển th ị v ăn b ản trong máy tính và các thi ết b ị thơng tin khác. Nĩ c ũng được dùng b ởi các thi ết b ị điều khi ển làm vi ệc v ới văn b ản. Với mã ASCII chu ẩn s ử d ụng 7 bit đã mã hố cho 128 ký t ự nh ư Hình 1-6. Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 17 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  18. Bài gi ảng Ch ươ ng 1 Vi x ử lý - Vi điều khi ển Tổng quan v ề vi x ử lý – vi điều khi ển Hình 1-6. B ảng mã ASCII 18 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  19. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Họ vi x ử lý Intel 80x86 CH ƯƠ NG 2. VI X Ử LÝ INTEL 8086/8088 Mục tiêu: Hi ểu được c ấu trúc ph ần c ứng c ủa h ệ vi x ử lý; hi ểu và v ận d ụng được các ch ế độ địa ch ỉ; n ắm được tập l ệnh và l ập trình cho vi x ử lý 8086/8088. Tĩm t ắt ch ươ ng: • Cấu trúc ph ần c ứng c ủa b ộ vi x ử lý 8086/8088 • Ch ế độ địa ch ỉ • Tập l ệnh • Các m ạch ph ụ tr ợ • Bi ểu đồ th ời gian ghi/ đọc • Lập trình h ợp ng ữ (Assembly) cho vi x ử lý 8086/8088 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 19 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  20. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 2.1 Tổng quan v ề vi x ử lý Intel 8086/8088 2.1.1 Các thành ph ần c ơ b ản c ủa CPU Hình 2-1.Cấu trúc t ổng quát c ủa CPU Một cách t ổng quát CPU g ồm cĩ 3 thành ph ần:  Control Unit (CU): Kh ối điều khi ển, tạo ra t ất c ả các tín hi ệu điều khi ển trong CPU. Nĩ kh ởi t ạo các thanh ghi khi m ở ngu ồn, th ực hi ện vi ệc n ạp và gi ải mã l ệnh. Nh ận và g ửi l ại các tín hi ệu điều khi ển qua h ệ th ống Bus giúp CPU c ủa th ể giao ti ếp v ới các thi ết b ị bên ngồi. Kh ối điều khi ển cĩ th ể được th ực hi ện hồn tồn b ởi ph ần c ứng ( điều khi ển c ứng, ví d ụ nh ư s ử d ụng m ột bộ đếm tr ạng thái và m ột m ảng logic kh ả trình) hay k ết h ợp gi ữa các l ệnh ph ần m ềm (vi l ệnh được l ưu tr ữ trong CPU) và ph ần c ứng (b ộ điều khi ển vi ch ươ ng trình. C ả hai h ọ vi xử lý Intel 8086 và Motorola 68000 đều s ử d ụng các b ộ điều khi ển vi ch ươ ng trình.  Registers: Tập các thanh ghi, là các b ộ nh ớ cĩ kích th ước nh ỏ (th ường là 8, 16, 32, 64, 128 bit) cĩ t ốc độ cao. Được s ử d ụng để l ưu d ữ li ệu ho ặc địa ch ỉ lệnh trong quá trình th ực thi c ảu CPU.  ALU: Kh ối tốn h ọc và logic, th ực hi ện các phép tốn s ố h ọc và logic (nh ư +,-,*,/,and,or,xor, ). 2.1.2 Cấu trúc c ủa 8086/8088 Vi x ử lý 8088/8086 th ực thi m ột ch ươ ng trình b ằng cách lặp đi l ặp l ại 3 thao tác chính là l ấy l ệnh (fetch), gi ải mã l ệnh (decode) và th ực hi ện (execute). S ơ đồ kh ối c ủa b ộ vi x ử lý 8088/8086 gồm 2 đơ n v ị chính(Hình 2-2): - EU (Execution Unit): Đơ n v ị (kh ối) th ực hi ện l ệnh. - BIU (Bus Interface Unit): Đơ n v ị giao ti ếp bus (kh ối t ươ ng thích bus) để điều khi ển bus hi ệu qu ả h ơn. 2.1.2.1. EU – Kh ối th ực thi Đơ n v ị EU c ủa 8088 và 8086 gi ống nhau, bao g ồm ALU, thanh ghi c ờ, các thanh ghi đệm và các thanh ghi đa n ăng. Các bus d ữ li ệu bên trong c ủa EU đều là 20 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  21. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 16 bit. EU khơng k ết n ối tr ực ti ếp v ới bên ngồi, nĩ nh ận l ệnh t ừ hàng đợi l ệnh bên trong BIU. N ếu là l ệnh c ần truy nh ập b ộ nh ớ ho ặc c ổng vào/ra (I/O port - thi ết b ị ngo ại vi) thì EU yêu c ầu BIU l ấy ho ặc g ửi d ữ li ệu. T ất c ả các địa ch ỉ mà EU thao tác đều là 16 bit, khi g ửi sang BIU thì BIU s ẽ th ực hi ện tính tốn để t ạo địa ch ỉ v ật lý 20 bit và phát ra các chân địa ch ỉ c ủa chip. Bus đị a ch ỉ (20 bit) AX EU BIU các thanh ghi BX đa n ăng CX DX Bus d ữ li ệu SP CS (8 bit) các thanh ghi BP DS con tr ỏ SI các thanh ghi đoạn SS Bus trong và ch ỉ s ố và con tr ỏ l ệnh DI ES 8 bit d ữ li ệu 20 bit đị a ch ỉ IP Bus d ữ li ệu ALU(16bit) Logic điều khi ển các thanh ghi t ạm BUS BUS ngồi Kh ối điều khi ển của EU Đệ m l ệnh (hàng đợ i l ệnh) (6 byte cho 8086) thanh ghi c ờ Hình 2-2. Sơ đồ kh ối 8086/8088 a) Các thanh ghi đa n ăng Cĩ 4 thanh ghi, bao g ồm các thanh ghi 16 bit Ax, Bx, Cx, Dx. Mỗi thanh ghi này cĩ th ể được phân chia thành 2 thanh ghi 8 bit làm vi ệc độc l ập nhau. • AX (Accumulator, Acc): Thanh ch ứa, ch ứa t ạm th ời d ữ li ệu (tốn h ạng, kết qu ả phép tốn nh ư nhân, chia và được coi là Acc). AX cĩ th ể được phân chia thành AH (Ph ần cao) và AL (Ph ần th ấp). • BX (Base): Thanh ghi c ơ s ở, th ường được dùng để ch ứa địa ch ỉ c ơ s ở cần truy nh ập trong lệnh XLAT. BX cĩ th ể được phân chia thành BH (Ph ần cao) và BL (Ph ần th ấp). • CX (Count): B ộ đếm, th ường được dùng để đếm s ố l ần l ặp c ủa cơng vi ệc (s ố l ần l ặp trong các vịng l ặp). CX cĩ th ể được phân chia thành CH (Ph ần cao) và CL (Ph ần th ấp). CX th ường được dùng để ch ứa s ố l ần l ặp Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 21 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  22. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 trong các l ệnh LOOP, cịn CL th ường ch ứa s ố l ần d ịch ho ặc quay trong các l ệnh d ịch quay thanh ghi. • DX (Data): Thanh ghi đữ li ệu, s ử d ụng để ch ứa tốn h ạng, k ết qu ả. DX cùng AX dùng để ch ứa tốn h ạng ho ặc k ết qu ả c ủa các phép nhân, chia số 16 bit. DX cịn ch ứa địa ch ỉ c ổng trong các l ệnh vào ra tr ực ti ếp (IN, OUT). DX cĩ th ể được phân chia thành DH (Ph ần cao) và DL (Ph ần th ấp). b) Các thanh ghi con tr ỏ Các thanh ghi SP, BP là các thanh ghi con tr ỏ khơng tách r ời. • SP (Stack Pointer): Thanh ghi con tr ỏ ng ăn x ếp, tr ỏ vào đỉnh hi ện th ời của ng ăn x ếp n ằm trong đoạn ng ăn x ếp SS (Nĩ luơn k ết h ợp v ới thanh ghi SS). Ta cĩ địa ch ỉ logic SS: SP. Sau m ỗi thao tác c ất m ột word vào stack (thao tác Push) thì SP t ự động gi ảm 2 đơ n v ị, cịn sau thao tác l ấy một word ra kh ỏi stack (thao tác Pop), SP được t ự động t ăng 2 đơ n v ị. • BP (Base stack Pointer): Con tr ỏ c ơ s ở, luơn tr ỏ vào m ột d ữ li ệu c ụ th ể nằm trong đoạn ng ăn x ếp SS. Ta cĩ địa ch ỉ logic SS: BP. • SI (Source Index): Thanh ghi ch ỉ s ố ngu ồn (hay ngu ồn), chỉ vào d ữ li ệu nằm trong đoạn DS. Ta cĩ địa ch ỉ logic DS: SI. • DI (Destination Index): Thanh ghi ch ỉ s ố đích, ch ỉ d ữ li ệu trong đoạn DS. Ta cĩ địa ch ỉ logic DS: DI. c) Kh ối ALU Làm nhi ệm v ụ th ực hi ện các l ệnh s ố h ọc và logic. • Số h ọc: +, -, *, /, so sánh, đảo dấu. • Logic: NOT, AND, OR, XOR. d) Thanh ghi cờ: Đây là thanh ghi 16 bit, m ỗi bit được s ử d ụng để th ể hi ện m ột tr ạng thái c ủa bộ vi x ử lý t ại m ột th ời điểm nh ất định trong quá trình th ực hi ện ch ươ ng trình (dãy các câu l ệnh), nh ưng ch ỉ dùng 9 bit đối v ới b ộ vi xử lý 8088/8086. M ỗi bit đĩ được gọi là m ột c ờ (flag). Giá tr ị c ủa m ỗi c ờ được bi ểu di ễn b ằng các ký hi ệu g ợi nh ớ nh ư cách bi ểu di ễn c ủa ch ươ ng trình Debug c ủa DOS. OF DF IF TF SF ZF AF PF CF • CF (Carry Flag): C ờ nh ớ (c ờ tràn). 22 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  23. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 CF = 1 khi k ết qu ả phép tốn tràn (t ức cĩ nh ớ ho ặc m ượn t ại bit MSB), CF = 0 trong tr ường h ợp ng ược l ại. C ờ này th ường được s ử d ụng khi th ực hi ện các phép c ộng, tr ừ các s ố nhi ều byte. Ví d ụ: 1011 0001 + 0110 1001 10001 1010 => CF=1 vì cĩ nh ớ t ại bit th ứ 8 • PF (Parity Flag): C ờ ch ẵn l ẻ. PF = 1 (PE - Parity Even) khi s ố bit 1 trong k ết qu ả phép tốn (hay các phép v ận chuy ển d ữ li ệu) là ch ẵn, PF = 0 (PO - Parity Old) trong tr ường h ợp ng ược l ại. • AF (Carry Flag): C ờ nh ớ ph ụ (tràn ph ụ - cờ b ổ tr ợ). Cờ này cĩ ý ngh ĩa khi ta làm vi ệc v ới s ố BCD. AF = 1 (AC - Auxiliary Carry) khi cĩ nh ớ ho ặc m ượn t ừ m ột s ố BCD th ấp (4 bit th ấp) sang m ột s ố BCD cao (4 bit cao) và AF = 0 (NA - No Auxiliary carry) trong tr ường h ợp ng ược l ại. • SF (Sign Flag): C ờ d ấu. Trong b ộ vi x ử lý 8088/8086 các s ố âm được bi ểu di ễn d ưới d ạng s ố bù 2, nên ph ải dùng c ờ SF để ch ỉ th ị d ấu c ủa k ết qu ả. SF = 1 (NG - NeGative), khi k ết qu ả phép tốn là m ột s ố âm, SF = 0 (PL- PLus) trong tr ường h ợp ng ược l ại. • ZF (Zero Flag): C ờ r ỗng. ZF = 1 (ZR - ZeRo) khi k ết qu ả phép tốn = 0, ZF = 0 (NZ-Non Zero) trong tr ường hợp ng ược l ại. • OF (Overflow Flag): C ờ tràn. OF = 1 (OV-OVerflow) khi k ết qu ả là s ố bù 2 v ượt khuơn kh ổ bi ểu di ễn (tràn s ố h ọc, hay nĩi cách khác: khi c ộng hai s ố cùng d ấu mà k ết qu ả là m ột s ố trái dấu thì OF = 1), OF = 0 (NV-Non oVerflow) trong tr ường h ợp ng ược l ại (c ờ này làm vi ệc v ới s ố cĩ d ấu). • Cờ điều khi ển Cờ tr ạng thái ph ụ thu ộc k ết qu ả phép tốn, cịn v ới c ờ điều khi ển ta cĩ th ể thi ết l ập nh ờ l ệnh. • IF (Interrupt Flag): C ờ ng ắt. Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 23 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  24. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 IF = 1 (EI-Enable Interrup), CPU cho phép ng ắt, IF = 0 (DI-Disable Interrup) CPU khơng cho phép ng ắt (c ấm) các lo ại ng ắt che được (Maskable) • TF (Trap Flag): C ờ b ẫy. TF = 1 CPU làm vi ệc trong ch ế độ ch ạy t ừng l ệnh, th ường dùng để g ỡ r ối ch ươ ng trình (debug). Sau khi th ực hi ện xong m ỗi l ệnh, b ộ vi x ử lý s ẽ phát ra m ột lệnh ng ắt (INT) để cĩ ki ểm tra ch ươ ng trình. • DF (Direction Flag): C ờ h ướng. Điều khi ển h ướng x ử lý đối v ới thao tác chu ỗi. DF = 1 (DN-DowN) thì các lệnh v ận chuy ển d ữ li ệu hay x ử lý chu ỗi s ẽ thao tác lùi t ừ ph ải đến trái (địa ch ỉ cao đến địa ch ỉ th ấp). DF=0 (UP) trong tr ường h ợp ng ược l ại (thao tác các ph ần t ử t ừ địa ch ỉ th ấp đến địa ch ỉ cao). 2.1.2.2. BIU - Đơ n v ị giao ti ếp Bus Ch ức n ăng chính BIU là th ực hi ện vi ệc trao đổi d ữ li ệu gi ữa CPU v ới các thi ết bị bên ngồi. BIU th ực hi ện các thao tác n ạp l ệnh, ghi/ đọc d ữ li ệu v ới b ộ nh ớ ho ặc các c ổng vào ra. a) Hàng đợi l ệnh: Là t ập các thanh ghi Với 8086 hàng đợi l ệnh là 6 byte, 8088 hàng đợi l ệnh là 4 byte. Nh ờ hàng đợi l ệnh mà CPU cĩ th ể n ạp m ột l ần nhi ều l ệnh, ho ặc n ạp lệnh khi 1 l ệnh khác đang được th ực thi nh ằm t ăng t ốc độ x ử lý. b) IP-Thanh ghi con tr ỏ lệnh Thanh ghi con tr ỏ l ệnh, tr ỏ vào l ệnh ti ếp theo chu ẩn b ị được th ực hi ện n ằm trong đoạn CS (CS: IP). Sau khi đọc 1 byte, IP t ự động t ăng thêm 1. Nh ư v ậy th ực tế thì c ặp CS:IP mới là con tr ỏ l ệnh vì nĩ ch ứa địa ch ỉ đầy đủ c ủa m ột l ệnh trong b ộ nh ớ. c) Các thanh ghi đoạn  CS (Code Segment): Thanh ghi đoạn mã, là thanh ghi địa ch ỉ đoạn mã lệnh, ch ứa địa ch ỉ c ơ s ở ( địa ch ỉ đoạn) c ủa ch ươ ng trình đang th ực hi ện.  DS (Data Segment): Thanh ghi đoạn d ữ li ệu, là thanh ghi địa ch ỉ đoạn d ữ li ệu, ch ứa địa ch ỉ đoạn c ủa vùng d ữ li ệu mà ch ươ ng trình đang th ực hi ện sử d ụng. Vùng này th ường ch ứa các bi ến c ủa ch ươ ng trình.  SS (Stack Segment): Thanh ghi đoạn ng ăn x ếp, là thanh ghi địa ch ỉ đoạn bộ nh ớ ngăn x ếp (stack) c ủa ch ươ ng trình đang ch ạy. 24 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  25. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088  ES (Extra Segment): Thanh ghi đoạn d ữ li ệu ph ụ, là thanh ghi địa ch ỉ đoạn d ữ li ệu b ổ sung mà ch ươ ng trình đang th ực hi ện s ử d ụng. Vùng này cũng th ường ch ứa các bi ến c ủa ch ươ ng trình. 2.1.2.3. Khơng gian địa ch ỉ 8088 cĩ 20 bit địa ch ỉ, trong khi đĩ các thanh ghi qu ản lý b ộ nh ớ là 16 bit. Vì v ậy để xác định m ột ng ăn nh ớ cĩ địa ch ỉ 20 bit, nĩ dùng 2 thanh ghi 16 bit để xác định địa ch ỉ. • Một thanh ghi l ưu địa ch ỉ đoạn. • Một thanh ghi l ưu địa ch ỉ l ệch (offset) Một địa ch ỉ yêu c ầu trong m ột l ệnh nào đĩ là địa ch ỉ logic cĩ dạng (Segment:offset) được t ạo ra t ừ vi ệc k ết h ợp các thanh ghi nh ư sau: DS:SI DS:DI DS:XX Địa v ật lý (ph ải là s ố 20 bit) được xác định nh ư sau: Địa v ật lý = địa ch ỉ đoạn*16 + địa ch ỉ l ệch Ví d ụ: DS = 4000h, SI = 3F4Dh Địa ch ỉ logic c ủa ng ăn nh ớ: 4000:3F4D Địa ch ỉ v ật lí c ủa ng ăn nh ớ: DS * 16 + SI = 40000 + 3F4D = 43F4Dh Tại m ột th ời điểm CPU qu ản lý được 4 đoạn nh ớ (DS, SS, CS, ES) , nĩ cĩ th ể đồng th ời truy nh ập 4 đoạn đĩ. Bộ nh ớ được chia thành nhi ều đoạn, m ỗi đoạn cĩ kích th ước t ối đa là 64KB (=2 16 trong 16 là kích th ước c ủa offset). V ậy ta cĩ 16 đoạn tách r ời(=2 20 /2 16 trong đĩ 20 là kích th ước bus địa ch ỉ 8086/8088) và địa ch ỉ lệch thay đổi t ừ 0000 H đến FFFFh. Nếu địa ch ỉ đoạn thay đổi t ừ 0000h đến FFFFh thì cĩ 64 K đoạn, khi đĩ các đoạn bao trùm lên nhau, 2 đoạn k ề nhau s ẽ cách nhau 16 Byte (Paragraph). Khi kh ởi động máy (ho ặc Reset) CS được n ạp giá tr ị F000h, IP được n ạp giá tr ị FFF0h. Địa ch ỉ này ch ỉ đến ch ươ ng trình kh ởi động trong ROM (địa ch ỉ v ật lý = F000h*16 + FFF0h = F0000h + FFF0h = FFFF0h). Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 25 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  26. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 2.1.3 Mơ t ả ch ức n ăng các chân Hình 2-3. S ơ đồ chân 8086/8088 8088 và 8086 g ần t ươ ng t ự nh ư nhau, ch ỉ khác ở độ rộng bus d ữ li ệu (8088 cĩ 8 cịn 8086 cĩ 16 đường dữ li ệu ngồi). Cả 2 b ộ xử lý đều cĩ: - Độ r ộng bus d ữ li ệu n ội là 16 bit - 20 đường địa ch ỉ (16 address/data + 4 address/status), cho phép địa ch ỉ hố khơng gian b ộ nh ớ t ối đa là 1Mbyte. - 2 ch ế độ ho ạt động (maximum và minimum mode): Chế độ min 8088 t ạo ra các tín hi ệu điều khi ển c ần thi ết để truy xu ất b ộ nh ớ hay các c ổng vào/ra. Chế độ max các chíp h ỗ tr ợ bên ngồi t ạo ra các tín hi ệu điều khi ển. - Cùng 1 t ập l ệnh Chi ti ết ch ức n ăng các chân c ủa 8086/8088 [I, O] Address/Data bus. Các chân ghép kênh các tín hi ệu ph ần th ấp c ủa bus địa ch ỉ và bus d ữ li ệu. Các chân này mang 8 bit AD7 - AD0 ph ần th ấp c ủa địa ch ỉ khi tín hi ệu ALE = 1, mang 8 bit ph ần th ấp của d ữ li ệu khi tín hi ệu ALE = 0. Các chân này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. [O] Address buss. Các bit ph ần cao c ủa bus địa ch ỉ. Các chân A15 - A8 này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. [O] Address/Status bus. Các chân ghép kênh các tín hi ệu ph ần A19/S6-A16/S3 cao c ủa bus địa ch ỉ và tín hi ệu tr ạng thái. Các bit địa ch ỉ A16 - 26 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  27. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 A19 s ẽ cĩ m ặt t ại các chân này khi ALE = 1, cịn khi ALE = 0 thì trên các chân này cĩ các tín hi ệu tr ạng thái S3 - S6. Các chân này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. Bit S6 luơn b ằng 0, bit S5 ph ản ánh giá tr ị bit IF c ủa thanh ghi c ờ. Hai bit S3 và S4 ph ối h ợp v ới nhau để ch ỉ vi ệc truy nh ập các thanh ghi đoạn. - S4 S3 Truy c ập đến - 0 0 Đoạn d ữ li ệu ph ụ - 0 1 Đoạn ng ăn x ếp - 1 0 Đoạn mã ho ặc khơng đoạn nào c ả - 1 1 Đoạn d ữ li ệu [O] Read signal. Xung cho phép đọc. Khi = 0 thì bus d ữ li ệu RD nh ận d ữ li ệu t ừ bộ nh ớ ho ặc thi ết b ị ngo ại vi. Chân này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. [I] Tín hi ệu báo cho CPU bi ết tình tr ạng s ẵn sàng c ủa thi ết b ị ngo ại vi hay b ộ nh ớ. Khi READY = 1 thì CPU th ực hi ện đọc/ghi dữ li ệu mà khơng ph ải chèn thêm các chu k ỳ đợi. Khi các thi ết b ị READY ngo ại vi hay b ộ nh ớ cĩ t ốc độ ch ậm, chúng cĩ th ể đư a tin hi ệu READY = 0 để báo cho CPU bi ết mà ch ờ chúng. Lúc này CPU tự kéo dài th ời gian th ực hi ện đọc/ghi b ằng cách chèn thêm các chu k ỳ đợi. [I] Interrupt request. Tín hi ệu yêu c ầu ng ắt che được. Khi cĩ yêu cầu ng ắt (INTR = 1) mà c ờ cho phép ng ắt IF = 1 thì CPU k ết INTR thúc l ệnh đang làm d ở, sau đĩ đi vào chu k ỳ ch ấp nh ận ng ắt và đư a ra bên ngồi tín hi ệu = 0. [I] Tín hi ệu t ại chân này được ki ểm tra b ởi l ệnh WAIT. Khi CPU th ực hi ện l ệnh WAIT mà lúc đĩ tín hi ệu = 1 thì nĩ s ẽ TEST ch ờ cho đến khi tín hi ệu = 0 thì m ới th ực hi ện l ệnh ti ếp theo. [I] None-Maskable Interrupt. Tín hi ệu yêu c ầu ng ắt khơng che được. Tín hi ệu này khơng b ị kh ống ch ế bởi c ờ IF và nĩ s ẽ được CPU nh ận bi ết b ằng tác động c ủa s ườn lên c ủa xung yêu c ầu NMI ng ắt. Nh ận được yêu c ầu ng ắt này (NMI = 1) CPU k ết thúc l ệnh đạng làm d ở,sau đĩ chuy ển sang th ực hi ện ch ươ ng trình ph ục v ụ ng ắt ki ểu INT2. [I] Tín hi ệu kh ởi động l ại 8088. Khi RESET = 1 kéo dài ít nh ất 4 chu k ỳ đồng h ồ thì 8088 b ị bu ộc ph ải kh ởi động l ại; nĩ xĩa các RESET thanh ghi DS, ES, SS, IP và FR v ề 0 và b ắt đầu th ực hi ện ch ươ ng trình t ại địa ch ỉ CS:IP = FFFF:0000H (c ờ IF = 0 để cấm Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 27 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  28. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 các yêu c ầu ng ắt khác tác động vào CPU và c ờ TF = 0 để bộ vi xử lý khơng b ị đặt trong ch ế độ ch ạy t ừng l ệnh). [I] Clock pin. Tín hi ệu đồng h ồ (xung nh ịp). Xung nh ịp cĩ độ CLK rỗng là 70% và cung c ấp nh ịp làm vi ệc cho CPU. [I] Chân ngu ồn. T ại đây CPU được cung c ấp +5V± 10%, 340 Vcc mA GND [O] Gound. 2 chân ngu ồn để nối v ới điểm 0V c ủa ngu ồn [I] Chân điểu khi ển ho ạt động c ủa CPU theo ch ế độ MIN/MAX. Ch ế độ MIN được ch ọn khi chân này nối tr ực ti ếp vào ngu ồn MN/ +5V khơng qua điện tr ở. Ch ế độ MAX được ch ọn khi chân này nối đất. Do 8088 làm vi ệc ở hai ch ế độ khác nhau nên cĩ m ột s ố chân tín hi ệu cĩ ch ức n ăng ph ụ thu ộc vào từng ch ế độ cụ th ể Ch ế độ MIN [O] IO/ cho 8088 (cịn M/ cho 8086). Ch ọn b ộ nh ớ (= 0) ho ặc thi ết b ị vào/ra (= 1) làm vi ệc v ới CPU. Khi đĩ trên bus địa IO/ ch ỉ sẽ cĩ địa ch ỉ tươ ng ứng c ủa các thi ết b ị đĩ. Chân này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. [O] Write. Xung cho phép ghi. Khi CPU đư a ra WR = 0 thì trên bus d ữ li ệu các d ữ li ệu đã ổn định và chúng s ẽ được ghi vào b ộ nh ớ tại th ời điểm đột bi ến WR = 1. Chân này ở tr ạng thái tr ở kháng cao khi CPU ch ấp nh ận treo. [O] Interrupt Acknowledge. Tín hi ệu báo cho các m ạch bên ngồi bi ết CPU ch ấp nh ận treo. CPU đư a ra INTA= 0 để báo là nĩ đang ch ờ mạch ngồi đư a vào s ố hi ệu ng ắt trên bus d ữ li ệu. [I] Address Latch Enable. Xung cho phép ch ốt địa ch ỉ. Khi ALE = 1 cĩ ngh ĩa là trên các chân ghép kênh AD cĩ địa ch ỉ của thi ết ALE bị vào/ra ho ặc ơ nh ớ. Khi CPU ch ấp nh ận treo chân này khơng ở tr ạng thái tr ở kháng cao mà ALE = 0. [O] Data Transmit/Receive. Tín hi ệu này cho bi ết bus d ữ li ệu DT/ đang v ận chuy ển d ữ li ệu vào CPU hay ra kh ỏi CPU. Tín hi ệu này c ũng dùng để điều khi ển các b ộ đệm 2 chi ều của bus d ữ li ệu. [O] Data bus Enable. Kích ho ạt các b ộ đệm bus d ữ li ệu. [I] Tín hi ệu yêu c ầu treo CPU để mạch ngồi th ực hi ện vi ệc trao đổi d ữ li ệu v ới b ộ nh ớ bằng cách truy nh ập tr ực ti ếp. Khi HOLD HOLD = 1, CPU d ừng th ực hi ện ch ươ ng trình đặt các bus địa ch ỉ, bus dữ li ệu và bus điều khi ển ở tr ạng thái tr ở kháng cao. HOLD = 0 thì CPU l ại th ực hi ện ch ươ ng trình bình th ường. HLDA [O] Hold Acknowledge. Tín hi ệu báo cho bên ngồi bi ết yêu c ầu 28 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  29. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 treo CPU đã được ch ấp nh ận [O] Status. Tín hi ệu tr ạng thái. Tín hi ệu này t ươ ng đươ ng v ới tín hi ệu 0 trong ch ế độ MAX và được dùng k ết h ợp v ới IO/ và DT/ để gi ải mã chu k ỳ ho ạt động c ủa bus. IO/ DT/ 0 Chu k ỳ điều khi ển bus 0 0 0 Đọc mã l ệnh 0 0 1 Đọc b ộ nh ớ 0 0 1 0 Ghi b ộ nh ớ 0 1 1 Bus r ỗi (ngh ỉ) 1 0 0 Ch ấp nh ận yêu c ầu ng ắt 1 0 1 Đọc thi ết b ị ngo ại vi 1 1 0 Ghi thi ết b ị ngo ại vi 1 1 1 Dừng Ch ế độ MAX Trong ch ế độ MAX m ột s ố tín hi ệu điều khi ển c ần thi ết được t ạo ra trên c ơ s ở các tín hi ệu tr ạng thái nh ờ dùng thêm ở bên ngồi m ột m ạch điều khi ển bus 8288. Ch ế độ MAX được s ử dụng khi trong h ệ th ống cĩ m ặt b ộ đồng x ử lý tốn h ọc 8087. [O] Status bits. Các chân này được dùng để ghép n ối v ới m ạch điều khi ển bus 8288. 8288 s ử dụng các tín hi ệu này để tạo ra các tín hi ệu điều khi ển trong chu k ỳ bus. IO/ DT/ 0 Chu k ỳ điều khi ển bus 0 0 0 Ch ấp nh ận yêu c ầu ng ắt 0 0 1 Đọc thi ết b ị ngo ại vi , , S2 S1 S0 0 1 0 Ghi thi ết b ị ngo ại vi 0 1 1 Dừng 1 0 0 Đọc mã l ệnh 1 0 1 Đọc b ộ nh ớ 1 1 0 Ghi b ộ nh ớ 1 1 1 Bus r ỗi (ngh ỉ) [I/O] Request/Grant. Yêu c ầu và ch ấp nh ận vi ệc truy nh ập tr ực RQ/ , RQ/ 1 0 ti ếp b ộ nh ớ. [O] Tín hi ệu do CPU đư a ra để khĩa các thi ết b ị ngo ại vi. Chân này được kích ho ạt b ằng cách dùng ti ếp đầu ng ữ LOCK: tr ước các l ệnh. [O] Queue Status. Các tín hi ệu này cho bi ết tr ạng thái c ủa hàng đợi l ệnh. QS1, QS0 QS1 QS0 Chu k ỳ điều khi ển bus 0 0 Khơng ho ạt động 0 0 Đọc byte mã l ệnh đầu tiên t ừ hàng đợi l ệnh Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 29 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  30. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 0 1 Hàng đợi l ệnh r ỗng 0 1 Đọc byte ti ếp theo t ừ hàng đợi l ệnh Trong b ộ hệ vi x ử với s ự cĩ m ặt c ủa b ộ đồng x ử lý tốn h ọc 8087, các tín hi ệu QS1 và QS0 được 8087 s ử dụng để đồng b ộ quá trình ho ạt động c ủa nĩ v ới 8088. 2.2 Ch ế độ địa ch ỉ 2.2.1 Mã hố l ệnh trong vi x ử lý 8086/8088 Mỗi l ệnh trong vi x ử lý 8086/8088 là m ột t ừ nh ị phân cĩ kích th ước t ừ 1 đến 6 byte tu ỳ thu ộc vào l ệnh c ụ th ể. Tuy nhiên t ất c ả các l ệnh đều cĩ c ấu trúc chung nh ư Hình 2-4. Byte 1 Byte 2 Byte 3 Byte 4 1 0 0 0 1 0 DispL DispH Opcode DW MOD REG R/M HoỈc Disp: Displacement (dÞch chuyĨn) §Þa chØ trùc tiÕp §Þa chØ trùc tiÕp phÇn thÊp phÇn cao Hình 2-4. Cách mã hố l ệnh trong 8086/8088 với l ệnh MOV Hình 2-4 cho ta m ột ví d ụ về mã hố l ệnh m ột l ệnh MOV, t ừ đây ta th ấy để mã hố l ệnh MOV cần ít nh ất 2 byte. Trong đĩ 6 bit đầu dùng để ch ứa mã lệnh(opcode), opcode c ủa l ệnh MOV này là 100010. Bit W dùng để ch ỉ ra r ằng m ột byte (W=0) ho ặc 2byte (W=1) s ẽ được chuy ền đi. Trong thao tác chuy ển d ữ li ệu, một tốn h ạng luơn b ắt bu ộc ph ải là thanh ghi. B ộ vi x ử lý s ử dụng 2 ho ặc 3 bit (REG) để mã hố các thanh ghi trong CPU nh ư sau: Thanh ghi Mã Thanh ghi đoạn Mã W = 1 W = 0 CS 01 AX AL 000 DS 11 BX BL 011 ES 00 CX CL 001 SS 10 DX DL 010 SP AH 100 DI BH 111 Bit D là h ướng đi c ủa d ữ li ệu. D = 1 thì BP CH 101 dữ li ệu đến thanh ghi, D = 0 thì d ữ li ệu đi ừ SI DH 110 ra t thanh ghi. Hai bit MOD (ch ế độ) cùng v ới ba bit R/M (thanh ghi/b ộ nh ớ) t ạo ra 5 bit dùng để ch ỉ ra ch ế độ địa ch ỉ cho các tốn h ạng của l ệnh. B ảng 2.2 cho ta th ấy cách mã hố các ch ế độ địa ch ỉ. 30 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  31. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 MOD 00 01 10 11 R/M W=0 W=1 000 [BX+SI] [BX+SI]+d8 [BX+SI]+d16 AL AX 001 [BX+DI] [BX+DI]+d8 [BX+DI]+d16 CL CX 010 [BP+SI] [BP+SI]+d8 [BP+SI]+d16 DL DX 011 [BP+DI] [BP+DI]+d8 [BP+DI]+d16 BL BX 100 [SI] [SI]+d8 [SI]+d16 AH SP 101 [DI] [DI]+d8 [DI]+d16 CH BP 110 D16( đ/c tr ực ti ếp) [BP]+d8 [BP]+d16 DH SI 111 [BX] [BX]+d8 [BX]+d16 BH DI Bảng 2-1.Ph ối h ợp MOD và R/M để t ạo ra các ch ế độ địa ch ỉ Ví d ụ 1 : MOV CL, [BX] Byte 1 Byte 2 10 0 0 1 0 1000001111 Opcode D W MOD REG R/M Mã l ệnh MOV: 100010 D = 1: Chuy ển t ới thanh ghi W = 0: Chuy ển 1 byte MOD: ở ch ế độ 00 và R/M là 111 REG: 001 mã hố CL Ví d ụ 2 : MOV AH, 2Ah Byte 1 Byte 2 Byte 3 10 0 0 1 0 100010011000 10 1 0 1 0 Opcode D W MOD REG R/M 2Ah Mã l ệnh MOV: 100010 D = 1: Chuy ển t ới thanh ghi W = 0: Chuy ển 1 byte MOD: ởỷ ch ế độ 00 và R/M là 110: Địa ch ỉ tr ực ti ếp REG: 100 mã hố AH 2Ah = 00101010 d ữ li ệu c ần chuy ển t ới AH Ví d ụ 3 : MOV CX, [BX][SI]+DATA DATA là m ột bi ến trong b ộ nh ớ, đĩ là địa ch ỉ l ệch và là m ột h ằng (ví d ụ nh ư 0BFF). Lệnh này s ẽ s ử d ụng 4 byte t ổ ch ức nh ư sau: Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 31 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  32. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Byte 1 Byte 2 Byte 3 Byte 4 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 11 1 1 1 1 1 00 00 1 0 1 1 D W MOD REG R/M Opcode FFh 0Bh Mã l ệnh MOV: 100010 D = 1: Chuy ển t ới thanh ghi W =1: Chuy ển 1 Word MOD: ở ch ế độ 10 (offset 16 bit) và R/M là 000 (s ử d ụng thanh ghi c ơ s ở BX và thanh ghi ch ỉ s ố SI). REG: 001 mã hố thanh ghi CX. Nh ư v ậy trong ký hi ệu nh ị phân và hexa ta cĩ. Byte 1 Byte 2 Byte 3 Byte 4 10001011 10001000 11111111 00001011 8Bh 88h FFh 0Bh 2.2.2 Các ch ế độ địa ch ỉ Ch ế độ địa ch ỉ (addressing mode) là cách để CPU tìm th ấy tốn h ạng cho các lệnh c ủa nĩ khi ho ạt động. M ột b ộ vi x ử lý cĩ th ể cĩ nhi ều ch ế độ địa ch ỉ. Các ch ế độ địa ch ỉ này được xác định ngay t ừ khi ch ế tạo và khơng th ể thay đổi được. B ộ vi xử lý 8086/8088 cĩ 9 ch ế độ địa ch ỉ sau: - Ch ế độ địa ch ỉ thanh ghi. - Ch ế độ địa ch ỉ t ức thì. - Ch ế độ địa ch ỉ tr ực ti ếp. - Ch ế độ địa ch ỉ gián ti ếp qua thanh ghi. - Ch ế độ địa ch ỉ t ươ ng đối c ơ s ở. - Ch ế độ địa ch ỉ t ươ ng đối ch ỉ s ố. - Ch ế độ địa ch ỉ t ươ ng đối c ơ s ở ch ỉ s ố. - Ch ế độ địa ch ỉ chu ỗi (String) – mảng. - Ch ế độ địa ch ỉ c ổng (Port). - Ch ế độ địa ch ỉ khác.  CH Ế ĐỘ ĐỊA CH Ỉ THANH GHI Trong ch ế độ địa ch ỉ này ng ười ta s ử dụng các thanh ghi cĩ s ẵn trong CPU nh ư là các tốn h ạng để ch ứa d ữ li ệu c ần thao tác, vì v ậy khi th ực hi ện cĩ th ể đạt t ốc độ truy nh ập cao h ơn so v ới các l ệnh truy nh ập đến b ộ nh ớ. Ví d : MOV BX, DX ;copy noi dung DX vao BX ADD AX, BX ;AX=AX+BX  CH Ế ĐỘ ĐỊA CH Ỉ T ỨC THÌ 32 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  33. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Trong ch ế độ này tốn h ạng đích là m ột thanh ghi hay m ột ơ nh ớ, cịn tốn h ạng ngu ồn là m ột h ằng s ố. Ta cĩ th ể dùng ch ế độ địa ch ỉ này để nạp d ữ li ệu c ần thao tác vào b ất k ỳ thanh ghi nào (tr ừ thanh ghi đoạn và thanh ghi c ờ) và b ất k ỳ ơ nh ớ nào trong đoạn d ữ li ệu DS. Ví d ụ: MOV CL, 100 ;chuyen 100 vao CL. MOV AX, 0BC8h ;chuyen 0BC8h vao AX de roi MOV DS, AX ;copy noi dung AX vao DS (vi ;khong duoc chuyen truc tiep vao thanh ghi doan). MOV [BX], 20 ;chuyen 20 vao o nho tai dia chi DS:BX.  CH Ế ĐỘ ĐỊA CH Ỉ TR ỰC TI ẾP Trong ch ế độ địa ch ỉ này m ột tốn h ạng ch ứa địa ch ỉ lệch c ủa ơ nh ớ dùng ch ứa dữ li ệu, cịn tốn h ạng kia cĩ th ể là thanh ghi mà khơng được là ơ nh ớ. Ví d ụ: MOV AL, [0243H];chuyen noi dung o nho DS:0243 vao AL MOV [4320], CX ;chuyen noi dung CX vao hai o nho ;lien tiep DS:4320 va DS:4321  CH Ế ĐỘ ĐỊA CH Ỉ GIÁN TI ẾP QUA THANH GHI Trong ch ế độ địa ch ỉ này m ột tốn h ạng là m ột thanh ghi được s ử dụng để ch ứa địa ch ỉ lệch c ủa ơ nh ớ dữ li ệu, cịn tốn h ạng kia ch ỉ cĩ th ể là thanh ghi mà khơng được là ơ nh ớ. Ví d ụ: MOV AL, [BX] ;copy noi dung o nho co dia chi DS:BX MOV [SI], CL ;copy noi dung CL vao o nho co dia ch ;DS:SI MOV [DI], AX ;copy noi dung AX vao hai o nho lien ;tiep co dia chi DS:DI va DS:(DI+1)  CH Ế ĐỘ ĐỊA CH Ỉ T ƯƠ NG ĐỐI CƠ S Ở Trong ch ế độ địa ch ỉ này các thanh ghi c ơ s ở nh ư BX và BP và các h ằng số bi ểu di ễn các giá tr ị dịch chuy ển được dùng để tính địa ch ỉ hi ệu d ụng c ủa tốn h ạng trong các vùng nh ớ DS và SS. Ví d ụ: MOV CX, [BX]+10 ;copy noi dung hai o nho lien tiep ;co dia chi DS:BX+10 va DS:BX+11 ;vao CX MOV CX, [BX+10] ;cach viet khac cua lenh tren MOV CX, 10+[BX] ;cach viet khac cua lenh tren MOV AL, [BP]+5 ;chuyen noi dung o nho co dia chi ;SS:BP+5 vao AL Quan sát trên ta th ấy: 10 và 5 là các d ịch chuy ển c ủa các tốn h ạng t ươ ng ứng. BX+10, BP+5 g ọi là địa ch ỉ hi ệu d ụng. DS:BX+10, SS:BP+5 chính là địa ch ỉ logic ứng v ới địa ch ỉ v ật lý. Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 33 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  34. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088  CH Ế ĐỘ ĐỊA CH Ỉ T ƯƠ NG ĐỐI CH Ỉ S Ố Trong ch ế độ địa ch ỉ này các thanh ghi ch ỉ số nh ư SI và DI và các h ằng s ố bi ểu di ễn các giá tr ị dịch chuy ển được dùng để tính địa ch ỉ hi ệu d ụng c ủa tốn h ạng trong các vùng nh ớ DS. Ví d ụ MOV CX, [SI]+10 ;copy noi dung hai o nho lien tiep ;co dia chi DS:SI+10 va DS:SI+11 vao CX MOV CX, [SI +10] ;cach viet khac cua lenh tren MOV CX, 10+[SI] ;cach viet khac cua lenh tren MOV AL, [DI]+5 ;chuyen noi dung o nho co dia chi ;DS:DI+5 vao AL  CH Ế ĐỘ ĐỊA CH Ỉ T ƯƠ NG ĐỐI CH Ỉ S Ố C Ơ S Ở Kết h ợp hai ch ế độ địa ch ỉ ch ỉ số và c ơ s ở ta cĩ ch ế độ địa ch ỉ ch ỉ số cơ s ở. Trong ch ế độ này ta dùng c ả hai thanh ghi c ơ s ở lẫn thanh ghi ch ỉ số để tính địa ch ỉ của tốn h ạng. N ếu ta dùng thêm c ả thành ph ần bi ểu di ễn s ự dịch chuy ển c ủa địa ch ỉ thì ta cĩ ch ế độ địa ch ỉ tổng h ợp nh ất: Ch ế độ địa ch ỉ tươ ng đối ch ỉ số cơ s ở. Ví d ụ: MOV BX, [BX]+[SI]+10 ;chuyen noi dung hai o nho ;lien tiep co dia chi DS:BX+SI+10 va DS:BX+SI+11 vao CX MOV AL, [BP+DI+5] ;copy n i dung ơ th : DS:BP+DI+5 vao AL Các ch ế độ địa ch ỉ đã trình bày ở trên cĩ th ể tĩm t ắt l ại trong b ảng sau: Ch ế độ địa ch ỉ Tốn h ạng Thanh ghi đoạn ng ầm định Thanh ghi Reg Tức thì Data Tr ực ti ếp [offset] DS [BX] DS Gián ti ếp qua thanh ghi [SI] DS [DI] DS [BX]+Disp DS Tươ ng đối c ơ s ở [BP]+Disp SS [DI]+Disp DS Tươ ng đối ch ỉ số [SI]+Disp DS [BX]+[DI]+Disp DS [BX]+[SI]+Disp DS Tươ ng đối ch ỉ số cơ s ở [BP]+[DI]+Disp SS [BP]+[SI]+Disp SS Bảng 2-2. Các ch ế độ địa ch ỉ Chú ý: Reg: Thanh ghi, Data: D ữ li ệu t ức thì, Disp: D ịch chuy ển.  CH Ế ĐỘ ĐỊA CH Ỉ CHU ỖI (STRING) – MẢNG Một chu ỗi (string) là m ột dãy các byte ho ặc word liên ti ếp trong b ộ nh ớ. Các lệnh thao tác v ới chu ỗi khơng s ử dụng b ất k ỳ một ch ế độ địa ch ỉ nào ở trên. M ột 34 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  35. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 chu ỗi cĩ th ể cĩ độ dài t ối đa lên t ới 64K-bytes (m ột segments). Ch ế độ địa ch ỉ chu ỗi sử dụng các thanh ghi SI, DI, DS và ES. V ới t ất c ả các l ệnh thao tác chu ỗi đều s ử dụng SI để tr ỏ vào byte đầu tiên c ủa chu ỗi ngu ồn và DI tr ỏ vào byte đầu tiên c ủa chu ỗi đích. Ví d ụ: Gi s : DS=1000h, ES=2000h, SI=10h, DI=20h) MOVSB ;Sao chép chu i t 10010h đn 20020h  CH Ế ĐỘ ĐỊA CH Ỉ C ỔNG (PORT) Trong h ọ vi x ử lý 80x86 c ủa Intel cĩ khơng gian địa ch ỉ cho b ộ nh ớ và c ổng vào/ra là tách bi ệt nhau. Khơng gian địa ch ỉ cổng cĩ th ể lên đến 65536 c ổng (64K- ports). Địa ch ỉ c ủa m ột c ổng cĩ th ể được xác định b ởi m ột h ằng giá tr ị ki ểu byte (ph ạm vi = 0 255) Ví d : IN AL, 40h ;Đc c ng – sao chép n i dung t i ;c ng cĩ đa ch 40h và thanh ghi AL OUT 80h, AL ;Ghi c ng – gi d li u trong thanh ;ghi AL t i c ng cĩ đa ch 80h Địa ch ỉ c ủa c ổng c ũng cĩ th ể được xác định gián ti ếp qua thanh ghi (Khi này ph ạm vi t ối đã s ẽ là 65536 c ổng). Ví d ụ: IN AL, DX ;Đc c ng cĩ đa ch là n i dung c a ;thanh ghi DX OUT DX, AX ;Ghi m t word trong AX t i c ng cĩ đa ;ch là n i dung c a thanh ghi DX. 2.3 Tập l ệnh Assembly 2.3.1 Gi ới thi ệu chung Tập l ệnh c ủa h ọ vi x ử lý 8086/8088 đảm b ảo t ươ ng thích th ế hệ sau v ới th ế hệ tr ước. điều đĩ cĩ ngh ĩa là các ch ươ ng trình vi ết cho 8086 v ẫn ch ạy được trên các b ộ vi x ử lý m ới h ơn mà khơng ph ải thay đổi (khơng đảm b ảo th ứ tự ng ược l ại). T ập lệnh c ủa m ột b ộ vi x ử lý th ường cĩ r ất nhi ều l ệnh (hàng tr ăm l ệnh), vì th ế mà vi ệc ti ếp c ận và làm ch ủ chúng là tr ươ ng đối khĩ kh ăn. Cĩ nhi ều cách trình bày t ập l ệnh c ủa b ộ vi x ử lý: Trình bày theo nhĩm l ệnh ho ặc theo th ứ tự abc. Để cĩ th ể nhanh chĩng và d ễ dàng s ử dụng các l ệnh c ơ b ản và l ập trình được ngay, ta s ẽ ti ếp c ận t ập l ệnh c ủa b ộ vi x ử lý theo nhĩm các thao tác c ơ bản trong quá trình x ử lý và điều khi ển. V ới m ỗi thao tác nĩi trên, ta làm quen v ới một vài l ệnh tiêu bi ểu ( độc gi ả cĩ th ể tra c ứu thêm các l ệnh khác trong ph ần ph ụ lục). Các ch ức n ăng cơ b ản c ủa m ột b ộ vi x ử lý th ường g ồm: - Nhĩm các l ệnh v ận chuy ển (sao chép) d ữ li ệu. Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 35 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  36. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 - Nhĩm các l ệnh tính tốn s ố h ọc. - Nhĩm các l ệnh tính tốn logic. - Nhĩm các l ệnh d ịch, quay tốn h ạng. - Nhĩm các l ệnh nh ảy (r ẽ nhánh). - Nhĩm các l ệnh l ặp. - Nhĩm các l ệnh điều khi ển, đặc bi ệt khác. 2.3.2 Các nhĩm l ệnh 2.3.2.1 Nhĩm các l ệnh v ận chuy ển (sao chép) d ữ li ệu 1. MOV – Vận chuy ển một byte hay t ừ(2 byte) Dạng l ệnh: MOV Đích, Ngu ồn Mơ t ả: Đích ←Ngu ồn Trong đĩ tốn h ạng đích và Ngu ồn cĩ th ể tìm được theo các ch ế độ địa ch ỉ khác nhau, nh ưng ph ải cĩ cùng độ dài và khơng được phép đồng th ời là hai ơ nh ớ ho ặc hai thanh ghi đoạn. Các c ờ b ị thay đổi: khơng. Ví d ụ: MOV AL, AH ;AL ←AH MOV CX, 50 ;CX ←50 MOV DL, [SI] ;DL ←{DS:SI} 2. OUT – Vận chuy ển 1 byte hay 1 t ừ(2byte) dữ li ệu ở Acc ra cổng(port) Dạng l ệnh: OUT Port, Acc Mơ t ả: Acc →{Port} Trong đĩ port là địa ch ỉ c ủa c ổng c ần đư a d ữ li ệu ra, cĩ kích th ước 1byte và được quy định tr ước trong vùng giá tr ị t ừ 00 FFH. Nh ư v ậy cĩ th ể cĩ các kh ả n ăng sau đây. - Nếu Acc là AL thì d ữ li ệu 8 bit được đư a ra c ổng Port. - Nếu Acc là AX thì d ữ li ệu 16 bit được đư a ra c ổng Port và Port + 1. Cĩ m ột cách khác để ch ứa địa ch ỉ c ổng là thơng qua thanh ghi DX. Khi dùng thanh ghi DX để ch ứa địa ch ỉ c ổng ta cĩ kh ả n ăng địa ch ỉ hố c ổng m ềm d ẻo hơn. Lúc này địa ch ỉ c ổng n ằm trong d ải 0000H FFFFH và vi ết l ệnh theo d ạng: OUT DX, Acc Các c ờ b ị thay đổi: khơng. Ví d ụ: OUT 45H, AL ;dua du lieu tu AL ra cong 45H MOV DX, 0 ;xoa DX MOV DX, 00FFH ;nap dia chi cong vao DX 36 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  37. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 OUT DX, AX ;dua du lieu tu AX ra 00FFH 3. IN – Đọc d ữ li ệu t ừ c ổng vào thanh ghi Acc. Dạng l ệnh: IN Acc, Port Lệnh IN truy ền m ột byte ho ặc m ột t ừ(2byte) từ m ột c ổng cĩ địa ch ỉ port thanh ghi AL ho ặc AX. Địa ch ỉ c ủa c ổng cĩ th ể được xác định là m ột h ằng số 8bit cĩ giá tr ị trong mi ền từ 00 FFh, n ếu s ử d ụng thanh ghi DX để l ưu địa ch ỉ cơng thì ta cĩ th ể truy c ập vào các c ổng t ừ 0 65535, khi đĩ d ạng th ức c ủa l ệnh sẽ là : IN Acc,DX Các c ờ b ị thay đổi: khơng. Ví d ụ: IN AL, 45H ;doc mot byte tu mot cong duoc xac ;dinh trong che do tuc thi IN AX, 0046H ;doc hai byte tu mot cong duoc xac ;dinh trong che do tuc thi IN AX, DX ;doc mot tu tu mot cong dang bien 4. POP – Lấy 1 t ừ(2byte) từ đỉnh ng ăn x ếp Dạng l ệnh: POP Đích Mơ t ả: Đích ←{SP} SP ←SP+2 (do cách t ổ ch ức c ủa stack, đáy ng ăn x ếp l ại ở vùng nh ớ cao, đỉnh ng ăn x ếp ở vùng nh ớ th ấp) Tốn h ạng đích đích cĩ th ể là các thanh ghi đa n ăng, thanh ghi đoạn (nh ưng khơng được là thanh ghi đoạn mã CS) ho ặc ơ nh ớ. Các c ờ b ị thay đổi: khơng. Ví d ụ: POP DX ;lay 2 byte tu dinh ngan xep dua vao DX 5. PUSH – Cất 1 t ừ vào ng ăn x ếp Dạng l ệnh: PUSH Ngu ồn Mơ t ả: SP ←SP-2 Ngu ồn→{SP} Tốn h ạng đích cĩ th ể là các thanh ghi đa n ăng, thanh ghi đoạn(k ể c ả CS) ho ặc ơ nh ớ. Các c ờ b ị thay đổi: khơng. Ví d ụ: PUSH BX ;cat BX vao ngan xep tai vi tri do SP chi ra Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 37 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  38. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 2.3.2.2 Nhĩm các l ệnh tính tốn s ố h ọc 6. ADC – Add with Carry (c ộng cĩ nh ớ) Dạng l ệnh: ADC Đích, Ngu ồn Mơ t ả: Đích ← Đích + Ngu ồn + CF Cộng hai tốn h ạng Đích và Ngu ồn v ới c ờ CF k ết qu ả l ưu vào Đích. Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF. Ví d ụ: ADC AL, 74H ;AL ←AL+74+CF ADC CL, BL ;CL ←CL+BL+CF ADC DL, [SI] ;DL ←DL+(DS:SI)+CF 7. ADD – Cộng khơng nh ớ Dạng l ệnh : ADD Đích, Ngu ồn Mơ tả, Nguồn ← Đích + Ngu ồn Cộng hai tốn h ạng Đích và Ngu ồn, k ết qu ả l ưu vào Đích Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF. Ví d, ADD DX, CX ;DX ←DX+CX ADD AX, 400 ;AX ←AX+400 8. DEC – Decrement (gi ảm byte hay word đi m ột giá tr ị) Dạng l ệnh: DEC Đích DEC tr ừ tốn h ạng Đích đi 1. Tốn h ạng Đích cĩ th ể là byte hay word. Các c ờ b ị thay đổi: AF, OF, PF, SF, ZF. Ví d ụ: MOV BX, 1200H ;chuyen 1200H vao BX DEC BX ;BX=11FFH 9. DIV – Division (chia khơng d ấu) Dạng l ệnh: DIV Ngu ồn Tốn h ạng Ngu ồn là s ố chia. Tu ỳ theo độ dài tốn h ạng Ngu ồn ta cĩ hai tr ường h ợp b ố trí phép chia. - Nếu Nguồn là s ố 8 bit: AX/Ngu ồn, th ươ ng để vào AL, s ố d ư để vào AH - Nếu Ngu ồn là s ố 16 bit: DXAX/Ngu ồn, th ươ ng để vào AX, s ố d ư để vào DX Nếu th ươ ng khơng ph ải là s ố nguyên nĩ được làm trịn theo s ố nguyên sát dưới. N ếu Ngu ồn b ằng 0 ho ặc th ươ ng thu được l ớn h ơn FFH ho ặc FFFFH (tu ỳ theo độ dài c ủa tốn h ạng Ngu ồn) thì 8086 th ực hi ện l ệnh ng ắt INT 0. Các c ờ b ị thay đổi: khơng. Ví d ụ: 38 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  39. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 MOV AX, 0033H ;chuyen 0033H vao AX MOV BL, 25 DIV BL ;AL=02H va AH=01H 10. INC – Increment (t ăng tốn h ạng lên 1) Dạng l ệnh: INC đích Mơ t ả: Đích ← Đích + 1 Lệnh này t ăng đích lên 1, t ươ ng đươ ng v ới vi ệc (ADD đích, 1) nh ưng ch ạy nhanh h ơn. Các c ờ b ị thay đổi: AF, OF, PF, SF, ZF. Ví d ụ: INC AL INC BX 11. MUL – Multiply unsigned byte or word (nhân s ố khơng d ấu) Dạng l ệnh: MUL Ngu ồn Th ực hi ện phép nhân khơng d ấu v ới tốn h ạng Ngu ồn (ơ nh ớ ho ặc thanh ghi) v ới thanh ghi t ổng. - Nếu Ngu ồn là s ố 8 bit: AL*Ngu ồn. S ố b ị nhân ph ải là s ố 8 bit đặt trong AL, sau khi nhân tích l ưu vào AX - Nếu Ngu ồn là s ố 16 bit: AX*Ngu ồn. S ố b ị nhân ph ải là số 16 bit đặt trong AX, sau khi nhân tích l ưu vào DXAX. Nếu byte cao (ho ặc 16 bit cao) c ủa 16 (ho ặc 32) bit k ết qu ả ch ứa 0 thì CF=OF=0. Các c ờ b ị thay đổi: CF, OF. Ví d ụ: MUL CX ;AXxCX → DXAX MUL BL ;ALxBL → AX 12. NEG – Negation (l ấy bù hai c ủa m ột tốn h ạng, đảo d ấu c ủa m ột tốn h ạng). Dạng l ệnh: NEG Đích Mơ t ả: Đích ←0-Đích NEG l ấy 0 tr ừ cho đích (cĩ th ể là 1 byte ho ặc 1 t ừ) và tr ả l ại k ết qu ả cho tốn h ạng đích, n ếu ta l ấy bù hai c ủa -128 ho ặc -32768 ta s ẽ được k ết qu ả khơng đổi nh ưng OF=1 để báo là k ết qu ả b ị tràn vì s ố d ươ ng l ớn nh ất bi ểu di ễn được là +127 và +32767. Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF Ví d ụ: NEG AL ;AL ←0-(AL) 13. SUB – Substract (tr ừ hai tốn h ạng) Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 39 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  40. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Dạng l ệnh: SUB Đích, Ngu ồn Mơ t ả: Đích ←Đích - Ngu ồn Tốn h ạng đích vào Ngu ồn ph ải ch ứa cùng m ột lo ại d ữ li ệu và khơng được đồng th ời là hai ơ nh ớ, c ũng khơng được là thanh ghi đoạn. Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF. Ví d ụ: SUB AL, 78H ;AL ←AL-78H SUB BL, CL ;BL ←BL-CL SUB DL, [SI] ;DL ←DL-{DS:SI} 2.3.2.3 Nhĩm các l ệnh tính tốn logic 14. AND (phép và logic) Dạng l ệnh: AND Đích, Ngu ồn Mơ t ả: Đích ← Đích ^ Ngu ồn Th ực hi ện phép và logic hai tốn h ạng và l ưu k ết qu ả vào tốn h ạng đích. Ng ười ta th ường s ử d ụng để che đi/gi ữ l ại m ột vài bit nào đĩ c ủa m ột tốn h ạng bằng cách nhân logic tốn h ạng đĩ v ới tốn h ạng t ức thì cĩ các bit 0/1 ở các v ị trí c ần che đi/gi ữ l ại t ươ ng ứng. Các c ờ b ị thay đổi: CF, OF, PF, SF, ZF. Ví d ụ: AND DX, CX ;DX ←DX AND CX theo tung bit AND AL, 0FH ;che 4 bit cao cua AL 15. NOT – Logical Negation (ph ủ định logic) Dạng l ệnh: NOT Đích NOT đảo các giá tr ị c ủa các bit c ủa tốn h ạng đích. Các c ờ b ị thay đổi: khơng. Ví d ụ: MOV AL, 02H ;AL=(0000 0010)B NOT AL ;AL=(1111 1101)B 16. OR – Logic OR (phép ho ặc logic) Dạng l ệnh: OR Đích, Ngu ồn Mơ t ả: Đích = Đích ∨ Ngu ồn Tốn h ạng Đích và Ngu ồn ph ải ch ứa d ữ li ệu cùng độ dài và khơng được phép đồng th ời là hai ơ nh ớ và c ũng khơng được là thanh ghi đoạn. Phép OR th ường dùng để l ập m ột vài bit nào đĩ c ủa tốn h ạng b ằng cách c ộng logic tốn hạng đĩ v ới các tốn h ạng t ức th ời cĩ các bit 1 t ại v ị trí t ươ ng ứng c ần thi ết l ập. Các c ờ b ị thay đổi: CF, OF, PF, SF, ZF. 40 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  41. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Ví d ụ: OR AX, BX ;AX ←AX ∨BX theo tung bit OR CL, 30H ;lap bit b4 va b5 cua CL len 1 2.3.2.4 Nhĩm các l ệnh d ịch, quay tốn h ạng 17. RCL – Rotate though CF to the Left (quay trái thơng qua c ờ nh ớ) Dạng l ệnh: RCL Đích, CL Mơ t ả: CF MSB LSB Lệnh này để quay tốn h ạng sang trái thơng qua c ờ CF, CL ph ải được ch ứa s ẵn s ố l ần quay. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết RCL Đích, 1 Nếu s ố l ần quay là 9 thì tốn h ạng khơng đổi vì c ặp CF và tốn h ạng quay đúng m ột vịng (n ếu tốn h ạng đích là 8 bit). Sau l ệnh RCL c ờ CF mang giá tr ị c ũ c ủa MSB, cịn c ờ OF ←1 n ếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhiều l ần quay. Các c ờ b ị thay đổi: CF, OF, SF, ZF, PF. Ví d ụ: MOV CL, 3 ;so lan quay la 3 RCL AL, CL Tr ước khi th ực hi ện l ệnh: AL = 01011110, CF = 0. Sau khi th ực hi ện l ệnh: AL = 11110001, CF = 0. 18. RCR – Rotate though CF to the Right (quay ph ải thơng qua c ờ nh ớ) Dạng l ệnh: RCR Đích, CL Mơ t ả: CF MSB LSB Lệnh này để quay tốn h ạng sang ph ải thơng qua c ờ CF, CL ph ải được ch ứa s ẵn s ố l ần quay. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết RCR Đích, 1 Nếu s ố l ần quay là 9 thì tốn h ạng khơng đổi vì c ặp CF và tốn h ạng quay đúng m ột vịng (n ếu tốn h ạng đích là 8 bit). Sau l ệnh RCR c ờ CF mang giá tr ị c ũ c ủa LSB, cịn c ờ OF ←1 n ếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhi ều l ần quay. Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 41 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  42. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Các c ờ b ị thay đổi: CF, OF, SF, ZF, PF. Ví d ụ: MOV CL, 2 ;so lan quay la 2 RCR AL, CL Tr ước khi th ực hi ện l ệnh: AL = 11000010, CF = 1. Sau khi th ực hi ện l ệnh: AL = 01110000, CF = 1. 19. ROL – Rotate all bit to the Left (quay vịng sang trái). Dạng l ệnh: ROL Đích, CL. Mơ t ả: CF MSB LSB Lệnh này dùng để quay vịng tốn h ạng sang trái, MSB được đư a sang c ờ CF và LSB. CL ph ải ch ứa s ẵn s ố l ần quay mong mu ốn. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết ROL Đích, 1. N ếu s ố l ần quay là 8 (CL=8) thì tốn h ạng khơng đổi vì tốn h ạng quay đúng m ột vịng (n ếu tốn h ạng đích là 8 bit), cịn n ếu CL=4 thì 4 bit cao đổi ch ỗ cho 4 bit th ấp. Sau l ệnh ROL c ờ CF mang giá tr ị c ũ c ủa MSB, cịn c ờ OF ←1 n ếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhi ều l ần quay. L ệnh này th ường dùng để t ạo c ờ CF t ừ giá tr ị của MSB làm điều ki ện cho l ệnh nh ảy cĩ điều ki ện. Các c ờ b ị thay đổi: CF, OF, SF, ZF, PF. Ví d ụ: MOV CL, 2 ;so lan quay la 2 ROL AL, CL Tr ước khi th ực hi ện l ệnh: AL = 11001100, CF = 1 Sau khi th ực hi ện l ệnh: AL = 00110011, CF = 1 20. ROR – Rotate all bit to the Left (quay vịng sang ph ải). Dạng l ệnh: ROR Đích, CL Mơ t ả: MSB LSB CF Lệnh này dùng để quay vịng tốn h ạng sang ph ải, LSB được đư a sang c ờ CF và MSB. CL ph ải ch ứa s ẵn s ố l ần quay mong mu ốn. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết ROR Đích, 1. N ếu s ố l ần quay là 8 (CL=8) thì tốn h ạng khơng 42 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  43. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 đổi vì tốn h ạng quay đúng m ột vịng (n ếu tốn h ạng đích là 8 bit), cịn n ếu CL=4 thì 4 bit cao đổi ch ỗ cho 4 bit th ấp. Sau l ệnh ROR c ờ CF mang giá tr ị c ũ c ủa LSB, cịn c ờ OF ←1 n ếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhi ều l ần quay. Lệnh này th ường dùng để t ạo c ờ CF t ừ giá tr ị c ủa LSB làm điều ki ện cho l ệnh nh ảy cĩ điều ki ện. Các c ờ b ị thay đổi: CF, OF, SF, ZF, PF. Ví d ụ: MOV CL, 2 ;so lan quay la 2 ROR AL, CL Tr ước khi th ực hi ện l ệnh: AL = 11001100, CF = 0 Sau khi th ực hi ện l ệnh: AL = 00110011, CF = 0 21. SAL/SHL - Shift Arithmetically Left (d ịch trái s ố h ọc)/Shift Logically Left (d ịch trái logic). Dạng l ệnh: SAL Đích, CL SHL Đích, CL Mơ t ả: CF MSB LSB 0 Hai l ệnh này cĩ tác d ụng d ịch trái s ố h ọc tốn h ạng (cịn g ọi là d ịch trái logic). M ỗi l ần d ịch MSB được đư a vào CF cịn 0 được đư a vào LSB. CL ph ải ch ứa s ẵn s ố l ần quay mong mu ốn. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết SAL Đích, 1 Sau l ệnh SAL ho ặc SHL c ờ CF mang giá tr ị c ũ c ủa MSB, cịn c ờ OF ←1 nếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhi ều l ần quay. L ệnh này th ường dùng để t ạo c ờ CF t ừ giá tr ị c ủa MSB làm điều ki ện cho l ệnh nh ảy cĩ điều ki ện. Các c ờ b ị thay đổi: SF, ZF, CF, OF, PF. Ví d ụ: MOV CL, 2 ;so lan quay la 2 SAL AL, CL Tr ước khi th ực hi ện l ệnh: AL = 11001100, CF = 0 Sau khi th ực hi ện l ệnh: AL = 00110000, CF = 1 22. SHR – Shift logically Right (d ịch ph ải logic) Dạng l ệnh: SHR Đích, CL Mơ t ả: Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 43 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  44. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 0 MSB LSB CF Lệnh này cĩ tác d ụng d ịch ph ải logic tốn h ạng. M ỗi l ần d ịch LSB được đư a vào CF cịn 0 được đư a vào MSB. CL ph ải ch ứa s ẵn s ố l ần quay mong mu ốn. Trong tr ường h ợp quay 1 l ần cĩ th ể vi ết SHR Đích, 1 Sau l ệnh SHR c ờ CF mang giá tr ị c ũ c ủa LSB, cịn c ờ OF ←1 n ếu sau khi quay 1 l ần mà bit MSB b ị thay đổi so v ới tr ước khi quay, c ờ OF s ẽ khơng được xác định sau nhi ều l ần quay. L ệnh này th ường dùng để t ạo c ờ CF t ừ giá tr ị c ủa LSB làm điều ki ện cho l ệnh nh ảy cĩ điều ki ện. Các c ờ b ị thay đổi: SF, ZF, CF, OF, PF. Ví d ụ: MOV CL, 2 ;so lan quay la 2 SHR AL, CL Tr ước khi th ực hi ện l ệnh: AL = 11001100, CF = 1 Sau khi th ực hi ện l ệnh: AL = 00110011, CF = 0 23. XOR – Exclusive OR (l ệnh logic XOR (ho ặc đảo)). Dạng l ệnh: XOR Đích, Ngu ồn Mơ t ả: Đích ←Đích ⊕Ngu ồn. Lệnh XOR th ực hi ện logic XOR (ho ặc đảo) gi ữa hai tốn h ạng và k ết quả được l ưu vào trong đích, m ột bit k ết qu ả được đặt b ằng 1 n ếu n ếu các bit t ươ ng ứng hai tốn h ạng là đối nhau. N ếu tốn h ạng đích trùng tốn h ạng Ngu ồn thì k ết qu ả bằng 0, do đĩ l ệnh này cịn được dùng để xố thanh ghi v ề 0 kèm theo các c ờ CF và OF c ũng b ị xố. Các c ờ b ị thay đổi: CF, OF, PF, SF, ZF. Ví d ụ: XOR AX, AX XOR BX, BX MOV AX, 5857H MOV BX, 58A8H XOR AX, BX Tr ước khi th ực hi ện l ệnh XOR Sau khi th ực hi ện l ệnh XOR AX=5857H AX=00FFH BX=58A8H BX=58A8H 2.3.2.5 Nhĩm các l ệnh so sánh 24. CMP – Compare (so sánh) Dạng l ệnh: CMP đích, Ngu ồn 44 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  45. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 CMP tr ừ tốn h ạng đích cho tốn h ạng Ngu ồn, chúng cĩ th ể là các byte ho ặc các t ừ, nh ưng khơng l ưu tr ữ k ết qu ả. Các tốn h ạng khơng b ị thay đổi. K ết qu ả c ủa lệnh này dùng để c ập nh ật các c ờ và cĩ th ể được dùng để làm điều ki ện cho các l ệnh nh ảy cĩ điều ki ện ti ếp theo. Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF. Các c ờ chính theo quan h ệ đích và Ngu ồn khi so sánh hai s ố khơng d ấu. So sánh CF ZF Đích = Ngu ồn 0 1 Đích > Ngu ồn 0 0 Đích < Ngu ồn 1 0 2.3.2.6 Nhĩm các l ệnh nh ảy (r ẽ nhánh) 25. JA/JNBE – Jump if Above/Jump if Not Below or Equal (nh ảy n ếu cao hơn/nh ảy n ếu khơng th ấp h ơn ho ặc b ằng). Dạng l ệnh: JA NHAN JNBE NHAN Mơ t ả: IP ←IP+d ịch chuy ển Hai l ệnh trên bi ểu di ễn cùng m ột thao tác nh ảy cĩ điều ki ện t ới NHAN nếu CF + ZF = 0. Quan h ệ cao h ơn/th ấp là quan h ệ dành cho vi ệc so sánh (do lệnh CMP th ực hi ện) độ l ớn hai s ố khơng d ấu. NHAN ph ải n ằm cách xa m ột kho ảng -128 +127 byte so v ới l ệnh ti ếp theo sau l ệnh JA/JNBE. Ch ươ ng trình sẽ c ăn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Các c ờ b ị thay đổi: khơng. Ví d ụ: CMP AX, 12ABH ;so sanh AX voi 12ABH JA THOI ;nhay den THOI neu AX cao hon 12ABH 26. JAE/JNB/JNC – Jump if Above or Equal/Jump if Not Below/Jump if No Carry (nh ảy n ếu l ớn h ơn ho ặc b ằng/nh ảy n ếu khơng th ấp h ơn/nh ảy n ếu khơng cĩ nh ớ). Dạng l ệnh: JAE NHAN JNB NHAN JNC NHAN Mơ t ả: IP ←IP+d ịch chuy ển Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 45 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  46. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Ba l ệnh trên bi ểu di ễn cùng m ột thao tác nh ảy cĩ điều ki ện t ới NHAN nếu CF = 0. Quan h ệ cao h ơn/th ấp là quan h ệ dành cho vi ệc so sánh (do l ệnh CMP th ực hi ện) độ l ớn hai s ố khơng d ấu. NHAN ph ải n ằm cách xa m ột kho ảng -128 +127 byte so v ới l ệnh ti ếp theo sau l ệnh JAE/JNB/JNC. Ch ươ ng trình s ẽ căn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Các c ờ b ị thay đổi: khơng. Ví d ụ: CMP AL, 10H ;so sanh AL voi 10H JAE THOI ;nhay den THOI neu AL cao hon hoac bang 10H 27. JB/JC/JNAE – Jump if Below/Jump if Carry/Jump if Not Above or Equal (nh ảy n ếu th ấp h ơn/nh ảy n ếu cĩ nh ớ/nh ảy n ếu khơng cao h ơn ho ặc b ằng). Dạng l ệnh: JB NHAN JC NHAN JNAE NHAN Mơ t ả: IP ←IP+d ịch chuy ển Ba l ệnh trên bi ểu di ễn cùng m ột thao tác nh ảy cĩ điều ki ện t ới NHAN n ếu CF = 1. Quan h ệ cao h ơn/th ấp là quan h ệ dành cho vi ệc so sánh (do l ệnh CMP th ực hi ện) độ l ớn hai s ố khơng d ấu. NHAN ph ải n ằm cách xa m ột khoảng -128 +127 byte so v ới l ệnh ti ếp theo sau l ệnh JB/JC/JNAE. Ch ươ ng trình s ẽ c ăn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Các c ờ b ị thay đổi: khơng. Ví d ụ: CMP AL, 10H ;so sanh AL voi 10H JB THOI ;nhay den THOI neu AL thap hon 10H 28. JBE/JNA – Jump if Below or Equal/Jump if Not Above (nh ảy n ếu th ấp h ơn ho ặc b ằng/nh ảy n ếu khơng cao h ơn). Dạng l ệnh: JBE NHAN JNA NHAN Mơ t ả: IP ←IP+d ịch chuy ển Hai l ệnh trên bi ểu di ễn cùng m ột thao tác nh ảy cĩ điều ki ện t ới NHAN n ếu CF +ZF = 1. Quan h ệ cao h ơn/th ấp là quan h ệ dành cho vi ệc so sánh (do lệnh CMP th ực hi ện) độ l ớn hai s ố khơng d ấu. NHAN ph ải n ằm cách xa m ột kho ảng -128 +127 byte so v ới l ệnh ti ếp theo sau l ệnh JBE/JNA. Ch ươ ng trình s ẽ căn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuyển. Các c ờ b ị thay đổi: khơng. Ví d ụ: 46 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  47. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 CMP AL, 10H ;so sanh AL voi 10H JBE THOI ;nhay den THOI neu AL thap hon hoac ;bang 10H 29. JE/JZ – Jump if Equal/Jump if Zero (nh ảy n ếu b ằng nhau/nh ảy n ếu k ết qu ả bằng khơng) Dạng l ệnh: JE NHAN JZ NHAN Mơ tả: IP ←IP+d ịch chuy ển Lệnh trên bi ểu di ễn thao tác nh ảy cĩ điều ki ện t ới NHAN n ếu ZF = 1. NHAN ph ải n ằm cách xa m ột kho ảng -128 +127 byte so v ới l ệnh ti ếp theo sau lệnh JE/JZ. Ch ươ ng trình s ẽ c ăn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Các c ờ b ị thay đổi: khơng. Ví d ụ: SUB AL, 10H ;tru AL cho 10H JE THOI ;nhay den THOI neu AL bang 10H 30. JMP – Unconditional Jump (l ệnh nh ảy khơng điều ki ện). JMP trao quy ền điều khi ển cho vùng m ục tiêu m ột cách khơng điều ki ện. Lệnh này cĩ các ch ế độ gi ống nh ư l ệnh CALL và nĩ c ũng phân bi ệt nh ảy g ần, nh ảy xa. Dạng l ệnh: Sau đây là nh ững cách vi ết l ệnh khơng điều ki ện. JMP NHAN Lệnh m ới này b ắt đầu địa ch ỉ ứng v ới NHAN. Ch ươ ng trình s ẽ c ăn c ứ vào kho ảng d ịch gi ữa NHAN và l ệnh nh ảy để xác định xem nĩ là: + Nh ảy ng ắn: Trong tr ường h ợp này NHAN ph ải n ằm cách xa (d ịch đi một kho ảng). -128 127 byte so v ới l ệnh ti ếp theo sau l ệnh JMP. Ch ươ ng trình d ịch s ẽ căn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Do đĩ IP ←IP+d ịch chuy ển Đây là l ệnh nh ảy tr ực ti ếp vì d ịch chuy ển để tr ực ti ếp trong mã l ệnh. Để định h ướng cho ch ươ ng trình d ịch làm vi ệc nên vi ết l ệnh d ưới d ạng: JMP SHORT NHAN + Nh ảy g ần: Trong tr ường h ợp này NHAN ph ải n ằm cách xa (d ịch đi m ột kho ảng) -32768 +32767 byte so v ới l ệnh ti ếp theo sau l ệnh JMP. Ch ươ ng trình dịch s ẽ c ăn c ứ vào v ị trí NHAN để xác định giá tr ị d ịch chuy ển. Do đĩ Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 47 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  48. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 IP ←IP+d ịch chuy ển Đây là l ệnh nh ảy tr ực ti ếp vì d ịch chuy ển để tr ực ti ếp trong mã l ệnh. Để định h ướng cho ch ươ ng trình d ịch làm vi ệc nên vi ết l ệnh d ưới d ạng: JMP NEAR NHAN + Nh ảy xa: Trong tr ường h ợp này NHAN n ằm ở đoạn mã khác so v ới lệnh ti ếp theo sau l ệnh JMP. Ch ươ ng trình s ẽ c ăn c ứ vào v ị trí NHAN để xác định giá tr ị địa ch ỉ nh ảy đến (CS:IP c ủa NHAN). Sau đĩ: IP ←IP c ủa NHAN CS ←CS c ủa NHAN JMP BX Đây là l ệnh nh ảy g ần, tr ước đĩ BX ph ải ch ứa địa ch ỉ l ệch c ủa l ệnh định nh ảy đến trong đoạn CS. Khi th ực hi ện l ệnh này thì IP ←BX. Đây là l ệnh nh ảy gián ti ếp vì địa ch ỉ l ệch n ằm trong thanh ghi. Để định h ướng cho ch ươ ng trình dịch làm vi ệc ta nên vi ết l ệnh d ưới d ạng: JMP NEAR PTR BX JMP [BX] Đây là l ệnh nh ảy g ần. IP m ới được l ấy t ừ n ội dung 2 ơ nh ớ do BX và BX+1 ch ỉ ra trong đoạn DS (SI, DI cĩ th ể dùng thay ch ỗ c ủa BX). Đây là l ệnh nh ảy gián ti ếp vì địa ch ỉ l ệch để trong ơ nh ớ. Để định h ướng cho ch ươ ng trình dịch làm vi ệc ta nên vi ết l ệnh d ưới d ạng: JMP WORD PTR [BX] Một bi ến d ạng khác c ủa l ệnh trên thu được khi ta vi ết l ệnh d ưới d ạng: JMP DWORD PTR [BX] Đây là l ệnh nh ảy xa. Địa ch ỉ nh ảy đến ứng v ới CS:IP. Giá tr ị gán cho IP và CS được ch ứa trong 4 ơ nh ớ do BX và BX+1 (cho IP), BX+2 và BX+3 cho (CS) ch ỉ ra trong đoạn DS (SI, DI cĩ th ể s ử d ụng thay ch ỗ c ủa BX) Đây c ũng là l ệnh nh ảy gián ti ếp vì địa ch ỉ l ệch và địa ch ỉ c ơ s ở n ằm trong ơ nh ớ. Các c ờ b ị thay đổi: khơng. 31. JNE/JNZ – Jump if Not Equal/Jump if Not Zero (nh ảy n ếu khơng b ằng nhau/nh ảy n ếu k ết qu ả khơng r ỗng). Dạng l ệnh: JNE NHAN JNZ NHAN Mơ t ả: IP ←IP+d ịch chuy ển Hai l ệnh trên bi ểu di ễn cùng m ột thao tác nh ảy cĩ điều ki ện t ới NHAN n ếu ZF = 0. NHãN ph ải n ằm cách xa (d ịch đi m ột kho ảng) -128 127 byte so v ới l ệnh 48 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  49. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 ti ếp theo sau l ệnh JNE/JNZ. Ch ươ ng trình d ịch s ẽ c ăn c ứ vào v ị trí NHAN để xác định độ d ịch chuy ển. Các c ờ b ị thay đổi: khơng. Ví d ụ: CMP AL, 10H ;so sanh AL voi 10H JNE THOI ;nhay den THOI neu AL khac 10H 2.3.2.7 Nhĩm các l ệnh l ặp 32. LOOP – Loop if CX is not 0 (l ặp n ếu CX ≠ 0) Dạng l ệnh: LOOP NHAN Mơ t ả: L ệnh này dùng để l ặp l ại đoạn ch ươ ng trình (g ồm các l ệnh n ằm trong kho ảng t ừ NHAN đến h ết l ệnh LOOP NHAN) cho đến khi s ố l ần l ặp CX=0. Điều này cĩ ngh ĩa là tr ước khi vào vịng l ặp ta ph ải đư a s ố l ần l ặp mong mu ốn vào CX, và sau m ỗi l ần l ặp thì CX t ự động gi ảm đi 1. NHAN ph ải n ằm cách xa (d ịch đi m ột kho ảng) t ối đa -128 byte so v ới l ệnh ti ếp theo sau l ệnh LOOP. Các c ờ b ị thay đổi: khơng. Ví d ụ: MOV AL, 0 ;xoa AL MOV CX, 10 ;nap so lan lap vao CX LAP: INC AL ;tang AL len 1 LOOP LAP ;lap lai 10 lan, AL=10 33. LOOPE/LOOPZ – Loop while CX=0 or ZF=0 (l ặp l ại đoạn ch ươ ng trình cho đến khi CX=0 ho ặc ZF=0). Dạng l ệnh: LOOPE NHAN LOOPZ NHAN Mơ t ả: L ệnh này dùng để l ặp l ại đoạn ch ươ ng trình (g ồm các l ệnh n ằm trong kho ảng t ừ NHAN đến h ết l ệnh LOOPE NHAN ho ặc LOOPZ NHAN) cho đến khi số l ần l ặp CX=0 ho ặc c ờ ZF=0. Điều này cĩ ngh ĩa là tr ước khi vào vịng l ặp ta ph ải đư a s ố l ần l ặp mong mu ốn vào CX, và sau m ỗi l ần l ặp thì CX t ự động gi ảm đi 1. NHAN ph ải n ằm cách xa (d ịch đi m ột kho ảng) t ối đa -128 byte so v ới lệnh ti ếp theo sau l ệnh LOOPE/LOOPZ. Các c ờ b ị thay đổi: khơng. Ví d ụ: MOV AL, AH ;AL=AH MOV CX, 50 ;nap so lan lap vao CX LAP: INC AL ;tang AL COMP AL, 16 ;so sanh AL voi 16 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 49 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  50. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 LOOPE LAP ;lap lai cho den khi AL ≠16 hoac CX=0 34. LOOPNE/LOOPNZ – Loop while CX=0 or ZF=1 (l ặp l ại đoạn ch ươ ng trình cho đến khi CX=0 ho ặc ZF=1). Dạng l ệnh: LOOPNE NHAN LOOPNZ NHAN Mơ t ả: L ệnh này dùng để l ặp l ại đoạn ch ươ ng trình (g ồm các l ệnh nằm trong kho ảng t ừ NHAN đến h ết l ệnh LOOPNE NHAN ho ặc LOOPNZ NHAN) cho đến khi s ố l ần l ặp CX=0 ho ặc c ờ ZF=1. Điều này cĩ ngh ĩa là tr ước khi vào vịng l ặp ta ph ải đư a s ố l ần l ặp mong mu ốn vào CX, và sau mỗi l ần l ặp thì CX t ự động gi ảm đi 1. NHAN ph ải n ằm cách xa (d ịch đi m ột kho ảng) t ối đa -128 byte so v ới lệnh ti ếp theo sau l ệnh LOOPNE/LOOPNZ. Các c ờ b ị thay đổi: khơng. Ví d ụ: MOV AL, AH ;AL=AH MOV CX, 50 ;nap so lan lap vao CX LAP: INC AL ;tang AL COMP AL, 16 ;so sanh AL voi 16 LOOPNE LAP ;lap lai cho den khi AL=16 hoac CX=0 2.3.2.8 Nhĩm các l ệnh điều khi ển, đặc bi ệt khác 35. CALL – Call a procedure (g ọi ch ươ ng trình con) Dạng l ệnh: CALL Th ủ_t ục Mơ t ả: L ệnh này dùng để chuy ển ho ạt động c ủa vi x ử lý t ừ ch ươ ng trình chính (CTC) sang ch ươ ng trình con (ctc). N ếu ctc n ằm trong cùng m ột đoạn mã v ới CTC ta cĩ g ọi g ần (near call). N ếu ctc và CTC n ằm ở hai đoạn mã khác nhau ta cĩ gọi xa (far call). - Nếu g ọi g ần: L ưu vào Stack giá tr ị IP c ủa địa ch ỉ tr ở v ề (vì CS khơng đổi) và các thao tác khi g ọi ctc di ễn ra nh ư sau: + Nội dung thanh ghi SP gi ảm đi 2 byte, SP ←SP – 2. + Nội dung thanh ghi IP được c ất vào ng ăn x ếp (l ưu địa ch ỉ tr ở v ề) {SP} ←IP. + Địa ch ỉ l ệch c ủa ctc (lên t ới ±32K) được l ưu vào thanh ghi IP. + Khi g ặp l ệnh RET ở cu ối ctc thì VXL l ấy l ại địa ch ỉ tr ở v ề IP t ừ Stack và t ăng SP lên 2 byte. - Nếu g ọi xa: L ưu vào Stack giá tr ị IP và CS c ủa địa ch ỉ tr ở v ề và các thao tác khi gọi ctc di ễn ra nh ư sau: 50 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  51. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 + Nội dung thanh ghi SP gi ảm đi 2 byte, SP ←SP – 2 và CS được lưu vào ng ăn x ếp. + Nội dung c ủa CS được thay b ằng địa ch ỉ đoạn c ủa ctc được g ọi. + Nội dung thanh ghi SP l ại gi ảm đi 2 byte và IP được c ất vào ng ăn xếp. + Địa ch ỉ l ệch c ủa ctc được l ưu vào thanh ghi IP. + Khi g ặp l ệnh RET ở cu ối ctc thì VXL l ấy l ại địa ch ỉ tr ở v ề IP t ừ Stack và t ăng SP lên 2 byte sau đĩ ti ếp t ục l ấy l ại CS và t ăng SP lên 2 byte. Các c ờ b ị thay đổi: AF, CF, OF, PF, SF, ZF. Ví d ụ: CALL NEAR CALL FAR 36. INT – Interrupt (l ệnh g ọi ng ắt) Dạng l ệnh: INT N (N=0 FFH) Các thao tác c ủa 8086 khi ch ạy l ệnh: INT N - Tạo địa ch ỉ m ới c ủa Stack, c ất thanh ghi c ờ vào Stack: SP ←SP-2, {FR} →SP. - Cấm các ng ắt khác tác động vào vi x ử lý, cho vi x ử lý ch ạy ở ch ế độ t ừng l ệnh: IF ←0, TF ←0. - Tạo địa ch ỉ m ới c ủa Stack, c ất địa ch ỉ đoạn c ủa địa ch ỉ tr ở v ề vào Stack: SP ←SP-2, SP ←CS. - Tạo địa ch ỉ m ới c ủa Stack, c ất địa ch ỉ l ệch c ủa địa ch ỉ tr ở v ề vào Stack: SP ←SP- 2, SP ←IP. - Vi x ử lý l ấy l ệnh t ại địa ch ỉ m ới, địa ch ỉ con tr ỏ ng ắt được tính tốn nh ư sau: {Nx4} →IP, {Nx4+2} →CS Ví d ụ: với N = 8 thì CS ←{0022H} và IP ←{0020H} 37. IRET – Interrupt Return (tr ở v ề CTC t ừ ctc ph ục v ụ ng ắt) Dạng l ệnh: IRET Tr ở v ề ch ươ ng trình chính t ừ ch ươ ng trình con ph ục v ụ ng ắt. Tr ả l ại quy ền điều khi ển cho ch ươ ng trình t ại v ị trí x ảy ra ng ắt b ằng cách l ấy l ại các giá tr ị thanh ghi IP, CS và các c ờ t ừ vùng Stack. - {SP} →IP, SP ←SP+2 - {SP} →CS, SP ←SP+2 - {SP} →FR, SP ←SP+2 Các c ờ b ị thay đổi: t ất c ả các c ờ ( được ph ục h ồi nh ư tr ước khi di ễn ra ng ắt). Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 51 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  52. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 38. NOP – No Operation (CPU khơng làm gì) Dạng l ệnh: NOP Lệnh này khơng th ực hi ện m ột cơng vi ệc gì ngồi vi ệc làm t ăng n ội dung c ủa IP và tiêu t ốn 3 chu k ỳ đồng h ồ. Nĩ th ường được dùng để tính th ời gian tr ễ trong các vịng tr ễ ho ặc để chi ếm ch ỗ các l ệnh c ần thêm vào ch ươ ng trình sau này mà khơng làm ảnh h ưởng d ến độ dài ch ươ ng trình. Các c ờ b ị thay đổi: khơng. 39. RET – Return from Procedure to Calling Program (tr ở v ề ch ươ ng trình chính t ừ ch ươ ng trình con). Dạng l ệnh: RET ho ặc RET N (N là s ố nguyên d ươ ng) Mơ t ả: RET được đặt cu ối ctc để vi x ử lý l ấy l ại địa ch ỉ tr ở v ề, mà nĩ đã được t ự động c ất t ại ng ăn x ếp khi cĩ l ệnh g ọi ctc. Đặc bi ệt n ếu dùng l ệnh RET n thì sau khi đã l ấy l ại được địa ch ỉ tr ở v ề (ch ỉ cĩ IP ho ặc c ả IP và CS) thì SP ←SP+n (dùng để nh ảy qua mà khơng l ấy l ại các thơng s ố khác c ủa ch ươ ng trình cịn l ại trong ng ăn x ếp. Các c ờ b ị thay đổi: khơng. 40. STC – Set the Carry Flag (l ập c ờ nh ớ) Dạng l ệnh: STC Mơ t ả: CF ←1 STC thi ết l ập c ờ nh ớ b ằng 1 và khơng ảnh h ưởng đến các c ờ khác. Các c ờ b ị thay đổi: CF=1. 2.4 Lập trình h ợp ng ữ (Assembly) cho vi x ử lý 80x86 [12] 2.4.1 Gi ới thi ệu chung v ề h ợp ng ữ Hợp ng ữ (assembly language) là m ột ngơn ng ữ cấp th ấp dùng để vi ết các ch ươ ng trình máy tính. Ngơn ng ữ lập trình Assembly s ử dụng các câu l ệnh, t ừ khĩa dễ nh ớ, g ần g ũi v ới ng ười l ập trình để thay th ế các ngơn ng ữ máy. M ột ch ươ ng trình vi ết b ằng h ợp ng ữ sẽ được d ịch sang ngơn ng ữ máy b ằng m ột ti ện ích g ọi là trình hợp d ịch. L ưu ý r ằng, trình h ợp d ịch khác hồn tồn v ới trình biên d ịch, v ốn dùng để biên d ịch các ngơn ng ữ cấp cao sang các ch ỉ th ị lệnh cấp th ấp mà sau đĩ s ẽ được trình h ợp d ịch chuy ển đổi sang ngơn ng ữ máy. Các ch ươ ng trình h ợp ng ữ th ường ph ụ thu ộc ch ặt ch ẽ vào m ột ki ến trúc máy tính xác định, nĩ khác v ới ngơn ng ữ cấp cao th ường độc l ập đối v ới các n ền t ảng ki ến trúc ph ần c ứng. Nhi ều trình h ợp d ịch ph ức t ạp ngồi các tính n ăng c ơ b ản cịn cung c ấp thêm các c ơ ch ế giúp cho vi ệc vi ết ch ươ ng trình, ki ểm sốt quá trình d ịch c ũng nh ư vi ệc gỡ rối được d ễ dàng h ơn. Hợp ng ữ đã t ừng được dùng r ộng rãi trong t ất c ả các khía c ạnh l ập trình, nh ưng ngày nay nĩ cĩ xu h ướng ch ỉ được dùng trong m ột s ố lãnh v ực h ẹp, ch ủ yếu để giao 52 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  53. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 ti ếp tr ực ti ếp v ới ph ần c ứng ho ặc x ử lý các v ấn đề liên quan đến t ốc độ cao điển hình nh ư các trình điều khi ển thi ết b ị, các hệ th ống nhúng cấp th ấp và các ứng d ụng th ời gian th ực 2.4.2 Các b ước khi l ập trình  Lập trình trên ph ần m ềm emu8086 - Bước 1: M ở ch ươ ng trình emu8086, ch ọn file \ new V ới các l ựa ch ọn: New com template, new exe template, new bin template, new boot template. - Bước 2: Vi ết mã ngu ồn - Bước 3: d ịch và g ỡ r ối (b ấm F5) - Bước 4: t ạo file t ự ch ạy: assembler \ Compile  Dịch, liên k ết, ch ạy và ch ẩn l ỗi ch ươ ng trình t ừ dấu nh ắc DOS: Cần cĩ các file: tasm.exe (d ịch), tlink.exe (liên k ết), td.exe (ch ẩn l ỗi). Các b ước nh ư sau:  B1. Thi ết l ập đường d ẫn path = %path%;  B2. Biên d ịch t ừ file .ASM sang file .OBJ Tasm .ASM  B3. Biên d ịch t ừ file .OBJ sang file .EXE Tlink .OBJ  B4: ch ạy ch ươ ng trình: .EXE  B5: ch ẩn l ỗi (n ếu c ần thi ết) Td .EXE Để t ự động hĩa, ta cĩ th ể t ạo file .BAT ch ứa các l ệnh trên. Ví d ụ: Tạo file RunASM.bat trong cùng th ư m ục v ới t ập tin .ASM v ới n ội dung nh ư sau : tasm %1 tlink %1 %1 (%1 là l ấy tham s ố th ứ nh ất trong command line) Sau đĩ để biên d ịch, liên k ết và th ực thi ch ươ ng trình hello.ASM ta ch ỉ c ần gõ : RunASM hello Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 53 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  54. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Ch ươ ng trình emu8086: Ch ươ ng trình emu8086 là ch ươ ng trình l ập trình mơ ph ỏng cho 8086 (t ươ ng thích Intel và AMD) bao g ồm b ộ dịch ASM và giáo trình (ti ếng anh) cho ng ười m ới bắt đầu. Ch ươ ng trình cĩ th ể ch ạy h ết ho ặc ch ạy t ừng b ước, ta cĩ th ể nhìn th ấy các thanh ghi, b ộ nh ớ, stack, bi ến, Hình 2-5. Emu8086 - Mơi tr ường so ạn th ảo Hình 2-6. Emu8086 - Giá tr ị các c ờ và màn hình hi ển th ị 54 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  55. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Hình 2-7. Emu8086 - Màn hình Debug ch ươ ng trình 2.4.3 Cấu trúc chung c ủa ch ươ ng trình h ợp ng ữ 2.4.3.1 Cấu trúc c ủa m ột l ệnh h ợp ng ữ Một dịng l ệnh trong ch ươ ng trình h ợp ng ữ g ồm cĩ các tr ường sau: Tên Lệnh Tốn h ạng Chú thích A: Mov AH, 10h ; Đư a giá tr ị 10h vào thanh ghi AH Tr ường “tên” ch ứa nhãn, tên bi ến hay tên th ủ t ục. Các tên nhãn cĩ th ể ch ứa tối đa 31 ký t ự, khơng ch ứa ký t ự tr ắng (space) và khơng được b ắt đầu b ằng s ố. Các nhãn được k ết thúc b ằng d ấu ':'. Tr ường “lệnh” ch ứa các l ệnh s ẽ th ực hi ện. Các l ệnh này cĩ th ể là các l ệnh th ật (MOV) hay các l ệnh gi ả (PROC). Các l ệnh th ật s ẽ được d ịch ra mã máy. Tr ường “tốn h ạng” ch ứa các tốn h ạng c ần thi ết cho l ệnh (AH,10h). Tr ường “chú thích” ph ải được b ắt đầu b ằng d ấu ';'. Tr ường này ch ỉ dùng cho ng ười l ập trình để ghi các l ời gi ải thích cho ch ươ ng trình. Ch ươ ng trình d ịch s ẽ b ỏ qua các tất c ả nh ững gì nằm phía sau d ấu ; 2.4.3.2 Cấu trúc ch ươ ng trình h ợp ng ữ Cấu trúc thơng th ường c ủa m ột ch ươ ng trình h ợp ng ữ d ạng file *.exe nh ư sau: TITLE Tên ch ươ ng trình .MODEL Ki u kích th ưc b nh ; Khai báo quy mơ s d ng b nh .STACK Kích th ưc ; Khai báo dung l ưng đon stack Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 55 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  56. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 .DATA ; Khai báo đon d li u msg DB 'Hello$' .CODE ; Khai báo đon mã main PROC CALL Subname ; G i ch ươ ng trình con main ENDP Subname PROC ; Đnh ngh ĩa ch ươ ng trình con RET Subname ENDP END main • MODEL - Quy mơ s ử d ụng b ộ nh ớ: Tham s ố c ủa th ẻ model là 1 trong các giá tr ị cho ở b ảng d ưới, khai báo này khai báo kích th ước t ối đa c ủa ch ươ ng trình và các th ức t ổ ch ức b ộ nh ớ trong ch ươ ng trình. Thơng th ường, các ứng d ụng đơ n gi ản ch ỉ địi h ỏi mã ch ươ ng trình khơng quá 64 KB và d ữ li ệu c ũng khơng l ớn h ơn 64 KB nên ta s ử d ụng ở d ạng Small. VD .MODEL SMALL • STACK - Khai báo kích thước stack: Khai báo stack dùng để dành ra m ột vùng nh ớ làm stack (ch ủ y ếu ph ục v ụ cho ch ươ ng trình con), thơng th ường ta ch ọn kho ảng 256 byte là đủ để s ử d ụng (n ếu khơng khai báo thì ch ươ ng trình d ịch t ự động cho kích th ước stack là 1 KB): VD .STACK 256 • DATA - Khai báo đoạn d ữ li ệu: Đoạn d ữ li ệu dùng để ch ứa các bi ến và h ằng s ử d ụng trong ch ươ ng trình. • CODE - Khai báo đoạn mã: Đoạn mã ch ứa các mã l ệnh c ủa ch ươ ng trình. Đoạn mã b ắt đầu b ằng m ột ch ươ ng trình chính và cĩ th ể cĩ các l ệnh g ọi ch ươ ng trình con (CALL). Một ch ươ ng trình chính hay ch ươ ng trình con b ắt đầu b ằng l ệnh PROC và k ết thúc b ằng l ệnh ENDP ( đây là các l ệnh gi ả c ủa ch ươ ng trình d ịch). Trong ch ươ ng trình con, ta s ử d ụng thêm l ệnh RET để tr ả v ề địa ch ỉ l ệnh tr ước khi g ọi ch ươ ng trình con. 56 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  57. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Ch ươ ng trình được k ết thúc b ằng l ệnh END trong đĩ tên ch ươ ng trình phía sau lệnh END s ẽ xác định đĩ là ch ươ ng trình chính. N ếu sau l ệnh END khơng ch ỉ ra ch ươ ng trình nào c ả thì s ẽ l ấy ch ươ ng trình con ở đầu đoạn mã làm ch ươ ng trình chính. Ví d ụ: Ch ươ ng trình sau in ra màn hình dịng ch ữ “Hello !” .model small .stack 100h .data s DB “Hello !$” ; khai báo xâu kí t c n in .code mov AX,@data ; l y đa ch data segment ghi vào DS mov DS,AX ; Vì model small, đây c ũng là đa ch ; segment c a xâu s. ; xu t chu i: mov DX, OFFSET s ; l y đa ch offset ghi vào DX mov AH , 9 int 21h ; g i hàm 9, ng t 21h đ in mov AH, 4Ch ; Thốt kh i ch ươ ng trình int 21h end Lưu ý: - Mọi ch ươ ng trình đều ph ải cĩ đoạn CODE thốt kh ỏi ch ươ ng trình, n ếu khơng ch ươ ng trình s ẽ khơng d ừng khi h ết ch ươ ng trình c ủa mình. 2.4.3.3 Khung ch ươ ng trình d ịch ra .exe Các t ập tin .EXE và .COM DOS ch ỉ cĩ th ể thi hành được các t ập tin d ạng .COM và .EXE. T ập tin .COM th ường dùng để xây d ựng cho các ch ươ ng trình nh ỏ cịn .EXE dùng cho các ch ươ ng trình l ớn. Tập tin .EXE - Nằm trong nhi ều đoạn khác nhau, kích th ước thơng th ường l ớn h ơn 64 KB. - Cĩ th ể g ọi được các ch ươ ng trình con d ạng near hay far. - Tập tin .EXE ch ứa m ột header ở đầu t ập tin để ch ứa các thơng tin điều khi ển cho tập tin. data segment ; add your data here! pkey db "press any key to exit $" ends stack segment dw 128 dup(0) ends CODE segment start: Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 57 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  58. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 ; set segment registers: MOV ax, data MOV ds, ax MOV es, ax ; add your CODE here lea dx, pkey MOV ah, 9 int 21h ; output string at ds:dx ; wait for any key MOV ah, 1 int 21h MOV ax, 4c00h ; exit to operating system. int 21h ends END start ; set entry point and stop the assembler. 2.4.3.4 Khung ch ươ ng trình dịch ra .com - Tập tin .COM ch ỉ cĩ m ột đoạn nên kích th ước t ối đa c ủa m ột t ập tin lo ại này là 64 KB. - Tập tin .COM được n ạp vào b ộ nh ớ và th ực thi nhanh h ơn t ập tin .EXE nh ưng ch ỉ áp d ụng được cho các ch ươ ng trình nh ỏ. - Ch ỉ cĩ th ể g ọi các ch ươ ng trình con d ạng near. Khi th ực hi ện t ập tin .COM, DOS định v ị b ộ nh ớ và t ạo vùng nh ớ dài 256 byte ở v ị trí 0000h, vùng này g ọi là PSP (Program Segment Prefix), nĩ s ẽ ch ứa các thơng tin c ần thi ết cho DOS. Sau đĩ, các mã l ệnh trong t ập tin s ẽ được n ạp vào sau PSP ở v ị trí 100h và đư a giá tr ị 0 vào stack. Nh ư v ậy, kích th ước t ối đa th ực s ự c ủa tập tin .COM là 64 KB – 256 byte PSP – 2 byte stack. Tất c ả các thanh ghi đoạn đều ch ỉ đến PSP và thanh ghi con tr ỏ l ệnh IP ch ỉ đến 100h, thanh ghi SP cĩ giá tr ị 0FFFEh. ; You may customize this and other start-up templates; ; The location of this template is ;c:\emu8086\inc\0_com_template.txt CSEG SEGMENT ; code segment starts here. org 100h ; add your CODE here ret  Khai báo d ữ li ệu 58 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  59. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Khi khai báo d ữ li ệu trong ch ươ ng trình, n ếu s ử d ụng s ố nh ị phân, ta ph ải dùng thêm ch ữ B ở cu ối, n ếu s ử d ụng s ố th ập l ục phân thì ph ải dùng ch ữ H ở cu ối. Chú ý rằng đối v ới s ố th ập l ục phân, n ếu b ắt đầu b ằng ch ữ A F thì ph ải thêm vào s ố 0 ở phía tr ước. Ví d ụ: 1011b ; S nh phân 1011 ; S th p phân 1011d ; S th p phân 1011h ; S th p l c phân  Khai báo h ằng, bi ến Cú pháp: D ho ặc D dup( ) Các ki ểu d ữ li ệu: B (1 byte), W (2 bytes), D (4 bytes) Nếu khơng kh ởi t ạo, dùng d ấu h ỏi “ ?” Ví d ụ: Khai báo trong C Khai báo bi ến trong h ợp ng ữ char ch; ch DB ? char ch = ‘a’; ch DB ‘a’ char ch = 5; ch DB 5 Char s[]=”\nhello world!” s DB 10,13,”hello world!$” int i=100; i DW 100 long L; L DD ? char a[] = {1,2,3}; a DB 1,2,3 char a[100]; a DB 100 dup(?) char a[100][50]; a DB 100 dup(50 dup(?)) Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 59 Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  60. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Hằng s ố: Khai báo h ằng s ố trong ch ươ ng trình h ợp ng ữ b ằng l ệnh EQU. Ví d ụ: A1 EQU 02, 11 A2 EQU 19, 81  Tốn t ử trong h ợp ng ữ Tốn t ử s ố h ọc Trong đĩ bt, bt1, bt2 là các bi ểu th ức h ằng, n là s ố nguyên. Tốn t ử logic: Bao g ồm các tốn t ử AND, OR, NOT, XOR Tốn t ử quan h ệ: Các tốn t ử quan h ệ so sánh 2 bi ểu th ức, cho giá tr ị true (1) n ếu điều ki ện tho ả và false (0) n ếu khơng tho ả. Tốn t ử cung c ấp thơng tin: - Tốn t ử SEG: SEG bt ; Tốn t ử SEG xác định địa ch ỉ đoạn c ủa bi ểu th ức bt. bt cĩ th ể là bi ến, nhãn, hay các tốn h ạng b ộ nh ớ. - Tốn t ử OFFSET: OFFSET bt ;Tốn t ử OFFSET xác định địa ch ỉ offset c ủa bi ểu th ức bt. bt cĩ th ể là bi ến, nhãn, hay các tốn h ạng b ộ nh ớ. VD: MOV AX,SEG A ; N ạp địa ch ỉ đoạn và địa ch ỉ offset MOV DS,AX ; c ủa bi ến A vào c ặp thanh ghi MOV AX,OFFSET A ; DS:AX - Tốn t ử ch ỉ s ố [ ]: (index operator) Tốn t ử ch ỉ s ố th ường dùng v ới tốn h ạng tr ưc ti ếp và gián ti ếp. - Tốn t ử (:) (segment override operator) Segment:bt ; Tốn t ử : quy định cách tính địa ch ỉ đối v ới segment được ch ỉ. Segment là các thanh ghi đoạn CS, DS, ES, SS. 60 Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử Tr ường ĐH K ỹ thu ật Cơng nghi ệp
  61. Bài gi ảng Ch ươ ng 2 Vi x ử lý - Vi điều khi ển Vi x ử lý Intel 8086/8088 Chú ý r ằng khi s ử d ụng tốn t ử : k ết h ợp v ới tốn t ử [ ] thì segment: ph ải đặt ngồi tốn t ử [ ]. VD: Cách vi ết [CS:BX] là sai, ta ph ải vi ết CS:[BX] - Tốn t ử TYPE: TYPE bt ;Tr ả v ề giá tr ị bi ểu th ị d ạng c ủa bi ểu th ức bt. Nếu bt là bi ến thì s ẽ tr ả v ề 1 nếu bi ến cĩ ki ểu byte, 2 n ếu bi ến cĩ ki ểu word, 4 n ếu bi ến cĩ ki ểu double word. N ếu bt là nhãn thì tr ả v ề 0FFFFh n ếu bt là near và 0FFFEh n ếu bt là far. N ếu bt là h ằng thì tr ả v ề 0. - Tốn t ử LENGTH: LENGTH bt ;Tr ả v ề s ố đơ n v ị b ộ nh ớ c ấp cho bi ến bt - Tốn t ử SIZE: SIZE bt ;Tr ả v ề t ổng s ố các byte cung c ấp cho bi ến bt VD: A DD 100 DUP(?) MOV AX,LENGTH A ; AX = 100 MOV AX,SIZE A ; AX = 400 Các tốn t ử thu ộc tính: - Tốn t ử PTR: Loai PTR bt ; Tốn t ử này cho phép thay đổi d ạng c ủa bi ểu th ức bt. Nếu bt là bi ến hay tốn h ạng b ộ nh ớ thì Loai là byte, word hay dword. N ếu bt là nhãn thì Loai là near hay far. VD: A DW 100 DUP(?) B DD ? MOV AH,BYTE PTR A ; Đư a byte đầu tiên trong m ảng A vào ;thanh ghi AH MOV AX,WORD PTR B ; Đư a 2 byte th ấp trong bi ến B vào thanh ;ghi AX - Tốn t ử HIGH, LOW: HIGH bt LOW bt Cho giá tr ị c ủa byte cao và th ấp c ủa bi ểu th ức bt, bt ph ải là m ột h ằng. VD: A EQU 1234h MOV AH,HIGH A ; AH ← 12h MOV AH,LOW A ; AH ← 34h  Ch ươ ng trình con Ch ươ ng trình con (PROC) là m ột ph ần c ủa mã ngu ồn mà cĩ th ể g ọi chúng trong ch ươ ng trình c ủa b ạn để làm m ột vài nhi ệm v ụ nh ất định nào đĩ. Ch ươ ng trình con làm cho ch ươ ng trình cĩ c ấu trúc h ơn và d ễ hi ểu h ơn. Thơng th ường, ch ươ ng trình con tr ở l ại ngay sau điểm đã g ọi nĩ. Cấu trúc m ột ch ươ ng trình con nh ư sau: TÊN PROC ; đây là mã l nh c a ch ươ ng trình con Bộ mơn K ỹ thu ật máy tính – Khoa Điện t ử 61 Tr ường ĐH K ỹ thu ật Cơng nghi ệp