Giáo trình Hợp ngữ
Các thanh ghi thông dụng:
Bao gồm 4 thanh ghi. Mỗi thanh ghi đều có những chức năng riêng mặc dù
chúng cũng là những nơi lưu trữ những kết quả trung gian:
AX là thanh ghi 16 bit gọi là thanh ghi tích lũy (Accumulator) sử dụng khi
thực hiện các phép tính số học.
BX là thanh ghi 16 bit gọi là thanh ghi nền (Base register)
CX là thanh ghi 16 bit gọi là thanh ghi đếm (Counter)
DX là thanh ghi 16 bit gọi là thanh ghi dữ liệu (Data)
Nên biết rằng mỗi thanh ghi này đều có thể phân ra làm hai thanh ghi 8 bit sử
dụng riêng rẽ được:
AX = AH và AL;
BX = BH và BL;
CX = CH và CL;
DX = DH và DL.
Cũng nên nhớ rằng những phép toán thực hiện với các thanh ghi luôn nhanh
khi chúng thực hiện với các ô nhớ trong bộ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hợp ngữ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Giáo trình Hợp ngữ
TRƯỜNG ĐẠI HỌC ĐÀ LẠT F 7 G GIÁO TRÌNH HỢP NGỮ NGUYỄN HỮU LỘC 2002 Hợp Ngữ - 2 - MỤC LỤC LỜI MỞ ĐẦU ..................................................................................................................... 4 CHƯƠNG 1: GIỚI THIỆU CHUNG ................................................................................... 5 I. CÁC THANH GHI TRONG VI XỬ LÝ HỌ INTEL:................................................... 5 1. Các thanh ghi thông dụng: ....................................................................................... 6 2. Các thanh ghi phân đoạn ......................................................................................... 7 3. Các thanh ghi chỉ mục và con trỏ:............................................................................ 7 4. Thanh ghi trạng thái (FLAG) ................................................................................... 8 II. ĐỊA CHỈ Ô NHỚ: ....................................................................................................... 8 III. MỘT SỐ LỆNH CƠ BẢN: ........................................................................................ 9 CHƯƠNG 2: GỌI NGẮT VÀ TRÌNH DEBUG..................................................................11 I. CÁC LỆNH GỌI NGẮT: ...........................................................................................11 II. TRÌNH DEBUG:........................................................................................................12 III. VÀI CHƯƠNG TRÌNH ỨNG DỤNG :.....................................................................15 CHƯƠNG 3: HỢP NGỮ DÙNG TRONG PC.....................................................................19 I. DÒNG LỆNH:.............................................................................................................19 II. DỮ LIỆU:...................................................................................................................20 1. Hằng: ......................................................................................................................20 2. Biến: .......................................................................................................................21 III. CẤU TRÚC CHƯƠNG TRÌNH:...............................................................................22 CHƯƠNG 4: PHƯƠNG PHÁP LẬP TRÌNH......................................................................27 I. TỔNG QUAN: ............................................................................................................27 II. CÁC LỆNH LIÊN QUAN ĐẾN RẼ NHÁNH:...........................................................27 1. Các lệnh rẽ nhánh có điều kiện: ............................................................................28 2. Các lệnh rẽ nhánh không điều kiện: ......................................................................29 III. CÁC CẤU TRÚC ĐIỀU KHIỂN:.............................................................................29 CHƯƠNG 5: NGĂN XẾP VÀ THỦ TỤC ..........................................................................38 I. NGĂN XẾP: ................................................................................................................38 II. THỦ TỤC: .................................................................................................................38 III. SỬ DỤNG PTR VÀ LABEL: ...................................................................................40 IV. VÀI CHƯƠNG TRÌNH ỨNG DỤNG:......................................................................41 1. Hiện số thập phân: ..................................................................................................41 2. Hiện số nhị phân và thập lục phân..........................................................................44 3. Đọc từ bàn phím......................................................................................................46 Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 3 - CHƯƠNG 6: MOĐUN CHƯƠNG TRÌNH & CÁC KIỂU ĐỊNH VỊ ĐỊA CHỈ .............51 I. MOĐUN CHƯƠNG TRÌNH .......................................................................................51 1. Định hướng biên dịch extrn.....................................................................................51 2. Định hướng biên dịch public ...................................................................................52 3. Lập thư viện - tạo vĩ lệnh (macro) .........................................................................54 II. CÁC KIỂU ĐỊNH VỊ ĐỊA CHỈ..................................................................................56 III. CHƯƠNG TRÌNH ỨNG DỤNG...............................................................................60 IV. TẠO TẬP TIN .COM ...............................................................................................67 1- Dạng của một chương trình COM...........................................................................68 2- Ưùng dụng tập tin .com ............................................................................................69 CHƯƠNG 7: SỬ DỤNG PHÂN ĐOẠN TOÀN PHẦN.....................................................76 I- SỬ DỤNG CÁC ĐỊNH HƯỚNG BIÊN DỊCH............................................................76 1. Segment ..................................................................................................................76 2. Định hướng biên dịch assume.................................................................................79 II - DẠNG CỦA CHƯƠNG TRÌNH .EXE SỬ DỤNG TRONG CÁC PHƯƠNG PHÁP CŨ: .................................................................................................................................79 III- VÍ DỤ CHƯƠNG TRÌNH COM..............................................................................83 CHƯƠNG 8: CHƯƠNG TRÌNH ỨNG DỤNG ..................................................................85 I. IN NỘI DUNG VĂN BẢN RA MÁY IN: ...................................................................85 1. Sử dụng hàm 40h ngắt 21h (DOS) để thực hiện......................................................85 2. Sử dụng hàm 01h ngắt 17h (ROMBIOS) ................................................................85 II. ĐẾM SỐ TỪ TRONG MỘT TẬP TIN ......................................................................86 III- ĐỔI NGƯỢC CHUỖI.............................................................................................89 IV. CHƯƠNG TRÌNH HIỂN THỊ THỜI GIAN .............................................................90 V. CHƯƠNG TRÌNH THƯỜNG TRÚ BỘ NHỚ............................................................97 Phụ lục A: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS.......................................105 Phụ lục B: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA ROM-BIOS............................108 TÀI LIỆU THAM KHẢO.................................................................................................110 Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 4 - LỜI MỞ ĐẦU Hợp ngữ là một môn học dành cho sinh viên các chuyên ngành kỹ thuật. Là một ngôn ngữ can thiệp sâu vào hệ thống máy tính, hợp ngữ thường được sử dụng trong những phần việc tương đối tinh tế như điều khiển hệ thống, vi điều khiển ... Tuy vậy với những người lần đầu tiên làm quen với ngôn ngữ này, việc tiếp thu quả thật rất khó khăn bởi lẽ ngôn ngữ này gần với ngôn ngữ máy và sử dụng các ký tự gợi nhớ nên khó hiểu hơn sử dụng các ngôn ngữ cấp cao như Pascal, C..v.v...Ngoài ra, người học không những phải biết phần mềm mà còn phải hiểu phần cứng ở mức độ nào đó nữa. Điều này tạo ra một áp lực rất lớn gây khó khăn cho người học. Trong nhiều năm giảng dạy môn này, tôi nhận thấy hiện có rất nhiều sách, tài liệu tham khảo viết về hợp ngữ song để có một tài liệu đáp ứng yêu cầu của sinh viên trong việc tiếp thu môn hợp ngữ tuần tự từ dễ đến khó có phương pháp thì thật hiếm. Do vậy tôi thực hiện giáo trình này với mong ước có một tài liệu đáp ứng yêu cầu trên. Trong giáo trình, tôi có đưa vào rất nhiều ví dụ và ứng dụng từ thấp đến cao để sinh viên có thể tiếp thu dễ dàng môn học này. Tuy vậy tài liệu này không sao tránh khỏi những sai sót, rất mong các đồng nghiệp, sinh viên và bạn đọc góp ý Hoàn thành giáo trình này, tôi xin chân thành cám ơn đến các đồng nghiệp trong Khoa Vật lý Trường Đại học Dalat đã động viên, góp ý và tạo điều kiện cho tôi trong quá trình thực hiện. Tôi cũng xin ghi nhận sự đóng góp của nhiều thế hệ sinh viên khoa vật lý, khoa toán - tin để giáo trình này được sắp xếp ngày càng dễ hiểu và hợp lý hơn. Nguyễn Hữu Lộc Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 5 - CHƯƠNG 1: GIỚI THIỆU CHUNG Tại sao chúng ta phải học lập trình với hợp ngữ trong khi hiện nay có rất nhiều ngôn ngữ cấp cao như C hoặc Pascal dùng để lập trình dễ dàng hơn? Có thể nói có nhiều câu trả lời cho câu hỏi này. Nhưng ban đầu, chúng ta có thể xét đối với hợp ngữ thì mỗi lệnh tương ứng với một lệnh ngôn ngữ máy. Nói cách khác, nếu mỗi dòng lệnh trong chương trình là một lệnh hợp ngữ và một từ máy tương ứng với một lệnh máy như vậy n dòng trong chương trình sẽ tạo ra một chương trình máy gồm n từ. Như vậy hợp ngữ có thể xem là ngôn ngữ rất gần với ngôn ngữ máy, chúng ta có thể tiếp cận đến tất cả các ngóc ngách của máy và quan trọng hơn là chúng ta thực hiện chương trình viết bằng hợp ngữ nhanh hơn so với viết bằng những ngôn ngữ cấp cao khác. Tuy vậy cũng cần thấy rằng rất nhiều ngôn ngữ cấp cao hổ trợ giao diện với hợp ngữ, nói cách khác là chúng ta có thể viết 1 đoạn hợp ngữ trong chương trình viết bằng ngôn ngữ cấp cao như C hoặc Pascal... Điều này cho phép chúng ta lập trình hiệu quả hơn với những phần việc sát với hệ thống và đòi hỏi thời gian nhanh. Trong kiến trúc máy tính nhiều cấp, việc chuyển một chương trình của người sử dụng từ một ngôn ngữ này sang chương trình dùng ngôn ngữ khác gọi là chương trình dịch. Ngôn ngữ sử dụng để viết chương trình ban đầu gọi là ngôn ngữ nguồn còn ngôn ngữ sau khi dịch gọi là ngôn ngữ đích. Người ta phân biệt các chương trình dịch ra làm hai loại tùy theo mối quan hệ giữa ngôn ngữ nguồn và ngôn ngữ đích. Khi ngôn ngữ nguồn gồm những ký tự gợi nhớ lệnh của ngôn ngữ máy thì chương trình dịch sẽ gọi là hợp dịch (assembler) và ngôn ngữ nguồn là hợp ngữ (assembly language). Trong khi đó ngôn ngữ nguồn là ngôn ngữ cấp cao như C hoặc Pascal thì chương trình dịch sẽ gọi là biên dịch. I. CÁC THANH GHI TRONG VI XỬ LÝ HỌ INTEL: Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 6 - Bộ vi xử lý 8088 có thể địa chỉ hóa đến 220 byte bắt đầu từ địa chỉ 0. Những lệnh của 8088 có thể thực hiện với những từ 8 bit hay byte cũng như với những từ 16 bits. 8088 sử dụng những địa chỉ 20 bits để truy cập đến 220 byte ô nhớ. Vì các thanh ghi có chiều dài là 16 bits nên các địa chỉ dùng 20 bits sẽ có khó khăn trong thực hiện. Để giải quyết vấn đề này, những nhà sản xuất bộ vi xử lý đã sử dụng 4 thanh ghi phân đoạn (một dùng cho lệnh, một cho dữ liệu, một cho ngăn xếp và một dự trữ) Những thanh ghi có thể xem là những ô nhớ nằm bên trong bộ vi xử lý có thời gian truy xuất cao, với 8088, chúng ta có 14 thanh ghi chia ra làm 4 loại: - Các thanh ghi làm việc; - Các thanh phân đoạn; - Các thanh ghi bước nhảy (offset); - Thanh ghi trạng thái (Cờ: FLAG) 1. Các thanh ghi thông dụng: Bao gồm 4 thanh ghi. Mỗi thanh ghi đều có những chức năng riêng mặc dù chúng cũng là những nơi lưu trữ những kết quả trung gian: AX là thanh ghi 16 bit gọi là thanh ghi tích lũy (Accumulator) sử dụng khi thực hiện các phép tính số học. BX là thanh ghi 16 bit gọi là thanh ghi nền (Base register) CX là thanh ghi 16 bit gọi là thanh ghi đếm (Counter) DX là thanh ghi 16 bit gọi là thanh ghi dữ liệu (Data) Nên biết rằng mỗi thanh ghi này đều có thể phân ra làm hai thanh ghi 8 bit sử dụng riêng rẽ được: AX = AH và AL; BX = BH và BL; CX = CH và CL; DX = DH và DL. Cũng nên nhớ rằng những phép toán thực hiện với các thanh ghi luôn nhanh khi chúng thực hiện với các ô nhớ trong bộ nhớ. Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 7 - 2. Các thanh ghi phân đoạn Gồm 4 thanh ghi: CS viết tắt từ "Code Segment", là nơi lưu trữ địa chỉ của phân đoạn bộ nhớ tại đó các lệnh trong chương trình nạp vào (mã máy). DS viết tắt từ "Data Segment", là nơi lưu trữ địa chỉ của phân đoạn bộ nhớ tại đó đặt dữ liệu (data) của chương trình. SS viết tắt từ "Stack Segment", là nơi lưu trữ địa chỉ của phân đoạn ngăn xếp. ES viết tắt từ "Extra Segment", là nơi lưu trữ địa chỉ của phân đoạn dự trữ thường dùng ghi giữ dữ liệu. 3. Các thanh ghi chỉ mục và con trỏ: Các thanh ghi này giữ giá trị bước nhảy (offset ) kết hợp với địa chỉ phân đoạn. Tổng cộng có 5 thanh ghi: SI viết tắt từ "Source Index". Thanh ghi này là thanh ghi 16 bit sử dụng khi thực hiện các phép toán với chuỗi (dãy ký tự); thường được dùng kết hợp với thanh ghi phân đoạn DS. DI viết tắt từ "Destination Index". Thanh ghi này cũng là thanh ghi 16 bit sử dụng khi thực hiện các phép toán với chuỗi (dãy ký tự); thường được dùng kết hợp với thanh ghi phân đoạn DS. Tuy nhiên trong trường hợp chuyển chuỗi thì nó sẽ kết hợp với thanh ghi phân đoạn ES. BP hoặc "Base Pointer". Thanh ghi 16 bit này kết hợp với thanh ghi phân đoạn SS (SS:BP) để đưa dữ liệu vào trong ngăn xếp khi gọi chương trình con (CALL) SP hoặc "Stack Pointer". Thanh ghi 16 bit này cũng kết hợp với thanh ghi phân đoạn SS (SS:SP) để chỉ ra phần tử cuối của ngăn xếp. IP gọi là con trỏ lệnh (Instruction Pointer). Thanh ghi 16 bit này kết hợp với thanh ghi phân đoạn CS (CS:IP) để chỉ đến lệnh tiếp theo sẽ thực hiện. Nội dung của Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 8 - thanh ghi này không thể thay đổi trực tiếp; nó chỉ bị thay đổi một cách gián tiếp thông qua các lệnh nhảy bước, qua các chương trình con và qua các ngắt. 4. Thanh ghi trạng thái (FLAG) Thanh ghi trang thái là ... ng trình được tiến hành như sau: sau khi thiết lập con trỏ và các vectơ ngắt, thủ tục MAIN đợi 1 phím nhấn. Khi ấy thủ tục ngắt TIME_INT cập nhật thời gian mới mỗi khi có xung nhịp của mạch thời gian. Sau khi một phím được nhấn, vectơ cũ được phục hồi và chương trình kết thúc. Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 95 - PGM2_1.ASM EXTRN GET_TIME:NEAR, SETUP_INT:NEAR .MODEL SMALL .STACK 100H .DATA TIME_BUF DB '00:00:00$' CURSOR_POS DW ? NEW_VEC DW ?,? OLD_VEC DW ?,? ; .CODE MAIN PROC MOV AX,@DATA MOV DS,AX ;Khởi tạo DS ;cất vị trí con trỏ MOV AH,3 MOV BH,0 ;trang 0 INT 10H MOV CURSOR_POS,DX; cất vị trí con trỏ ;thiết lập thủ tục ngắt bằng cách ; đưa segment:offset của TIME_INT vào NEW_VEC MOV NEW_VEC, OFFSET TIME_INT MOV NEW_VEC+2,SEG TIME_INT LEA DI, OLD_VEC ;DI trỏ đến bộ đệm vectơ LEA SI, NEW_VEC ;SI trỏ đến vectơ mới MOV AL,1CH ; ngắt thời gian CALL SETUP_INT ; thiết lập vectơ mới ; đọc bàn phím MOV AH,0 INT 16H ;phục hồi vectơ ngắt cũ LEA DI,NE_VEC LEA SI,OLD_VEC Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 96 - MOV AL,1CH CALL SETUP_INT ;trở về DOS MOV AH,4CH INT 21H MAIN ENDP ; TIME_INT PROC ;thủ tục ngắt ;kích hoạt bởi mạch thời gian PUSH DS; cất giá trị tức thời của DS MOV AX,@DATA MOV DS,AX ;DS trỏ đến đoạn dữ liệu ;lấy thời gian mới LEA BX, TIME_BUF ; BX trỏ đến bộ đệm ;thời gian CALL GET_TIME ; cất thời gian trong bộđệm ;hiển thị thời gian LEA DX,TIME_BUF MOV AH,09H INT 21H ;phục hồi vị trí con trỏ MOV AH,2 MOV BH,0 MOV DX,CURSOR_POS INT 10H IRET TIME_INT ENDP ; END MAIN Lệnh LINK gồm các mođun PGM2_1.ASM, PGM1_2.ASM, PGM2_2.ASM Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 97 - V. CHƯƠNG TRÌNH THƯỜNG TRÚ BỘ NHỚ. Cũng vẫn hiển thị giờ nhưng bây giờ là ở thường trú trong bộ nhớ (terminate and stay resident) Thông thường khi kết thúc một chương trình, bộ nhớ mà nó chiếm giữ được DOS sử dụng để nạp chương trình khác. Tuy nhiên khi một chương trình TSR kết thúc, bộ nhớ không bị thu hồi lại. Chính vì thế một chương trình TSR còn được gọi là chương trình thường trú bộ nhớ (memory resident program) Để trở về DOS, một chương trình TSR kết thúc bằng cách sử dụng ngắt 27h hay ngắt 21h (hàm 31h) Chúng ta sẽ tạo một chương trình .COM vì để sử dụng ngắt 27h chúng ta cần xác định số byte được ở lại thường trú trong bộ nhớ. Cấu trúc của một chương trình .COM khiến việc tính toán dễ dàng hơn vì nó chỉ có một phân đoạn chương trình. Một khi muốn kết thúc hoàn toàn nghĩa là chương trình TSR không hoạt động. Chương trình này phải được kích hoạt bởi các tác động ngoài như một tổ hợp phím nào đó (Ví dụ:Ctrl+Shift). Ưu điểm của chương trình thường trú là chúng có thể được kích hoạt khi đang chạy một chương trình nào khác. Chương trình gồm 2 phần: Phần khởi tạo thiết lập vectơ ngắt và phục vụ ngắt Tập tin PGM3_1.ASM EXTRN MAIN:NEAR, SETUP_INT:NEAR EXTRN NEW_VEC:DWORD, OLD_VEC:DWORD PUBLIC INITIALIZE Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 98 - C_SEG SEGMENT PUBLIC ASSUME CS:C_SEG INITIALIZE PROC ;thiết lập vectơ ngắt MOV NEW_VEC,OFFSET MAIN; lưu địa chỉ MOV NEW_VEC+2,CS LEA DI, OLD_VEC ; DI trỏ về vectơ cũ LEA SI, NEW_VEC ; SI trỏ về vectơ mới MOV AL,09H ;ngắt bàn phím CALL SETUP_INT ; thiết lập vectơ ngắt ;trở về DOS LEA DX, INITIALIZE INT 27H ; Kết thúc và ở lại thường trú INITIALIZE ENDP C_SEG ENDS END INITIALIZE Cách đơn giản để nhận biết các phím điều khiển là kiểm tra các cờ phím (hàm 2- ngắt 16h). Chúng ta sẽ sử dụng tổ hợp phím Ctrl và Shift phải để kích hoạt và kết thúc sự hiển thị đồng hồ. Khi kích hoạt, thời gian hiện tại sẽ được hiển thị tại góc phải trên của màn hình . Đầu tiên phải chép lại dữ liệu màn hình để sau khi kết thúc hiển thị đồng hồ ta có thể phục hồi lại màn hình cũ. Thủ tục SET_CURSOR thiết lập vị trí con trỏ tại hàng 0 và cột trong DL Thủ tục SAVE_SCREEN chép dữ liệu màn hình vào bộ đệm Thủ tục RESTOR_SCREEN trả lại dữ liệu cho bộ đệm màn hình Tập tin PGM3_2.ASM EXTRN SS_BUF:BYTE PUBLIC SAVE_SCREEN,RESTOR_SCREEN, SET_CURSOR C_SEG SEGMENT PUBLIC ASSUME CS:C_SEG Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 99 - ; SAVE_SCREEN PROC ;lưu giữ 8 ký tự ở góc phải trên của màn hình LEA DI,SS_BUF ; Bộ đệm màn hình MOV CX,8 MOV DL,72 ;cột 72 CLD ; xoá DF cho thao tác chuỗi SS_LOOP: CALL SET_CURSOR;thiết lập con trỏ MOV AH,08H ; đọc ký tự trên màn hình INT 10H ;AH=thuộc tính/AL=ký tự STOSW ; cất ký tự và thuộc tính INC DL ; cột tiếp theo LOOP SS_LOOP RET SAVE_SCREEN ENDP ; RESTOR_SCREEN PROC ;phục hồi màn hình đã cất LEA SI,SS_BUF ;SI trỏ đến bộ đệm MOV DI,8 ;lặp 8 lần MOV DL,72 ;cột 72 MOV CX,1 ; mỗi lần 1 ký tự RS_LOOP: CALL SET_CURSOR ;di chuyển con trỏ LODSW ;AL=ký tự/AH=thuộc tính MOV BL,AH MOV AH,9 ; viết ký tự và thuộc tính MOV BH,0 ;trang 0 INT 10h INC DL ;vị trí ký tự tiếp theo DEC DI JG RS_LOOP RET Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 100 - RESTOR_SCREEN END ; SET_CURSOR PROC ;chuyển con trỏ đến hàng 0, cột DL ; vào DL=số hiệu cột MOV AH,2 MOV BH,0 MOV DH,0 INT 10H SET_CURSOR END ; C_SEG ENDS END Bây giờ chúng ta đã sẵn sàng để viết thường trình ngắt. Để xác định xem sự hiển thị thời gian có được kích hoạt hay không ta sử dụng cờ biến đổi được ON_FLAG. Cờ này được thiết lập bằng 1 khi thời gian được hiển thị. MAIN là thủ tục ngắt Tập tin PGM3_3.ASM ;chương trình thường trú bộ nhớ chỉ thời gian ; kích hoạt bằng tổ hợp phím Ctrl+Shift phải EXTRN INITIALIZE:NEAR,SAVE_SCREEN:NEAR EXTRN RESTOR_SCREEN:NEAR,SET_CURSOR:NEAR EXTRN GET_TIME:NEAR PUBLIC MAIN PUBLIC NEW_VEC,OLD_VEC,CURSOR_POS C_SEG SEGMENT ASSUME CS:C_SEG, DS:C_SEG, SS:C_SEG ORG 100H START: JMP MAIN ; Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 101 - SS_BUF DB 16DUP(?) ;bộ đệm lưu giữ màn hình TIME_BUF DB '00:00:00$' CURSOR_POS DW ? ;vị trí con trỏ ON_FLAG DB 0 ;1=chạy thủ tục ngắt NEW_VEC DW ?,? ; chứa vectơ mới OLD_VEC DW ?,? ;chứa vectơ cũ ; MAIN PROC ;thủ tục ngắt ; cất các thanh ghi PUSH DS PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV AX,CS ;thiết lập DS MOV DS,AX MOV ES,AX ;Gọi thủ tục ngắt bàn phím cũ PUSHF CALL INITIALIZE ;lấy các cờ bàn phím MOV AX,CS ;thiết lập lại DS MOV DS,AX MOV ES,AX ;ES cho phân đoạn hiện hành MOV AH,02 ; xem cờ bàn phím INT 16H ;AL chứa các cờ bàn phím TEST AL,1 ; Shift phải? JE I_DONE ; không, thoát TEST AL,100B ;Ctrl? JE I_DONE ;không, thoát Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 102 - ;đúng, xử lý CMP ON_FLAG,1;thủ tục đang được kích hoạt? JE RESTOR ;đúng, khử kích hoạt MOV ON_FLAG,1 ;không, kích hoạt ;cất vị trí con trỏ và thông tin màn hình MOV AH,03 ;lấy vị trí con trỏ MOV BH,0 ;trang 0 INT 10H ;DH=hàng,DL=cột MOV CURSOR_POS,DX ;lưu vị trí con trỏ CALL SAVE_SCREEN ;lưu màn hình ; hiển thị thời gian ; định vị con trỏ đến góc trên bên phải MOV DL,72 ; cột 72 CALL SET_CURSOR LEA BX,TIME_BUF CALL GET_TIME ; lấy thời gian hiện tại ;hiển thị thời gian LEA SI,TIME_BUF MOV CX,8 ; 8ký tự MOV BH,0 ; trang 0 MOV AH,0EH ; viết ký tự M1: LODSB ;ký tự trong AL INT 10H ;con trỏ được chuyển ; đến hàng tiếp theo LOOP M1 ; lặp lại 8 lần JMP RES_CURSOR RESTOR: ;phục hồi màn hình MOV ON_FLAG,0 ;xoá cờ CALL RESTOR_SCREEN ;phục hồi vị trí con trỏ lưu trữ RES_CURSOR: MOV AH,02 ;thiết lập con trỏ Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 103 - MOV BH,0 MOV DX,CURSOR_POS INT 10H ;phục hồi các thanh ghi I_DONE: POP DI POP SI POP DX POP CX POP BX POP AX POP ES POP DS IRET ;trở về từ ngắt MAIN ENDP C_SEG ENDS END START Tập tin PGM3_4.ASM PUBLIC GET_TIME,SETUP_INT C_SEG SEGMENT PUBLIC ASSUME CS:C_SEG ; GET_TIME PROC MOV AH,2CH INT 21H MOV AL,CH CALL CONVERT MOV [BX],AX MOV AL,CL CALL CONVERT MOV [BX+3],AX MOV AL,DH CALL CONVERT MOV [BX+6],AX Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 104 - RET GET_TIME ENDP ; CONVERT PROC MOV AH,0 MOV DL,10 DIV DL OR AX,0303H RET CONVERT ENDP ; SETUP_INT PROC MOV AH,35H INT 21H MOV [DI],BX MOV [DI+2],ES MOV DX,[SI] PUSH DS MOV DS,[SI+2] MOV AH,25H INT 21H POP DS RET SETUP_INT ENDP ; C_SEG ENDS END LINK PGM3_3+PGM3_2+PGM3_4+PGM3_1. Chú ý PGM3_1 được liên kết cuối cùng để thủ tục INITIALIZE được đưa vào cuối chương trình. Viết các chương trình TSR rất phức tạp, nếu như đã có một chương trình TSR khác trong hệ thống, chương trình hiện có có thể không còn thực hiện đúng nữa Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 105 - PHỤ LỤC A: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS Chức năng Ngắt (Hex) TG vào Kết thúc chương trình 20 Kết thúc nhưng nằm thường trực (max 64KB) 27 DS:DX=địachỉ byte sau vùng được giữ lại thường trú CÁC CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS (NGẮT 21h) Chức năng Số (Hex) TG vào TG ra Đưa vào từ bàn phím 01 AH=01 AL=ký tự vào 8 bit Đưa ra màn hình một ký tự 02 AH=02 DL=ký tự ra 8 bit Đưa ra máy in 05 AH=05 DL=ký tự Đưa vào trực tiếp từ bàn phím và không hiện 07 AH=07 AL=ký tự vào 8 bit Đưa ra màn hình một chuỗi 09 AH=09 DS:DX = trỏ đến chuỗi kết thúc bằng '$' Đưa vào đệm bàn phím 0A AH=0A DS:DX=trỏ đến đệm bàn phím Thiết lập vectơ ngắt 25 AH=25 AL= số hiệu ngắt DS:DX= trỏ tới chương trình xử lý ngắt Lấy ngày tháng năm 2A AH=2A AL=thứ trong tuần CX=năm (1980-2099 DH=tháng DL=ngày Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 106 - Nguyễn Hữu Lộc Khoa Vật Lý Chức năng Số (Hex) TG vào TG ra Đặt ngày tháng năm 2B AH=2B CX=năm (1980-2099 DH=tháng DL=ngày AL=mã trả về Lấy thời gian 2C AH=2C CL=phút CH=giờ DL=phần trăm giây DH=giây Đặt thời gian 2D AH=2D CL=phút CH=giờ DL=phần trăm giây DH=giây Kết thúc chương trình và thường trú 31 AH=31 AL=mã trả về DX=địa chỉ đoạn chương trình trên bộ nhớ để giải phóng AX=mã trả về Lấy vectơ ngắt 35 AH=35 AL=số hiệu ngắt ES:BX=vectơ ngắt AX=mã trả về Tạo thư mục 39 AH=39 DS:DX = trỏ đến chuỗi ASCII tên đường Nếu sai CF=01, AX= mã lỗi Nếu tốt: CF=00 Xoá thư mục 3A AH=3A DS:DX = trỏ đến chuỗi ASCII tên đường Nếu sai CF=01, AX= mã lỗi Đổi thư mục hiện thời 3B AH=3B DS:DX = trỏ đến chuỗi ASCII tên đường Nếu sai CF=01, AX= mã lỗi Tạo file 3C AH=3C CX=đặc tính file DS:DX= trỏ đến AX=thẻ file hoặc mã trả về CF=00 (tốt), 01 (sai) Hợp Ngữ - 107 - Nguyễn Hữu Lộc Khoa Vật Lý Chức năng Số (Hex) TG vào TG ra chuỗi ASCII tên file Mở thẻ 3D AH=3D CX=mã truy nhập DS:DX = trỏ đến chuỗi ASCII tên file AX=thẻ file hoặc mã trả về Đóng thẻ 3E AH=3E BX=thẻ file AX=thẻ file hoặc mã trả về Đọc file hoặc từ thiết bị 3F AH=3F BX=thẻ file CX=số byte cần đọc DS:DX= trỏ đến vùng đệm dữ liệu AX=số byte đọc được hoặc mã trả về Ghi file hoặc ra thiết bị 40 AH=40 BX=thẻ file CX=số byte cần ghi DS:DX= trỏ đến vùng đệm dữ liệu AX=số byte ghi được hoặc mã trả về Xoá file 41 AH=41 DS:DX = trỏ đến chuỗi ASCII tên file Nếu sai CF=01, AX= mã trả về Kết thúc quá trình 4C AH=4C AL= mã trả về Đổi tên file 56 AH=56 DS:DX = trỏ đến chuỗi ASCII tên cũ ES:DI = trỏ đến chuỗi ASCII tên mới Nếu sai CF=01, AX= mã trả về Hợp Ngữ - 108 - PHỤ LỤC B: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA ROM- BIOS Chức năng Ngắt (Hex) TG vào TG ra Di chuyển con trỏ 10 AH=2 BH=số hiệu trang DH=số hiệu dòng DL=số hiệu cột Lấy vị trí con trỏ 10 AH=3 BH=số hiệu trang DH=số hiệu cột DL=số hiệu dòng CH=dòng quét đầu của con trỏ CL=dòng quét cuối của con trỏ Đọc một ký tự và thuộc tính 10 AH=8 BH=trang màn hình AH=thuộc tính AL=ký tự Ghi 1 ký tự 10 AH=0E AL=ký tự BL=màu trong kiểu đồ thị Đọc một cung 13 AH=02 AL= số cung CH=rãnh CL=cung DL=ổ đĩa ES:BX=con trỏ đến đệm CF=báo kết quả tốt/hỏng AH=mã trạng thái AL=số cung được đọc Ghi một cung 13 AH=03 AL= số cung CH=rãnh CL=cung DL=ổ đĩa ES:BX=con trỏ đến đệm CF=báo kết quả tốt/hỏng AH=mã trạng thái AL=số cung được ghi Nguyễn Hữu Lộc Khoa Vật Lý Hợp Ngữ - 109 - Nguyễn Hữu Lộc Khoa Vật Lý Chức năng Ngắt (Hex) TG vào TG ra Lấy các tham số hiện thời của ổ đĩa 13 AH=08 DL=số hiệu đĩa DL=số ổ đĩa DH=số lượng mặt max CL[0,5]=số hiệu cung max CL[6,7]=2 bit cao của số lượng từ trụ max CH=ca'c bit thấp của số lượng từ trụ max CF=cờ báo kết quả tốt/hỏng AH=mã trạng thái Đọc ký tự tiếp từ bàn phím 16 AH=00 AH=mã quét bàn phím AL=mã ASCII Lấy cờ bàn phím 16 AH=02 AL=cờ các phím bit 0=1: Shift phải bit 1=1: Shift trái bit 2=1: Ctrl bit 3=1: Alt bit 4=1: Scroll lock bit 5=1: Num Lock bit 6=1:Caps lock bit 7=1: Chế độ chèn Gửi một byte ra máy in 17 AH=00 AL=ký tự DX=số máy in Giá trị các bit: 0: quá thời gian 1: không sử dụng 2: không sử dụng 3=1:lối vào/ra 4=1: đã được chọn 5=1:hết giấy 6=1:xác nhận 7=1:không bận Hợp Ngữ - 110 - TÀI LIỆU THAM KHẢO 1. Ngôn ngữ lập trình Assembly và máy vi tính IBM-PC - Ytha Yu và Charles Marut (Quách Tuấn Ngọc-Đỗ Tiến Dũng- Nguyễn Quang Khải biên dịch) - Nhà xuất bản Giáo dục 2. Lập trình Hợp ngữ Turbo Assembler 2.0 - Phan Trương Dần - Nhà xuất bản Giáo dục 3. Cẩm nang lập trình - Peter Norton (Nguyễn Minh San dịch) - Nhà xuất bản Giáo Dục 4. Cẩm nang cho người lập trình trên máy vi tính IBM- Peter Norton - Nhà xuất bản Thống kê - Viện Điện tử - Tin học 5. Assembleur facile - PhMercier- Marabout 6. Hardware Reference Manual 8088 - Intel 7. Macro Assembler Programmer's Guide 5.0 - Microsoft Nguyễn Hữu Lộc Khoa Vật Lý
File đính kèm:
- giao_trinh_hop_ngu.pdf