Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 187 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
187
Dung lượng
6,85 MB
Nội dung
VĂN THẾ MINH KĨ THUẬT VI XỬ LÍ Tài liệu dùng cho sinh viên, kĩ sư chuyên ngành Điện tử, Tin học, Viễn thông, Đo lường, Tự động NHÀ XUẤT BẢN GIÁO DỤC 1997 LỜI NÓI ĐẦU Các bạn có tay giáo trình Kỹ thuật vi xử lý dành cho sinh viên năm cuối ngành Công nghệ thông tin Điện tử - Viễn thông, trường ĐHBK Hà Nội Giáo trình dược hình thành sở kinh nghiệm đúc rút từ giảng môn học kỹ thuật vi xử lý cho sinh viên ngành nói năm học vừa qua, với mục đích cung cấp cho sinh viên kiến thức có tính hệ thống liên quan đến môn học Tốt học môn kỹ thuật vi xử lý sinh viên ngành nói phải học qua môn học khác có liên quan như: Kỹ thuật mạch điện tử, Kỹ thuật mạch logic, Kiến trúc tổ chức máy tính Trong giáo trình Kỹ thuật vi xử lý, kiến thức môn học nói coi kiến thức sở cần thiết để tiếp thu vấn đề kỹ thuật vi xử lý Giáo trình Kỹ thuật vi xử lý thông qua vi xử lý 8086/88 mạch liên quan Intel cung cấp cho sinh viên khái niệm chủ yếu hệ vi xử lý 16 bit: cấu trúc nguyên tắc hoạt động hệ vi xử lý gồm CPU mạch phụ trợ, tập lệnh vi xử lý, cách lập trình hộp ngữ, phương thức điều khiển việc vào/ra liệu hệ vi xử lý cuối cách thực số phối ghép hệ vi xử lý Trong phần cuối, giáo trình cung cấp cho sinh viên số kiến thức sơ bó vi xử lý tiên tiến khác Intel Phần phụ lục giáo trình cung cấp thêm cho sinh viên thông tin c chương trình gỡ rối (tìm lỗi) Debug, tuỳ chọn chương trình MASM LINK, dẫn hướng chương trình dịch MASM 5.0 khả tra cứu tỷ mỉ hàm ngắt DOS BIOS cho máy IBM PC Tuy ý cẩn thận trình biên soạn trình độ thời gian có hạn nên giáo trình chắn nhiều thiếu sót mặt, tác giả chân thành mong bạn đọc gần xa đóng góp nhiều ý kiến để giáo trình ngày hoàn thiện Thư góp ý xin gửi môn Kỹ thuật tính, khoa Công nghệ thông tin, trường ĐHBK Hà nội Hà Nội ngày 15/9/1997 Tác giả tiên bên trái dãy số hệ hai gọi bit có ý nghĩa lớn (Most significant bit, MSB), bit cuối bên phải dãy gọi bit có ý nghĩa bé (Least significant bit, LSB) Ứng với việc đếm thứ tự 1, 2, hệ mười hệ hai ta có 1, 10, 11 CHƯƠNG CÁC HỆ ĐẾM VÀ VIỆC MÃ HOÁ THÔNG TIN TRONG MÁY TÍNH Hình 1.1 Các đơn vị đo độ dài số hệ hai dẫn xuất từ bit Các hệ đếm dùng máy tính 1.1 Hệ mười bệ hai Trong sống hàng ngày dùng hệ số mười nói gọn hệ mười (decimal number system, viết tắt hệ D) để biểu diễn giá trị số Điều tự nhiên từ xa xưa người bình thường biết dùng 10 ngón tay (và tất nhiên lúc bí dùng thêm ngón chân!) "công cụ tính toán” sơ đẳng Trong hệ thống dùng tổ hợp chữ số để biểu diễn giá trị số, kèm theo tập hợp dùng thêm chữ D cuối để số hệ mười (ta bỏ chữ D mà ngầm hiểu số hệ mười) Trong giới máy tính khác, để biểu diễn giá trị số dùng hệ số hai nói gọn hệ hai (Binary number system, viết tắt hệ B), tồn chữ số để biểu diễn giá trị số (ứng với trạng thái có điện điện mạch điện từ cấu tạo nên máy) giá trị có chữ số hệ hai (Binary digit, viết tắt bit) Hệ hai hệ đếm dùng máy tính Một số hệ hai gồm bit thường đánh dấu chữ B kèm cuối để phân biệt với hệ khác ta làm việc lúc với nhiều hệ đếm khác Một cụm bit tạo thành nibble, cụm bit tạo thành byte, cụm 16 bit thông thường tạo thành từ (word), cụm 32 bit tạo thành từ kép (double word) Chữ số đầu Vì người quen tính toán với hệ mười, phận tính toán máy tính biết làm việc với hệ hai, nên để đảm bảo giao tiếp thuận tiện người máy (khi đưa số liệu vào lúc lấy kết tính toán) thường xuyên phải có việc chuyển đổi qua lại hai hệ đếm Chúng ta xem xét nhanh vấn đề thông qua ví dụ đơn giản Một số hệ mười viết sau: 12345,67 có giá trị số tổng tích hệ.số 1, 2, 3, 4, 5, 6, với trọng số 10i tương ứng sau: 12345,67=1.104+2.103+3.102+4.101+5.100+6.10-1+7.10-2 Tương tự , số hệ hai viết sau : 10111,01 có giá trị số tổng tích hệ số 1, 0, 1, 1, 1,0,1, với trọng số 2i tương ứng sau: =1.24 +0.23 + 1.22 + 1.21 + 1.20 +0.2-l + 1.2-2 Các thuật toán thường dùng để chuyển đổi hai hệ trên: • Đổi số hệ hai sang hệ mười Ví dụ: Đổi số 34 sang hệ hai (hình 1.1) Kết 100010B Muốn đổi số từ hệ hai sang hệ mười cần tính các giá trị 2i tương ứng với chữ số khác không thứ i số hệ hai cộng lại nói trên: Ví dụ 10111,11 B = 24+22+21+20+2-1+2-2 = 25,75 Ngược lại muốn chuyển số từ hệ mười sang số hệ hai ta làm theo cách: • Cách để đổi số hệ mười sang hệ hai Quy tắc: Lấy số hệ mười cần đổi trừ 2x (x giá trị lớn số mũ chọn cho 2x nhỏ so với số hệ mười cần đổi ghi lại giá trị cho chữ số hệ hai ứng với 2x Tiếp tục làm số dư phép trừ tạo số 2i bậc thấp đạt tới 20 ghi lại giá trị (0 l) cho chữ số hệ hai thứ i tuỳ theo quan hệ số dư lũy thừa tương ứng: 1, số dư lớn 2i Các số dư khung xếp thứ chiều mũi tên Hình 1.1 Một cách đổi số hệ mười sang hệ hai Trong trường hợp số hệ mười cần đổi có thêm phần lẻ sau dấu phảy ta phải đổi riêng rẽ phần sau cộng kết lại Đối với phần nguyên ta làm theo cách nói Riêng phần sau dấu phảy ta đổi theo quy tắc trình bày sau • Quy tắc đổi số thập phân hệ mười hệ hai 0, số dư nhỏ so với 2i (và phép trừ không thực hiện) Ví dụ: Đổi số 34 sang hệ hai Lấy số cần đổi nhân với 2, tích nhận gồm phần nguyên phần lẻ nhị phân, lấy phần lẻ nhị phân tích thu nhân tiếp với Làm tích chẵn Chọn riêng phần nguyên (phần trước dấu phảy) tích thu xếp lại chữ số sau dấu phảy số hệ hai cần tìm Các giá trị 2i cần tính đến (25 = 32 giá trị 2x sát so với số 34) 25 24 23 22 21 20 Các chữ số hệ hai tính được: 0 Ví dụ Đổi 0,125 số hệ hai Ta thực phép nhân theo bước trên: Như 34 =100010 B • Cách để đổi số bệ mười sang hệ hai Quy tắc: Lấy số cần đổi chia cho ghi nhớ phần dư, thương phép chia trước chia cho ghi nhớ phần dư Làm thương Đảo ngược thứ tự dãy số dư chữ số số hệ hai cần tìm 0,125 x = , 250 0,250 x = , 500 0,500 x = , 000 thu kết 0,125 = 0,001 B (phần đóng khung) Kết hợp ví dụ lại, phải đổi số 34,125 hệ hai ta thu kết cuối 34,125 =100010,001 B a b y c a b y c 0 0 0 0 1.2 Số BCD (số hệ mười mã hoá hệ hai) 1 0 1 1 1 Giữa hệ mười hệ hai tồn hệ lai: hệ BCD cho số hệ mười mã hoá hệ hai (Binary Coded Decimal number), thích hợp cho thiết bị đo có thêm phần hiển thị số đầu dùng loại đèn số khác ta dùng số hệ hai để mã hoá số hệ mười có giá trị nằm khoảng Như ta không dùng hết tổ hợp có bit Vì tầm quan trọng số BCD nên vi xử lý thường có lệnh thao tác với chúng 1 1 1 0 C: nhớ (Carry) Ví dụ Cộng hệ mười 11 099 095 194 Ví dụ: Số 410 biểu diễn theo kiểu số BCD 0100 0001 0000 Kết gợi ý cho ta cách thức chuyển đổi loại số 1.3 Hệ mười sáu (Hexa-decimal, hex, H) Nếu ta dùng hệ hai để biểu diễn số có giá trị lớn ta gặp điều bất tiện số hệ hai thu dài Ví dụ để biểu diễn số 255 ta cần đến bit viết sau: 255 = 1111 1111 B Trong thực tế để viết kết biểu diễn số cho gọn lại người ta tìm cách nhóm số hệ hai (1 nibble) thành số hệ mười sáu Khác với hệ BCD vừa nói hệ 16 dùng hết tổ hợp để biểu diễn giá trị số Để làm điều người ta sử dụng chữ số sẵn có hệ mười để biểu diễn giá trị số ứng với dùng thêm chữ A F để biểu diễn giá trị lại ứng với 10 15 Để phân biệt số hệ mười sáu với số hệ khác ta kèm thêm chữ H cuối Ta dễ nhận thấy số mười phận hệ mười sáu Các phép toán số học số hệ hai Phép cộng số hệ hai thực giống ta làm với số hệ mười Quy tắc phép cộng số hệ hai bảng 1.1 y=a+b Cộng hệ hai 1111 1110 0110 0011 0101 1111 1100 0010 Các cộng khối tính toán số học máy tính thực phép cộng theo cách nói 2.2 Phép trừ số bù hai a) Phép trừ Phép trừ số hệ hai thực giống ta làm với số hệ mười Quy tắc phép trừ số hệ hai bảng 1.2 Ví dụ: Trừ hệ mười Trừ hệ hai Mượn 110 0000 109 Số bị trừ 0110 1101 49 Số trừ 0011 0001 060 Hiệu 0011 1100 b) Số bù hai 2.1 Phép cộng Bảng 1.1 Quy tắc phép cộng Nhớ Số hạng Số hạng Tổng B: Mượn (Borrow) Bảng 1.2 Quy tắc phép trừ y=a-b Trong làm phép trừ ta nhận thấy thực phép trừ phép cộng: cộng số bị trừ với số đối số trừ Điều ứng dụng khối tính toán số học máy tính để tận dụng cộng có sẵn Vấn đề đặt số hệ hai ta phải có cách biểu diễn số âm cách thích hợp cho ta ứng dụng tính chất nói Có nhiều cách mã hoá số hệ hai để biểu diễn số âm thực tế hay dùng dùng cách mã hoá kiểu số bù hai 10 Bảng 1.3 cách tạo số hệ hai có dấu bố hù hai tương quan với số hệ hai Bảng 1.3 Biểu diễn số theo hệ hai, hệ hai có dấu mã bù hai Số bit hệ hai 0000 0000 0000 0001 0000 0010 0111 1101 0111 1110 0111 1111 1000 0000 1000 0001 1000 0010 1111 1101 1111 1110 1111 1111 Số hệ mười tương đương 125 126 127 128 129 130 253 254 255 Số hệ mười theo mã hệ hai có dấu +0 +1 +2 +125 +126 +127 -0 -1 -2 -125 -126 -127 Số hệ mười tính theo mã bù hai +0 +1 +2 +125 +126 +127 -128 -127 -126 -3 -2 -1 Quan sát kỹ bảng rút nhận xét sau: Nếu ta dùng bit để biểu diễn số ta thu 256 tổ hợp có giá trị từ đến 255 (tương ứng 00 FF H), tức biểu diễn số dương Với tổ hợp ta muốn biểu diễn số có dấu theo kiểu dấu độ lớn (sum and magnitude) ta phải để dành cho dấu bit lại để định giá trị Với cách làm ta có khả biểu diễn số âm số dương nằm khoảng -127 -0, +0 +127 (chú ý hai giá trị khác c !) Số bù hai tạo theo cách gần giống kiểu dấu độ lớn dùng để biểu diễn giá trị số mã hoá Mã bù hai dài bit có khả biểu diễn số âm dương khoảng -128 +127 Một số đương có mã bù hai giống mã hệ hai thông thường theo mã khác Cho dù có biểu diễn số hệ hai có dấu hay số bù hai số âm có bit b7=1, số dương có bit b7=0 Bây ta nói cụ thể cách tính số bù hai số Về mặt toán học số bù hai số số đối Như sử đương có số bù hai số âm giá trị tuyệt đối ngược lại Quy tắc: Muốn tìm số bù hai (còn gọi bù số học) số A ta làm theo bước sau: + Biểu diễn số A theo mã bù hai + Tìm số bù (bù logic) số (bằng cách đảo bit) + Cộng vào số bù để nhận số bù hai số A Ghi chú: Khi có số âm biểu diễn theo mã bù hai muốn tính giá trị tuyệt đối ta áp dụng quy tắc (áp dụng bước 2,3) Ví dụ: Tìm số bù hai 13 13 = 0000 1101 B (mã bù hai 13) số bù 13 : 1111 0010 B(đảo bít số trên) cộng thêm : số bù hai 13: 1111 0011 B (tức -13) Có thể lấy ví dụ khác để chứng tỏ kết qua thấy ứng dụng số bù hai làm phép trừ Ví dụ: 15 - 13 = ? Ta viết lại phép trừ.trên thành Phép cộng 15+(-13) sử dụng kết vừa tính cho số (-13): 15 0000 1111 (-13) 1111 0011 tổng 0000 0010 (nhớ 1) Nếu không để ý đến nhớ ta có kết Ví dụ: 12 - 13 = ? 12 (-13) tổng Một số biểu diễn theo hệ hai có giá trị khác hiểu mã để biểu diễn số theo kiểu hệ hai có dấu kiểu số bù hai Nói khác đi, cụm số cảm nhận khác biểu diễn giá trị số 11 12 0000 1100 1111 0011 0000 0010 (tức -1) Đây số âm (bit b7=l) với giá trị tuyệt đối (tra theo bảng l.3) Mặt khác ta tìm giá trị tuyệt đối kết cách tìm số bù hai nó: Mã bù hai kết 1111 1111 số bù kết nói 0000 0000 cộng để tìm giá trị tuyệt đối 0000 0001 2.3 Phép nhân Phép nhân số hệ hai thực giống ta làm với số hệ mười Quy tắc phép nhân số hệ hai bảng 1.4 Bảng 1.4 Quy tắc nhân y=a.b a b y 0 0 1 0 1 Trên sở quy tắc vừa nêu đơn giản ta thực ví dụ phép nhân số hệ hai với độ đài để làm sáng tỏ thuật toán nhân 1001 0110 0000 1001 1001 1001 0110110 Số bị nhân (9) Số nhân (6) Thành phần tổng Thành phần tổng Thành phần tổng Thành phần tổng Tổng tích luỹ (54) tích tích tích tích • Thành phần tổng tích luỹ thu tích cửa số LSB số nhân với số bị nhân Nếu LSB = thành phần 0, LSB = thành phần số bị nhân • Mỗi thành phần thứ i tổng tích luỹ tính cách tương tự, phải dịch trái i bit (có thể bỏ qua thành phần 0) • Tổng tổng thành phần tích cần tìm Để minh hoạ cho thuật toán trên, ta dùng để rút gọn ví dụ làm trước sau: 1001 Số bị nhân (9) 0110 Số nhân (6) 1001 Số bị nhân dịch trái lần 1001 Số bị nhân dịch trái lần 0110110 Tổng tích luỹ (54) 2.4 Phép chia Phép chia phép tính ngược phép nhân Từ suy phép chia thực phép trừ phép địch liên tiếp trừ (đã không để trừ sớm trừ nhỏ số chia) Sau thuật toán phép chia thông qua ví dụ cụ thể Ví dụ: 35/5 = Ta quan sát kỹ bước phải làm chia tay 100011 000 1000 101 111 101 101 101 luỹ luỹ luỹ luỹ Độ dài cực đại kết trường hợp bit Nếu ta có toán hạng (hoặc 16) bit độ dài cực đại kết 16 (hoặc 32) bit Mỗi lần nhân khác số nhân với số bị nhân ta thu số bị nhân Nếu dịch trái số lần tương ứng với vị trí bit khác số nhân, ta tạo thành phần tổng tích luỹ Tổng thành phần kết phép nhân Phân tích kỹ trình ta thấy phép nhân thực theo thuật toán cộng dịch (trên sở cộng dịch) sau: 13 101 0111 Trong bước tính liên tục cần phải có dự đoán kiểm tra để tìm kết Công việc khó khăn mạch điện tử khối tính toán số học (vốn phần tử để thực phép cộng dịch máy tính) Sau thuật toán khắc phục vấn đề nêu trên: Đổi số chia số bù hai (để bước sau làm tính trừ tính cộng) 14 Lấy số bị chia trừ số chia Mã ASCII mã tiêu chuẩn cho trao đổi thông tin Nếu kết có bit dấu (có nghĩa phần số bị chia chia cho số chia) bit tương ứng thương Nếu kết có bit dấu (có nghĩa phần số bị chia không chia cho số chia) bit tương ứng thương ta buộc phải khôi phục lại giá trị ban đầu số bị chia cách cộng kết với số chia mã hệ hai Dịch trái kết thu làm lại bước nhận đưa kết cuối, (chia hết) nhỏ số chia (chia dư) Vi dụ: 86/5 = 7, dư Thực phép chia hệ hai Đầu tiên ta có = 0101 B số bù hai 1011 B Các bước tính toán tiếp phép chia theo thuật toán nêu hệ kê nhu sau: Toán hạng 100100 011000 111100 0 1 111100 101000 100100 00100 01100 10000 0000 0110 0110 110 011 001 Thương Tên toán hạng, thao tác Số chia Số mã bù hai để cộng Tổng, kết (kq1) kq1 Số chia mã hệ Số bị chia Số bị chia dịch Số bị chia mã Tổng, kết kq2 dịch trái lần Số chia mã bù để cộng Tổng, kết (kq3) kq3 dịch trái lần Số chia mã bù để cộng Tổng, kết (kq4) để cộng trái lần bù để cộng (kq2) Trong phần trước ta nói đến cách biểu diễn số hệ đếm Bây ta xem xét việc biểu diễn thông tin nói chung máy tính Tất thông tin máy tính biểu diễn dạng số Mỗi tổ hợp số gán ký tự chữ cái, chữ số ký tự khác theo cách thức định Trong thực tế thông tin truyền Bit dấu Từ ta rút 36/ = dư 15 16 đi, lưu giữ nhớ để thị hình dạng ký tự tuân theo loại mã dùng rộng rãi gọi mã ASCII (Amenican Standard Code for Information Interchange, mã chuẩn Mỹ dùng cho trao đổi thông tin) Việc dùng ký tự để mã hoá thông tin theo bảng mã ASCII (bảng 1.5) cho ta khả trao đổi thông tin với hầu hết máy tính khác cách khác số BCD không gói số dài byte, bit cao không, bit thấp số BCD chuẩn mã hoá số cần biểu diễn Ví dụ sau minh hoạ quan hệ số BCD gói, BCD không gói mã ASCII Mã ASCII 0011 0101B = 35H Mã ASCII 0011 l001B = 39H Mã BCD không gói 0000 0101B = 05H Mã BCD không gói 0000 1001B = 09H Mã BCD gói (chuẩn) 59 0101 l001B = 59H Trong bảng mà ASCII tiêu chuẩn, người ta dùng bit để mã hoá ký tự thông dụng bảng mã có 128 ký tự ứng với mã số từ 127 Bit thứ cho liên tục 0, dùng để chứa bit parity (xem ý nghĩa parity chương 3, nhân nói cờ) phục vụ cho việc phát lỗi truyền Bên cạnh bảng ASCII tiêu chuẩn người ta dùng bảng ASCII mở rộng cho ký tự đặc biệt (khác ký tự tiêu chuẩn) với mã từ 128 255 Khi tra bảng ta đọc mã ký tự theo thứ tự cột hàng Từ ta rút bước phải làm để đổi số dạng mã ASCII sang dạng số BCD chuẩn: + Đổi số từ mã ASCII số BCD không gói, + Đổi số thứ từ mã ASCII số BCD không gói, + Lấy bit thấp số đầu ghép với bit thấp số sau tạo thành byte biểu diễn số BCD gói Đây công việc hay gặp thao tác với số hệ vi xử lý Ví dụ: Mã ASCII số ký tự thường dùng lập trình (Bell, chuông): (Back space, xoá lùi): (horizon tab, giãn cách ngang): (Line feed, thêm dòng mới): OAH (Carriage return, đầu dòng): ODH (Space, dấu cách): 20H; “$”: 24H; ‘0’: 30H; '9':39H; 'A': 41H ‘a’: 61H Khi xem xét bảng 1.5 ta rút nhận xét sơ sau: cột đầu bảng mã dùng cho ký tự điều khiển Cột đành riêng cho ký tự ngăn cách Các ký tự số nằm cột Mã ký tự '0' 30H, '9' 39H Giữa giá trị số mã ASCII số có khoảng cách 30H Các chữ hoa nằm cột 4, 5, chữ thường cột 6, Khoảng cách chữ thường chữ hoa tên 20H Quan hệ mã ASCII với số BCD Trong làm toán với số BCD ta thường kết hợp số BCD thành byte Dạng số BCD viết theo kiểu gọi dạng BCD chuẩn hay gọi dạng BCD gói (packed BCD): Khi lưu trữ, thị truyền thiết bị giá trị số 9, thực chất ta làm việc với mã ASCII số đó, tức số 30H 39H Như ta thấy byte mã ASCII biểu diễn số có bit thấp ứng với mã BCD số đó, bit cao ứng với mã BCD số (tức 0011B) Nếu byte mã ASCII ta thay bit cao 0H ta thu số BCD không gói Nói 17 18 nghiên cứu vũ trụ, để xử lý thông tin ngành ngân hàng, ngành khí tượng, công ty bảo hiểm Tiêu biểu cho loại máy tính máy IBM 4381, Honeywell DSP8 Loại máy mạnh số máy lớn gọi supercomputer (như loại máy Y-MP/832 Cray) 1.2 Máy tính CHƯƠNG MÁY VI TÍNH VÀ HỆ THỐNG VI XỬ LÝ Bộ vi xử lý có mặt máy vi tính phát triển xử lý trung tâm dùng phận chủ chốt máy tính hệ trước Để nắm bắt tính liên tục tính kế thừa phát triển này, trước giới thiệu vi xử lý ta để chút thời gian để giới thiệu sơ qua loại máy tính nói chung Từ máy tính lớn đến máy vi tính Như ta biết kiến trúc máy tính nói chung, máy tính (computer) thông thường bao gồm khối chức như: khối xử lý trung tâm (CPU, central processing unit), nhớ (M, memory) khối phối ghép với thiết bị ngoại vi (I/O input/output) Tuỳ theo quy mô phức tạp khối chức kể mà người ta phân máy tính điện tử sử dụng thành loại sau: 1.1 Máy tính lớn Máy tính lớn (mainframe) loại máy tính thiết kế để giải toán lớn với tốc độ nhanh Nó thường làm việc với số liệu với độ dài từ 64 trang bị nhớ lớn Chính máy tính lớn lớn kích thước vật lý: Chúng thường dùng để điều khiển hệ thống thiết bị dùng quân hệ thống máy móc chương trình 19 Máy tính (minicomputer) dạng thu nhỏ kích thước tính máy tính lớn Nó đời nhằm thoả mãn nhu cầu sử dụng máy tính cho ứng dụng vừa phải mà dùng máy to vào gây lãng phí Do máy tính thường làm việc với liệu có độ dài từ 32 bit vôi tốc độ chậm khả nhớ hạn chế Máy tính thường dùng cho tính toán khoa học kỹ thuật, gia công liệu qui mô nhỏ hay để điều khiển trình công nghệ Tiêu biểu cho nhóm máy VAX 6360 Digital Equipment Corporation MV/8000II Data General 1.3 Máy vi tính Máy vi tính (microcomputer) loại máy tính thông dụng Một máy vi tính vi điều khiển (microcontroller), máy vi tính vỏ Vi mạch (one chip microcomputer) hệ vi xử lý có khả làm việc với liệu có độ dài bit, bit, bit, 16 bit Hiện số máy vi tính có tính so sánh với máy tính con, làm việc với số liệu có độ dài từ 32 bit (thậm chí 64 bit) Ranh giới phân chia máy vi tính máy tính ngày không rõ nét Một đặc điểm tiêu biểu dễ nhận biết loại máy tính chúng sử dụng xử lý trung tâm (CPU) chế tạo công nghệ mạch vi điện tử với mức độ tổ hợp lớn, mạch VLSI (Very large scale of integration) mà người ta quen gọi vi xử lý (microprocessor, µ p) Các vi xử lý có trí; trường thường xếp theo họ phụ thuộc vào nhà sản xuất chúng đa dạng chủng loại Nổi bật họ vi xử lý họ nhà sản xuất hàng đầu tiếng lĩnh vực này, họ vi xử lý 80x86 Intel họ vi xử lý 680xx Motorola Trong chương sau quan tâm chủ yếu đến vi xử lý, mạch phụ trợ hệ thống xây dựng sở linh kiện Intel, sau ta giới thiệu lướt qua lịch sử phát triển đặc điểm chung hệ vi xử lý từ trước đến Cuối ta đưa bảng tổng kết nêu thông số vi xử lý hệ gần nhà cung cấp tiếng Intel Motorola 20 PHỤ LỤC C CHƯƠNG TRÌNH TÌM LỖI DEBUG 1. Giới thiệu DEBUG Trong phần này ta sẽ nói về chương trình tìm lỗi DEBUG. Chương trình DEBUG thường được cung cấp kèm theo các tệp của DOS. DEBUG là một chương trình có từ rất lâu và là một công cụ khá tiện lợi để tìm lỗi (debugging) với đặc điểm là kích thước chương trình nhỏ với tập lệnh dễ hiểu. Bằng DEBUG người sử dụng có thể quan sát và thay đổi được văn bản chương trình gốc, quan sát được sự thay đổi của các thanh ghi và các cờ trong quá trình chạy thử chương trình. 2. Chương trình DEBUG Bảng C.1 tổng kết các lệnh tiện dụng nhất của DEBUG, để có tập lệnh (lầy đủ và chi tiết hơn có thể tham khảo thêm các tài liệu về DOS · Biểu diễn các lệnh của DEBUG Để biểu diễn các lệnh của DEBUG chúng ta sẽ sử dụng chương trình hợp ngữ C1.ASM. đó là chương trình hiện thị lời chào "HELLO!" trên màn hình. 345 346 Chương trình Cl.ASM Model Small Stack 100 Data MSG DB 'HELLO!','S' Code MAIN Proc MOV AX , @DATA MOV DS , AX LEA DX, MSG MOV AH, 9 INT 21H MOV AH, 4CH INT 21H MAIN Endp END MAIN ; khởi tạo DS ;lấy địa chỉ thông báo ; hàm hiện thị ;hiện thi thông báo ; trở về DOS Sau khi dịch và liên kết chương trình thành tệp Cl.EXE, ta dùng DEBUG để cho chạy và thủ nghiệm chương trình (các ký tự do người sử dụng phải gõ vào được in đậm). C>DEBUG Cl.EXE Khi DEBUG hoạt động thì trên màn hình xuất hiện dấu nhắc "". Để xem nội dung các thanh ghi, ta gõ "R" R AX=0000 BX=0000 CX=0019 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=2B55 ES=2B55 SS=2B57 CS=2B65 IP=0000 NV UP EI PL NZ NA PO NC 2B65 : 0000 B8662B MOV AX,2B66 Màn hình trình bày nội dung của các thanh ghi dưới dạng hex. Dòng thứ 3 chứa địa chỉ đoạn:lệch của lệnh đầu tiên trong chương trình, tiếp theo đó là lệnh ở dạng mã máy và dạng gợi nhớ. Các cấp ký tự ở cuối dòng thứ 2 là các trạng thái hiện thời của các cờ (bao gồm cả cờ trạng thái và cờ điều khiển). Bảng C2 liệt kê các ký hiệu được sử dụng trong DEBUG để biểu thị giá trị của các cờ 347 348 AX=2B66 BX=0000 CX=0019 DX=1ABC SP=0100 BP=0000 SI=0000 DI=0000 DS=2B66 ES=2B55 SS=2B67 CS=2B65 IP=0005 NV UP EI PL NZ NA PO NC 2B65 : 0005 8D160200 LEA DX,[0002] T AX=2B66 BX=0000 CX=0019 DX=1ABC SP=0100 BP=0000 SI=0000 DI=0000 DS=2B66 ES=2B55 SS=2B67 CS=2B65 IP=0009 NV UP EI PL NZ NA PO NC 2B65 : 0009 B409 MOV AH,09 T Ví dụ khi muốn đổi nội dung của thanh ghi DX thành 1ABCH, ta gõ: R DX AX=0966 BX=0000 CX=0019 DX=1ABC SP=0100 BP=0000 SI=0000 DI=0000 DS=2B66 ES=2B55 SS=2B67 CS=2B65 IP=000B NV UP EI PL NZ NA PO NC 2B65 : 000B CD21 INT 21 Nếu bây giờ ta lại gõ T lần nữa thì DEBUG sẽ thực hiện từng lệnh trong chương trình phục vụ ngắt INT 21H, điều này ta không muốn để xảy ra. DX 0000 :1ABC DEBUG đáp lại bằng việc cho hiện nội dung hiện thời của DX, sau đó nó cho hiện dấu 2 chấm và đợi ta gõ vào nội dung mới của DX. Ta gõ vào số 1ABC và gõ phím ENTER (DEBUG ngầm định tất cả các số do người sử dụng gõ vào đều là số hệ 16 nên ta không cần gõ thêm chữ "H" ở cuối nữa). Muốn giữ nguyên nội dung của DX ta chỉ việc gõ ENTER ngay sau dấu hai chấm. Để kiểm chứng lại việc thay ửôi vừa rồi: ta có thể cho hiện thị lại một lần nữa nội dung của các thanh ghi: R AX=0000 BX=0000 CX=0019 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=2B55 ES=2B55 SS=2B57 CS=2B65 IP=0000 NV UP EI PL NZ NA PO NC 2B65 : 0000 B8662B MOV AX,2B66 Từ lần hiện thị thanh ghi cuối cùng ta thấy rằng INT 21H là một lệnh gồm 2 byte. Đủ giá trị hiện thời của IP là D00BH, lệnh tiếp theo sẽ nằm tại địa chỉ 000DH, và ta có thể tạo điểm dừng tại đó: G D HELLO ! AX=0924 BX=0000 CX=0019 DX=0002 SP=00100 BP=0000 SI=0000 DI=0000 DS=2B66 ES=2B55 SS=2B67 CS=2B65 IP=000D NV UP EI PL NZ NA PO NC 2B65 : 000D B44C MOV AH,4C Hàm 9 của ngắt INT 21H dã cho hiện ra lời chào HELLO! và chương trình dừng lại tại điềm dừng 000DH. Để kết thúc việc thực hiện chương trình ta chỉ việc gõ vào phím G: G Tiếp theo ta sẽ cho chương trình chạy từng lệnh cho tới lệnh INT 21H: Program tenninated normaly (Chương trình kết thúc bình thường) T AX=2B66 BX=0000 CX=0019 DX=1ABC SP=0100 BP=0000 SI=0000 DI=0000 DS=2B55 ES=2B55 SS=2B67 CS=2B65 IP=0003 NV UP EI PL NZ NA PO NC 2B65 : 0000 B8662B MOV DS,AX Dòng thông báo này cho ta biết rằng chương trình đã kết thúc đúng. Chương trình cần phải được nạp để có thể lại chạy được, do vậy ta thoát khỏi DEBUG bằng cách gõ vào phím Q T 349 350 Q C> Để thử lệnh U ta quay lại DEBUG và dùng hó để liệt kê các lệnh của chương trình C1.EXE. Trong danh sách liệt kê các lệnh gợi nhớ của lệnh dịch ngược U, DEBUG đã thay thế các tên bằng các địa chỉ đoạn và địa chỉ lệch được gán cho những tên đó. Chẳng hạn thay vì MOV AX,@DATA ta có MOV AX,01FB hoặc LEA DX,MSG được thay bằng LEA DX,[0002] vì 0002H chính là giá trị lệch gán cho MSG trong đoạn DATA. Để biểu diễn lệnh D ta cho hiện ra nội dung vùng nhớ có chứa lời chào “HELLO!”. Trước tiên ta phải thực hiện 2 lệnh khởi tạo DS: C>DEBUG Cl.EXE G 5 U 2B65 : 0000 2B65 : 0003 2B65 : 0005 2B65 : 0009 2B65 : 000B 2B65 : 000D 2B65 : 000F 2B65 : 0011 2B65 : 0014 2B65 : 00l5 2B65 : 0016 2B65 : 0019 2B65 : 001A 2B65 : 001C 2B65 : O001 2B65 : 001E AX=2B56 BX=0000 CX=0019 DX=0002 SP=00100 BP=0000 SI=0000 DI=0000 DS=2B66 ES=2B55 SS=2B67 CS=2B65 IP=0005 NV UP EI PL NZ NA PO NC 2B65:0005 8D160200 LEA DX,[0002] B81BOF MOV AX, OF1B 8ED8 MOV DS, AX 8Dl60200 LEA DX,[0002] B409 MOV AH, 09 CD21 INT 21 B44C MOV AH, 4C CD21 INT 21 014845 ADD [ BP+SI+45], CL 4C DEC SP 4C DEC SP 4F DEC DI 2F DAS 21CB AND BX, CX 40 INC AX 2F DAS 216744 AND [BX+44], SP Bây giờ ta sẽ hiện thị nội dung của bộ nhờ bắt đầu từ địa chỉ DS:0 D 0 DEBUG đã dịch ngược nội dung của khoảng 32 byte thành các lệnh gợi nhớ. Chương trình thực sự kết thúc tại địa chỉ 000FH, phần còn lại là các byte không xác định nằm tiếp ngay sau chương trình và đã bị DEBUG coi là mã lệnh và bị dịch ra. Để chỉ hiển thị đoạn chương trình trong giới hạn độ dài thực và loại bỏ phần mã ngẫu nhiên, ta gõ: DEBUG hiện thị 128 byte liên tục của bộ nhớ (16 byte x 8 dòng). Nội dung của mỗi ô nhớ được biểu diễn bằng 2 chữ số hex. Chẳng hạn nội dung hiện thời của ô nhớ 0002H là 48H. Dõi theo hàng thứ nhất chúng ta thấy nội dung của các byte từ 0 đến 7, dấu gạch ngang rồi đến nội dung của các byte từ 8 đến 0FH. Nội dung của các byte từ 10H đến 1FH được trình bày ở dòng thứ 2 và cứ tuần tự như vậy. Phần bên phải của dòng hiện thị là nội dung của ô nhớ được dịch ra thành các ký tự (các ký tự không in ra được được thay bằng các dấu chấm). U O F 2B65 : 0000 B81BOF 2B65 : 0003 8ED8 2B65 : 0005 8D160200 2B65 : 0009 B409 2B65 : 000B CD21 2B65 : 000D B44C 2B65 : 000F CD21 Để chỉ hiện thị riêng lời chào "HELLO!" chúng ta gõ: MOV AX, 0F1B MOV DS , AX LEA DX,[0002] MOV AH, 09 INT 21 MOV AH, 4C INT 21 D 2 8 2B66 : 0000 351 352 48 45 4C 4C 4F 21 24 HELLO!$ Trước khi tiếp tục trình bày các lệnh khác ta hãy chú ý đến một đặc điểm của việc lưu giữ dữ liệu trong bộ nhớ của các thế hệ máy Intel. Khi viết chương trình chúng ta thường viết nội dung của một từ theo thứ tự byte cao rồi đến byte thấp. Thế nhưng khi cất từ đó vào ô nhớ thì sẽ có sự sắp xếp ngược lại (điều này ta đã nói đến ở chương 4). DEBUG sẽ hiển thị nội dung của ô nhớ theo trình từ byte thấp rồi đến byte cao, chẳng hạn nếu một từ có nội dung là 4845, nhưng DEBUG sẽ hiển thị nó thành 4548. Điều này có thể gây ra nhầm lẫn khi ta dịch nội dung của 2 ô nhớ liên tiếp như là nội dung của một từ. DEBUG bắt đầu bằng việc hiện thị nội dung hiện thời của byte 0200H, đó là lịch và chờ người sử dụng đưa vào giá trị mới. Ta gõ số 1 và ấn tiếp vào thanh cách. Tiếp theo DEBUG hiện thị nội dung của byte 0201H, đó là FFH và một lần nữa nó lại đợi ta đưa vào giá trị mới. Ta gõ vào số 2 và ấn tiếp vào thanh cách để chuyển trang byte tiếp theo. Cứ như vậy cho đến khi ta đã đưa vào số 5 cho byte 0204H, tiếp đó DEBUG hiện thị nội dung của byte 0205h là F3H. Do ta không muốn vào tiếp số liệu nữa nên ta gõ ENTER để trở về dấu nhắc của DEBUG. Bây giờ ta xem lại nội dung của bộ nhớ vừa bị thay đổi: D 200 204 Bây giờ ta dùng lệnh E để đồi lời chào "HELLO!" thành "GOODBYE!": 2B66:0200 01 02 03 04 05 . . . . Nội dung của các ô nhớ thực sự đã bị thay đổi sau các thao tác vừa E 2 ‘GOODBYE!’ rồi. Để kiểm chứng sự thay đổi, ta cho hiện thị nội dung bộ nhớ: Cần chú ý rằng trong quá trình vào số liệu, ta vẫn có thể giữ nguyên nội dung của một ô nhớ nào đó, muốn làm được như vậy ta chỉi cần ấn vào thanh cách để chuyển đang byte tiếp theo hay ấn ENTER để trở về dấu nhắc của DEBUG D 0 F 2B66:0000 21 00 47 4F 44 42 5945 21 24 CB 40 2F 21 67 !.GOODBYE!$@/!g Cuối cùng ta cho chạy chương trình: G GOODBYE! Proqram terminated normally. Lệnh E còn được dùng để thay đổi nội dung của ô nhớ theo kiểu hỏi đáp với người dùng. Giả thiết tà muốn thay đổi nội dung của các byte có địa chỉ từ 200204H. Trước khi thay đổi ta hãy xem nội dung hiện thời của chúng để dễ so sánh về sau. Muốn vậy ta gõ vào: D 200 204 2B66:2020 0C FF 5A E9 48 Z.H Sau đó ta mới đưa các giá trị mới 1, 2, 3, 4, 5 vào các vi tri muốn thay đổi: E 200 2B66:0200 0C.1 FF.2 5A.3 E9.4 48.5 F3 353 354 Hướng dẫn này báo cho chương trình dịch liên kết một thanh ghi đoạn với một tên. PHỤC LỤC D Ví dụ ASSUME ES:E_SEG CÁC HƯỚNG DẪN CHƯƠNG TRÌNH DỊCH CS:C_SEG, DS:D_SEG, SS:S_SEG, Chú ý: Tên NOTHING loại bỏ liên kết hiện thời của thanh ghi đoạn. Đặc biệt ASSUME NOTHING loại bỏ liên kết thanh ghi đoạn được tạo nên bởi câu lệnh ASSUME trước đó. CODE Cú pháp CODE {name} Hướng dẫn đơn giản (kể từ MASM 5.0 trở đi) để định nghĩa một đoạn mã. Trong phụ lục này ta sẽ mô tả các hướng dẫn chương trình dịch quan trọng nhất. Trong khi giải thích cú pháp:ta sẽ sử dụng các ký hiệu sau đây: COMM Cú pháp COMM definition [ , definition] | Phần cách giữa các khả năng {} đóng khung các tuỳ chọn [ ] lặp lại các phần được bao quanh không hay một vài lần. Ở đây definition có cú pháp. NEAR 1 FAR label : size{ :count} label là một tên biến Nếu trong khi trình bày một lệnh mà không được đưa ra cú pháp của nó, thì điều này có nghĩa là hướng dẫn đó không yêu cầu hoặc không có các tham số tuỳ chọn. ALPHA size có thể là BYTE, WORD, DWORD, QWORD hay TBYTE count là số các phần tử chửa trong biến (mặc định =l). Đây là hướng dẫn dùng để định nghĩa một biến công cộng. Một biến như thế có cả hai thuộc tính PUBLIC và EXTRN và vì vậy ta có thể sử dụng nó trong các mô đun chương trình hợp án khác nhau. Ví dụ Thông báo cho chương trình dịch xắp xếp các đoạn theo thứ tự abc. Hướng dẫn này đặt trước các định nghĩa đoạn. COMM NEAR WORD1 : WORD COMM FAR ARR1 : BYTE : 10 , ARR2 : BYTE : 20 ASSUME COMMENT Cú pháp ASSUME segment_register segment_register : name] Cú pháp : name[ COMMENT delimiter {text} , 355 356 {text} XCREF NAME1, NAME2 khảo chéo với delimiter {text} ; NAME1 và NAME2 trong đó delimiter (dấu phân cách) là một ký tự đầu tiên khác dấu trống sai hướng dẫn COMMENT. Hướng dẫn này thường được sử dụng để định nghĩa một chú giải. Chương trình dịch sẽ bỏ qua đoạn văn bản giữa dấu ngăn cách thử nhất và thứ hai. Văn bản trong cùng dòng với dấu ngăn cách thứ hai cũng bị bỏ qua. Ví dụ COMMENT * Uses an asterisk as the delimiter. All this text is ignored * COMMENT + This text and the following instruction ; ngừng việc tham DATA và .DATA? Đây là các hướng dẫn dùng để định nghĩa một cách đơn giản các đoạn dữ liệu. DATA dùng để định nghĩa một đoạn dữ liệu được khởi tạo trước và .DATA? dùng để định nghĩa một đoạn dữ liệu không được khởi tạo. Dữ liệu không được khởi tạo bao gồm các biến dược định nghĩa với '?'. .DATA? chủ yếu được dùng trong các chương trình viết bằng hợp ngữ được gọi từ một ngôn ngữ bậc cao. Trong một chương trình hợp ngữ thuần nhất, đoạn DATA có 'thể chứa các dữ liệu không được khởi tạo. is ignored tao +MOV AX, BX CÁC HƯỚNG DẪN ĐỊNH NGHĨA DỮ LIỆU CONST Hướng dẫn Hướng dẫn dùng định nghĩa một cách đơn giản đoạn chứa các dữ liệu không bị thay đổi bởi chương trình (hằng). Chủ yếu được dùng trong các chương trình hợp ngữ được gọi bởi một ngôn ngữ bậc cao. DB DD DF CREF và .XCREF DQ DT DW Cú pháp CREF {name [, name]} XCREF Ý nghĩa định nghĩa byte định nghĩa từ kép (doubleword, 4 byte) định nghĩa farword (6 byte) , chỉ dùng với bộ vi xử lý 80386. định nghĩa 4 từ (quadword, 8 byte) định nghĩa 10 byte (tenbyte) định nghĩa từ (word, 2 byte) Cú pháp {name [, name]} {name} directive intializer [, initializer] Trong khi tạo ra tệp tham khảo chéo (tệp đuôi.CRF), hướng dẫn .CREF nhằm sinh ra tệp tham khảo chéo của các tên trong một chương trình. .CREF không tham số tạo ra tệp tham khảo chéo chứa tất cả các tên. Đây là hướng dẫn mặc định. trong đó: name là một tên biến. Nếu name (tên) bị bỏ qua, ô nhớ được dành ra nhưng không có tên nào gán được cho nó. initializer là một hằng số, biểu thức hằng hay '?'. Các giá trị lặp lại có thể được định nghĩa bằng cách dùng toán hạng DUP (xem chương 4). XCREF ngững việc tham khảo chéo nói chung hoặc ngững đối với các tên xác định. Ví dụ DOSSEG XCREF ; ngững tham khảo chéo Hướng dẫn này báo cho chương trình dịch chấp nhận quy ước về trình tự các đoạn. Trong một chương trình kiểu SMALL, trình tự này là: đoạn lệnh, đoạn dữ liệu và đoạn ngăn xếp. Hướng dẫn chương trình dịch này cần đặt trước mọi định nghĩa đoạn . CREF ; tiếp tục việc tham khảo chéo 357 358 Có hai dạng, đẳng thức số và đẳng thức ký tự. Một đẳng thức số có ELSE dạng: Sử dụng trong một khối điều kiện. Cú pháp là: IF condition statement1 ELSE statement2 ENDIF name EQU numeric_expression Một đẳng thức ký tự có dạng: name EQU Có thể diễn tả điều này như sau: nếu điều kiện (condition) là đúng, các dòng lệnh statement1 được dịch; nếu điều kiện sai, các dòng lệnh statement2 được dịch (xem thêm chương 4 về dạng thức của điều kiện). Hướng dẫn EQU gán biểu thức sau EQU cho hằng name. Biểu thức số phải tương đương với một số. Những nơi có mặt name trong chương trình sẽ được chương trình dịch thay thế bởi biểu thức số hay chuỗi ký tự. Không có ô nhớ nào được dành cho các tên và chúng ta không thể định nghĩa lại các tên này. END Ví dụ Cú pháp END { start_address} END dùng để kết thúc một chương trình nguồn start_address là một tên tại vị trí của lệnh đầu tiên khi chương trình được nạp vào bộ nhớ. Đối với một chương trình chỉ có một mô đun nguồn, start_address thường là địa chỉ ứng với tên của thủ tục chính hay một nhãn xác định câu lệnh đầu tiên. Đối với một chương trình gồm nhiều mô đun, mỗi môđun phải có một hướng dẫn END nhưng chỉ có một mô đun được phép chỉ ra địa chỉ đầu. MAX EQU 32767 MIN EQU MAX10 PROMPT EQU ARG EQU Dùng trong chương trình: DATA MSG DB PROMPT ENDIF CODE MAIN PROC Kết thúc khối điều kiện. MOV AX, MIN ; tương đương với MOV AX,32757 ENDM MOV BX,ARG ; tương đương với MOV BX,[DI+2] Kết thúc một lệnh gộp hay một khối lặp. MAIN ENDP END MAIN ENDP =(bằng) Kết thúc một thủ tục. Xem PROC. Cú pháp ENDS name : expresion trong đó biểu thức (expression) là một số nguyên, biểu thức hằng hay một hằng chuỗi một hoặc hai ký tự, Kết thúc một đoạn hay cấu trúc. EQU Hướng dẫn '=' làm việc giống như EQU, chỉ khác là các tên định nghĩa với '=' có thể định nghĩa lại đâu đó ở trong chương trình. Cú pháp Ví dụ 359 360 CTR = 1 MOV AX , CTR Thông báo tên ở bên ngoài cho chương trình dịch (nghĩa là một tên được định nghĩa trong một môđun khác). Kiểu của tên phải tương ứng với kiểu dà được khai báo trong mô đun kia. Các kiểu có thể là NEAR, FAR, PROC, BYTE, WORD, DWORD, FWORD, QWORD, TBYTE hay ABS. ; được dịch thành MOV AX,1 CTR = CTR + 5 MOV BX, CTR ; được dịch thành MOV BX,6 FARADATA và .FARADATA? Hướng dẫn '=' thường được dùng trong các lệnh gộp. Cú pháp Các hướng dẫn .ERR FARADATA {name} Đây là các hướng dẫn báo lỗi có điều kiện. Để phục vụ cho việc gỡ rối, chúng ta có thể sử hướng dẫn này để buộc chương trình dịch hiển thị một thông báo lỗi khi dịch. Chương trình dịch hiển thị thông báo "Forced error" cùng với một số để nhận biết. Sau đây là các hướng dẫn báo lỗi và các số để nhận biết. FARADATA? {name} Chủ yếu dùng với chương trình dịch để định nghĩa các đoạn dữ liệu phụ. GROUP Cú pháp name GROUP segment [ , segment] GROUP (nhóm) là một tập hợp các đoạn liên kết với nhau thông qua một địa chỉ bắt đầu. Các nhãn và biến định nghĩa trong các đoạn của nhóm được gán cho các địa chỉ tương đối so với điểm bắt đầu của nhóm thay vì so với điểm bắt dầu của đoạn mà chúng dược định nghĩa. Điều nảy tạo ra khả năng có thể tham chiếu tất cả các dữ liệu của nhóm chỉ với việc khởi tạo một thanh ghi đoạn. Chú ý: Ta có thể nhận được kết quả tương tự bàng cách đưa một tên và thuộc tính PUBLIC cho tất cả các đoạn. Các hướng dẫn IF Các hướng dẫn này được sử dụng để cho phép chương trình dịch dịch các dòng lệnh theo sau các hướng dẫn tuý thuộc vào các điều kiện. EVEN INCLUDE Tăng bộ đếm định vị đến địa chỉ chẵn tiếp theo. EXITM Cú pháp Được dùng trong một lệnh gộp hay khối lặp. Báo cho chương trình dịch kết thúc một lệnh gộp hay khối lặp. INCLUDE filespec trong đó filespec xác định một tệp chứa chương trình viết bằng hợp tin (tên tệp kèm theo đường dẫn nếu cần). EXTRN Cú pháp Hướng dẫn báo cho chương trình dịch chèn nội dung của tệp chương trình nói trên tại vị trí của INCLUDE trong tệp nguồn và bắt đầu xử lý các dòng lệnh của tệp này EXTRN name : type[, name : type] 361 362 Ví dụ MACRO và ENOM INCLUDE MACLIB Cú pháp INCLUDE C:\BIN\PROG1.ASM name MACRO { parmeter [ , parameter] } Hướng dẫn dùng để mở đầu và kết thúc định nghĩa một lệnh gộp (macro). LABEL Cú pháp Ví dụ name LABEL type EXCHANGE MACRO WORD1 , WORD2 PUSH WORD1 PUSH WORD2 POP WORD1 POP WORD2 ENDM trong đó type có thể là BYTE, WORD, DWORD, WORD, QWORD, TBYTE hay một tên có cấu trúc đã được xác định trước. Hướng dẫn này cung cắp một phương pháp định nghĩa hay định nghĩa lại kiểu có liên quan đến một tên nào đó. MODEL Ví dụ Cú pháp WORD_ARR LABEL WORD MODEL memory_model BYTE_ARR DB 100 DUP (0) trong đó WORD_ARR định nghĩa là một mảng 50 từ, và BYTE_ARR định nghĩa là một mảng gồm 100 byte. Cả hai biến được gán cho cùng một địa chỉ. Hướng dẫn để định nghĩa một cách đơn giản kiểu bộ nhớ sử dụng trong chương trình. Các kiểu bộ nhớ có thể dùng được liệt kê sau đây: LALL Thông báo cho chương trình dịch liệt kê tất cả các dòng lệnh trong khi mở rộng lệnh gộp trừ khi chúng được viết sau hai dấu chấm nháy liên tiếp. LIST và .XLIST LIST báo cho chương trình dịch gộp cả các dòng lệnh theo sau nó vào trong chương trình nguồn. .XLIST loại bỏ việc gộp các dòng lệnh theo sau nó. ORG LOCAL Cú pháp Cú pháp ORG expression LOCAL name [ , name] trong đó biểu thức (expresaion) phải tương đương với một số hai byte. Hướng dẫn này được dùng bên trong một lệnh gộp. Mỗi lần chương trình dịch gặp một tên (name) khi mở rộng lệnh gộp, nó thay thế tên đó bởi một tên duy nhất có dạng ?? kèm theo các số. Bằng cách này ta tránh được các tên lặp lại khi gọi lệnh gộp vài lần trong một chương trình. 363 Thiết lập bộ đếm định vị với giá trị của biểu thức. Ví dụ, trong một chương trình COM, hướng dẫn ORG loạn thiết lập bộ đếm định vị bằng 100h, như vậy các biến sẽ được gán địa chỉ tính tương đối với điểm bắt đầu của chương trình chứ không phải điểm bắt đầu của đoạn đầu chương trình 364 dài 100 byte. Một cách khác sử dụng ORC là để định nghĩa vùng dữ liệu chung cho nhiều biến. Ví dụ: DATA Hướng dẫn này dửng để nhảy sang trang mới khi in hay xác định số dòng lớn nhất trong một trang và số ký tự lớn nhất trong một dòng của một chương trình nguồn. WORD1 ARR DW 100 DUP (? ) Ví dụ ORG 0 PAGE WORD2 ARR DW 50 DUP (? ) PAGE 50, 70 ; thiết lập chiều dài tối đa của trang WORD3 ARR DW 50 DUP (? ) ; sang trang mới ; là 50, chiều rộng tối đa là 70 Định nghĩa buộc WORD2_ARR và do từ đầu tiên của WORD1_ARR chiếm cùng một cho trong bộ nhớ. Tương tự WORD3_ARR và do từ sau cùng của WORD_ARR cũng chiếm cùng chỗ trong bộ nhớ. PAGE , 132 ; thiết lập chiều rộng tối đa là 132 PROC và ENDP Cú pháp %OUT name PROC distance name ENDP Cú pháp trong đó distance là NEAR hoặc FAR. Ngầm định là NEAR. %OUT text trong đó text là một dòng các ký tự ASCII. Các hướng dẫn này dùng để bắt đầu và kết thúc một định nghĩa thủ Hướng dẫn này dùng để hiển thị một thông báo tại một vị trí xác định trong một văn bản dịch. Hướng dẫn này thường được dùng khi dịch có điều kiện tục. PUBLIC Cú pháp Ví dụ PUBLIC name [, name] : IFNDEF SUM trong đó na me là tên của một biến, nhãn hay một đẳng thức số định nghĩa trong mô đun chứa hướng dẫn PUBLIC. SUM DW ? %OUT SUM is define here ENDIF Nếu SUM chưa được định nghĩa, đó sẽ được định nghĩa ở dây và thông báo được hiển thị. Hướng dẫn nảy dùng để cho phép các tên trong một mô đun có thể sử dụng được trong các mô đun khác. Chú ý không nên nhầm lẫn với kiểu combine PUBLIC dùng để kết hợp các đoạn. PURGE PAGE Cú pháp Cú pháp PURGE macroname [ , macroname] PAGE { { length} , width} trong đó macroname là tên của một lệnh gộp. trong đó length (độ dài) có giá trị 10255; width (độ rộng) có giá trị 60132. Các giá trị ngầm định là length = 50 và width = 80. 365 Hướng dẫn này dùng để xoá các lệnh gộp trong bộ nhớ khi dịch. Điều này có thể cần thiết trong trường hợp hệ thống không có đủ bộ nhớ để lưu giữ mọi lệnh gộp mà chương trình cần tại cùng một thời điểm 366 Ví dụ MAC1 SALL ; mở rộng lệnh gộp MAC1 PURGE MAC1 ; không cần giữ nó trong bộ nhớ nữa. Thông báo cho chương trình dịch loại bỏ danh sách các mở rộng lệnh gộp. RADIX SEGMENT và ENDS Cú pháp Cú pháp RADIX base name SEGMENT { align} { combine} {‘class’ } trong đó base là một số thập phân trong khoảng 216. Hướng dẫn này xác định cơ số mặc định cho các hằng số nguyên. Điều này có nghĩa là khi không có một ký tự "b", "d" hay "h" theo sau một số nguyên thì chương trình dịch bẽ coi bố đó có cơ số định nghĩa tại hướng dẫn. Cơ số ngầm định là 10. align có thể là PARA, BYTE, WORD hay PAGE, combine có thê là PUBLIC, COMMON, STACK hay AT class là một tên bao trong dấu nháy đơn. Hướng dẫn này định nghĩa một đoạn chương trình. Align, combine và class xác định việc xắp xếp của một đoạn trong bộ nhớ: tự kết hợp với các đoạn khác như thế nào, thứ tự của nó với các đoạn còn lại ra sao. Ví dụ DATA RADIX 16 A DW 1101 RADIX 2 B DW 1101 trong đó ;số hex ; được dịch bằng 1101h SEQ Hướng dẫn cho chương trình dịch xắp xếp các đoạn theo thử tự nguyên gốc của nó. Cho cùng kết quả như .ALPHA. ; được dịch bằng 1101b RECORD STACK Hướng dán này dùng để định nghĩa một biến kiểu record. Đây là một byte hay word trong đó một cách hình thức ta có thể truy nhập các trường bit xác định (có thể xem thêm thêm cuốn Microsoft Macro Assembler Programer's Guide). Cú pháp STACK { size} trong đó size là một số nguyên dương. REPT và ENOM Hướng dẫn để định nghĩa đơn giản một đoạn ngăn xếp với kích thước tính bằng byte. Kích thước ngầm định là 1 KB. Cú pháp STRUC và ENDS REPT expression statements ENDM (trong đó expression phải có giá trị của một số không dấu 16 bit). Hướng dẫn này định nghĩa ra một khối lặp. Các dòng lệnh trong khối sẽ được dịch một số lần bằng với giá trị của expression. Chúng ta có thể sử dụng khối lặp để lặp lại các dòng lệnh hay dùng nó trong một lệnh gộp. Hướng dẫn dùng để khai báo một cấu trúc. Đây là một tập hợp các đối tượng dữ liệu mà ta có thể truy nhập chúng như một đối tượng dữ liệu đơn lẻ một cách tượng trưng (có thể xem thêm thêm cuốn Microsoft Macro Abbembler Programer’s Guide). SUBTTL Cú pháp 367 368 SUBTTL { text} Hướng dẫn dùng để đưa một tiêu đề phụ ( dài 160 ký tự) vào dòng thứ ba của mỗi trang trong ván bản chương trình dịch. Hướng dẫn này có thê dùng một hay nhiều lần. TITLE Cú pháp TITLE {text} Hướng dẫn dùng để đưa một tiêu đề vào mỗi trang trong văn bản chương trình dịch. Hướng dẫn này chỉ được dùng một lần. MỤC LỤC Chương 1 các hệ điếm và việc mã hoá thông tin trong máy tính 1. Các hệ đếm dùng trong máy tính. 5 2. Các phép toán số học đối với số hệ hai. 9 3. Mã ASCII mã tiêu chuẩn cho trao đổi thông tin. 16 4. Quan hệ giữa mã ASCII với số BCD 17 Chương 2 Máy tính và hệ vi xử lý XALL 1. Từ máy tính lớn đến máy vi tính 19 Thông báo cho chương trình dịch liệt kê tất cả các dòng lệnh có khả năng tạo ra các mã lệnh trong khi mở rộng lệnh gộp. Các chú thích bị bỏ qua. 2. Sự phát triển của các bộ vi xử lý 21 3. Giới thiệu sơ lược cấu trúc và hoạt động của hệ vi xử lý 24 XCREF Chương 3 Vi xử lý lntel 8088 Xem .CREF XLIST Xem .LIST 1. Giới thiệu cấu trúc bến trong và hoạt động của bộ vi xử lý 8088 27 1.1 BIU và EU 29 1.2. 8088 và 8086 35 2. Cách mã hoá lệnh của bộ vi xử lý 8088 36 3. Các chế độ địa chỉ của bộ vi xử lý 8088 39 4. Mô tả tập lệnh của bộ vi xử lý 8088 44 Chương 4 Lập trình bằng hợp ngữ với 8088 Mở đầu 97 1. Giới thiệu chung của chương trình bằng hợp ngữ 98 1.1 Cú pháp của chương trình hợp ngữ 98 1.2 Dữ liệu cho chương trình 100 1.3. Biến và hằng 101 1.4. Khung của một chương trình hợp ngữ 104 2. Cách tạo và cho chạy một chương trình hợp ngữ trên máy IBM PC 369 370 113 3. Các cấu trúc lặp trình cơ bản thực hiện bằng hợp ngữ 118 Chương 8 Vào/ra dữ liệu bằng DMA 4. Một số chương trình cụ thể 125 5. Vấn đề truyền tham số giữa các chương trình 142 1. Nguyên tắc của việc trao đổi dữ liệu với thiết bị ngoại vi bằng cách thâm nhập trực tiếp vào bộ nhớ (DMA) 2. DMAC 8237A5 trong hệ vi xử lý 8088 2.1. Tín hiệu HOLD và HLDA trong CPU 8088 Chương 5 Tổ chức vào/ra dữ liệu 1. Giới thiệu các tín hiệu của 8088 và các mạch phụ trợ 8284 và 8288 1.1. Các tín hiệu của 8088 1.2. Phân kênh để tách thông tin và đệm cho các bus 1.3. Mạch tạo xung nhịp 8284 4. Mạch điều khiển bus 8288 1.5 Biểu đồ thời gian của các lệnh ghi/đọc 2. Phối ghép 8088 với bộ nhớ 2.1 Bộ nhớ bán dẫn 2.2 Giải mã địa chỉ cho bộ nhớ 2.3. Phối ghép CPU 8088 với bộ nhớ 3. Phối ghép 8088 với thiết bị ngoại vi 3.1 Các kiếu phối ghép vào/ra 3.2. Giải mã địa chỉ cho thiết bị vào/ra 3.3. Các mạch cổng đơn giản 3.4. Mạch phối ghép vào/ra song song lập trình được 8255A 150 150 156 159 161 163 167 167 172 177 185 185 188 188 189 232 235 235 Chương 9 Một số phối ghép cơ bản 1. Phối ghép với bàn phím 250 2. Phối ghép với đèn hiện thị CED 257 3. Phối ghép với màn hình 259 4. Phối ghép thế giới tương tự 274 5. Phối ghép với mạch đếm/định thời gian 8254 275 6. Phối ghép CPU với mạch thông tin nối tiếp 8250 và 8251 289 Chương 10 Các bộ vi xử lý tiên tiến của Intel 1. Giới thiệu chung 308 2. Vấn đề hệ điều hành đa nhiệm hoặc nhiều người sử dụng 309 3. CPU 80286 315 4. CPU 80386/80486 và Pentium 317 Phụ lục A Các ngắt của BIOS và DOS Phụ lục B Các tuỳ chọn của MASM và LINK Phụ lục C Chương trình gỡ rối DEBUG Phụ lục D Các dẫn hướng chương trình dịch MASM 320 335 345 355 Chương 6 Vào ra dữ liệu bằng cách thăm dò 1. Giới thiệu chung về các phương pháp điều khiển vào/ra dữ liệu 200 2. Vào/ra dữ liệu bằng phương pháp thăm dò 201 Chương 7 Ngắt và xử lý ngắt trong hệ vi xử lý 8088 1. Sự cần thiết phải ngắt CPU 2. Ngắt trong vi xứ lý 8088 2.1 Các loại ngắt trong hệ 8088 2.2. Đáp ứng của CPU khi có yêu cầu ngắt 2.3 Xử lý ưu tiên khi ngắt 2.4 Mạch điều khiển ngắt ưu tiên 8259A 205 206 206 208 210 210 371 372 TÀL LIỆU THAM KHẢO 1. Dollgas V. Hall Microprocessors and interfacecing Macmillan/McGrawHill. 1992 2. Muhamad Ali Mazidi, Janice Gillespie Mazidi The 80x86 IBM PC & Compatible computers Chịu trách nhiệm xuất bản: PrenticeHall, 1995 Giám đốc PHẠM VĂN AN 3. Daniel Tabak Tổng biên tập: NGUYỄN NHƯ Ý Advanced Microprocesors McgrawHill. 1995 4. Mohamed Rafiquzzaman Biên tập nội dung: Microprocessors and microcomputerbased system design QUÁCH TUẤN NGỌC CRC Press. 1995 5. Barry B. Bray Trình bầy bìa: Tuấn Ngọc The Intel Microprocessors 32 bit PrenticeHall. 1995 6. Michael Thorne Computer Organizalion and Assembly Language Programming For IBM PC and Compatibles The BenjaminCummings Publishing Company, Inc. 1991 In 1000 cuốn tại Công ty in khoa học kĩ thuật Giấy phép xuất bản số 285/CXB172 do Cục xuất bản cấp ngày 21/411997 In xong và nộp lưu chiểu 5/10/1997 373 374 ... lý Giáo trình Kỹ thuật vi xử lý thông qua vi xử lý 8086/88 mạch liên quan Intel cung cấp cho sinh vi n khái niệm chủ yếu hệ vi xử lý 16 bit: cấu trúc nguyên tắc hoạt động hệ vi xử lý gồm CPU mạch... CHƯƠNG BỘ VI XỬ LÝ INTEL 8088 Sau tìm hiểu qua cấu trúc hệ vi xử lý, chương ta sâu tìm hiểu vi xử lý cụ thể điển hình: vi xử lý 8088 Intel Trước hết cần nói rõ lý ta lại chọn đích danh vi xử lý 8088... nhiều vi mạch phụ trợ tạo nên hệ vi xử lý hoàn chỉnh 2.2 Thế hệ (1974 - 1977) Các vi xử lý đại diện hệ lả vi xử lý bit 6502 MOS Technology 6800 6809 Motorola, 8080 8085 Intel đặc biệt vi xử lý