KĨ THUẬT VI XỬ LÍ

187 197 0
KĨ THUẬT VI XỬ LÍ

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 59­45 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ừ  200­204H.  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 MAX­10  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ị 10­255; width (độ rộng) có giá trị  60­132. 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  2­16.  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 1­60 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 8237A­5 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/McGraw­Hill. 1992  2. Muhamad  Ali Mazidi, Janice Gillespie Mazidi  The 80x86 IBM PC & Compatible computers  Chịu trách nhiệm xuất bản:  Prentice­Hall, 1995  Giám đốc PHẠM VĂN AN  3. Daniel Tabak  Tổng biên tập: NGUYỄN NHƯ Ý  Advanced Microprocesors  Mcgraw­Hill. 1995  4. Mohamed Rafiquzzaman  Biên tập nội dung:  Microprocessors and microcomputer­based 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  Prentice­Hall. 1995  6. Michael Thorne  Computer  Organizalion  and  Assembly  Language  Programming  For  IBM PC and Compatibles  The Benjamin­Cummings 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/CXB­172 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ý

Ngày đăng: 09/10/2017, 12:37

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan