Giáo trình thực hành Lập trình hệ thống: Phần 1 cung cấp cho người học các kiến thức: Nhập môn hợp ngữ, xuất nhập ký tự, cấu trúc rẽ nhánh, nhập xuất số dạng bin hex dec,... Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn dùng làm tài liệu học tập và nghiên cứu. Mời các bạn cùng tham khảo chi tiết nội dung bài giảng.
TRƯỜNG ĐẠI HỌC CẦN THƠ KHOA CÔNG NGHỆ BỘ MÔN ĐIỆN TỬ - VIỄN THƠNG Giáo trình thực hành LẬP TRÌNH HỆ THỐNG Biên soạn: ThS Nguyễn Hứa Duy Khang Ks Trần Hữu Danh -ĐHCT5-2008 Thực hành lập trình hệ thống NỘI DUNG Giới thiệu BÀI 1: NHẬP MÔN HỢP NGỮ 1 Mục tiêu Kiến thức cần chuẩn bị Nội dung thực hành 3.1 Khảo sát lệnh Intel-8086 3.2 Cấu trúc chương trình dạng EXE 3.3 Viết chương trình đơn giản Bài tập đề nghị BÀI 2: XUẤT NHẬP KÝ TỰ Mục tiêu Kiến thức cần chuẩn bị Nội dung thực hành 3.1 In ký tự hình 3.2 In chuỗi ký tự hình 3.3 Nhận ký tự từ bàn phím 3.4 Nhận chuỗi ký tự từ bàn phím Bài tập đề nghị BÀI 3: CẤU TRÚC RẼ NHÁNH – VÒNG LẬP Mục tiêu Tóm tắt lý thuyết Nội dung thực hành 12 3.1 Cấu trúc rẽ nhánh 12 3.2 Cấu trúc vòng lập 13 Bài tập đề nghị 13 BÀI 4: NHẬP XUẤT SỐ DẠNG BIN-HEX-DEC 15 Mục tiêu 15 Kiến thức cần chuẩn bị 15 Nội dung thực hành 15 3.1 Nhập xuất số nhị phân 15 3.2 Nhập xuất số thập lục phân 16 3.3 Xuất số thập phân nguyên dương 18 Bài tập đề nghị 19 BÀI 5: XỬ LÝ TẬP TIN 21 Mục tiêu 21 Kiến thức cần chuẩn bị 21 Nội dung thực hành 21 3.1 Tạo tập tin 21 Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh i Thực hành lập trình hệ thống 3.2 Ghi nội dung tập tin 22 3.3 Đọc nội dung tập tin 23 3.4 Xóa tập tin 25 3.5 Đổi tên tập tin 26 Bài tập đề nghị 27 BÀI 6: XỬ LÝ CHUỖI KÝ TỰ 28 Mục tiêu 28 Kiến thức cần chuẩn bị 28 Nội dung thực hành 28 3.1 So sánh chuỗi 28 3.2 Di chuyễn chuỗi 30 3.3 Dị tìm chuỗi 31 Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh ii Giới Thiệu Thực hành Lập trình Hệ Thống giúp cho sinh viên viết chương trình ngơn ngữ Assembly máy tính PC Giáo trình hướng dẫn sinh viên kỹ việc lập trình Assembly như: Sử dụng trình biên dịch hợp ngữ môi trường Windows, biên dịch, sửa lỗi liên kết, khảo sát tập lệnh, ngắt đơn giản Hệ điều hành DOS Để vận dụng nâng cao kỹ lập trình hệ thống Hợp ngữ, địi hỏi sinh viên phải nổ lực nhiều việc tự học, đọc thêm tài liệu để bổ sung kiến thức định phần cứng máy tính nguyên ly vận hành thiết bị ngoại vi có liên quan, như: Máy in, hệ vi điều khiển, cổng vào nối tiếp/ song song Thời lượng mơn học có giới hạn, nên thực hành tổ chức thành chủ đề sau đây, chủ đề thực hành buổi (5 tiết): Bài 1: Nhập môn hợp ngữ Bài 2: Xuất nhập ký tự Bài 3: Cấu trúc rẽ nhánh – Vòng lập Bài 4: Xử lý ký tự - Ký số Bài 5: Xử lý tập tin Bài 6: Nhập xuất số BIN-HEX-DEC Để thực hành đạt hiệu cao, sinh viên cần phải chuẩn bị cho trước vào bắt đầu thực hành Muốn đạt điều này, sinh viên phải tuân thủ phương pháp học sau: Trước vào thực hành: - Nắm mục tiêu thực hành Xem lại kiến thức cần chuẩn bị nêu cho thực hành Nắm nội dung cần phải làm buổi thực hành Trong thực hành: - Tuyệt đối tuân thủ thực hành theo thứ tự nội dung thực hành Hoàn thành vấn đề trả lời câu hỏi đặt phần trước chuyển sang thực hành phần sau Quan sát tượng, thay đổi, xem xét đánh giá kết sau thao tác thực hành Lập lại thao tác thực hành nhiều lần, tìm cách giải khác sau thực hành theo yêu cầu cho đề So sánh, nhận xét cách giải khác Sau thực hành: - Đối chiếu mục tiêu thực hành với thực hành Nếu mục tiêu chưa thành thạo phải tìm cách lập lại thực hành để nắm mục tiêu vững Trong trình biên soạn, khơng thể tránh khỏi sơ xuất, chân thành góp ý chỉnh sửa để giáo trình ngày hồn chỉnh ThS Nguyễn Hứa Duy Khang Email: nhdkhang@ctu.edu.vn Bài – Nhập môn hợp ngữ Bài 1: Nhập Môn Hợp Ngữ MỤC TIÊU - Sử dụng công cụ Emu8086 để khảo sát lệnh Intel-8086 Sử dụng chức công cụ RadASM như: Soạn thảo, Hợp dịch (Assemble), Liên kết (Link) Chạy chương trình (Run) Viết cấu trúc chương trình hợp ngữ dạng tái định (EXE) Đọc hiểu sửa lỗi chương trình KIẾN THỨC CẦN CHUẨN BỊ - Các thao tác hệ điều hành Windows Cấu trúc chương trình hợp ngữ dạng EXE Qui trình Soạn thảo – Dịch chương trình Các lệnh đơn giản Intel-8086 thường dùng như: MOV, ADD, SUB, INC, DEC, AND, OR (Xem cú pháp giáo trình) NỘI DUNG THỰC HÀNH 3.1 Khảo sát lệnh Intel-8086: 3.1.1 Nhập vào Emu8086 đoạn lệnh sau dự đoán trước kết quả: MOV AH, 80 MOV AL, 86 MOV BX, AX MOV DH, BL MOV DL, BH MOV SI, CS ; AH ← 80 (AX = ?) ; AL ← 86 (AX = ?) ; BX ← AX (BH = ?, BL = ?) ; DH ← BL (DH = ?, DX = ?) ; DL ← BH (DL = ?, DX = ?) ; SI ← CS (SI = ?) Thực lệnh, sau lệnh ghi lại kết ghi ngoặc để đối chiếu với kết dự đốn giải thích 3.1.2 Thực hành tương tự câu 3.1.1 đoạn lệnh sau: MOV ADD DEC SUB AND AX, 8086 AL, AX AH, 10h AX, 0FF0h ; AX ← 8086 (AH = ?, AL = ?) ; AL ← AL + (AL = ?, AX = ?) ; AX ← AX – (AH = ?, AL = ?, AX = ?) ; AH ← AH – 10h (AH = ?, AL = ?, AX = ?) ; AX ← AX and 0FF0h (AX = ?) 3.1.3 Sinh viên chủ động lập lại lần câu 3.1.1 3.1.2 với giá trị toán hạng khác dịng lệnh 3.2 Cấu trúc chương trình dạng EXE: 3.1.1 [HELLO.ASM] Dùng RadASM để soạn thảo chương trình Hợp ngữ sau đây: Lưu ý: - Chương trình hồn tồn khơng có lỗi Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Nhập môn hợp ngữ - Trong có lệnh mà sinh viên chưa học đến, điều không cần quan tâm, điều cần quan tâm thực hành Cấu trúc chương trình hợp ngữ - Đặt tên file chương trình nguồn HELLO.ASM DSEG SEGMENT ; Tạo đoạn DSEG chuoi DB “Hello World!$” ; Khai báo biến chuỗi DSEG ENDS CSEG SEGMENT ; Tạo đoạn CSEG ASSUME CS: CSEG, DS: DSEG ; CSEG đoạn lệnh, DSEG liệu begin: MOV AX, DSEG ; Khởi động địa đoạn liệu MOV DS, AX MOV AH, 09h ; AH ← 09h LEA DX, chuoi ; DX ← địa offset biến chuoi INT 21h ; gọi ngắt 21h MOV AH, 01h ; AH ← 01h INT 21h ; gọi ngắt 21h MOV AH, 4Ch ; Thốt chương trình INT 21h CSEG ENDS END begin a Hợp dịch chương trình HELLO.ASM kiểm tra xem file HELLO.OBJ tạo chưa b Liên kết chương trình HELLO, kiểm tra xem file HELLO.EXE tạo chưa c Chạy chương trình HELLO.EXE, quan sát hình, chương trình làm gì? d Thay đổi “Hello World!$” thành “Wellcome to Assembly$” Làm lại bước a, b c Chương trình làm gì? 3.2.2 [HELLO2.ASM] Sửa file HELLO.ASM cho giống hệt chương trình sau đặt tên lại HELLO2.ASM (chỉ khác chổ in nghiêng) - Lưu ý: Chương trình có vài lỗi a Dịch chương trình HELLO2.ASM, ghi lại thơng tin lỗi: Số lỗi, lỗi gì, dòng nào? b Kiểm tra xem file HELLO2.OBJ tạo không? Tại sao? c Sửa lỗi từ dòng xuống, lập lại câu a hết lỗi d Liên kết chương trình HELLO2 Kiểm tra xem có file HELLO2.EXE khơng? e Chạy chương trình HELLO2.EXE, so sánh kết với 3.1.1.d Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Nhập môn hợp ngữ DSEG SEGMEMT ; Tạo đoạn DSEG chuoi DW “Wellcome to Assembly$” ; Khai báo biến chuỗi DSEG ENDS CSEG SEGMENT ; Tạo đoạn CSEG ASSUME CS: CSEG, DS: DSEG ; CSEG đoạn lệnh, DSEG liệu begin: MOV BX, SSEG ; Khởi động địa đoạn liệu MOV DS, BX MOV AH, 09h ; AH ← 09h LEA DH, chuoi ; DX ← địa offset biến chuoi INT 21h ; gọi ngắt 21h MOV AH, 01h ; AH ← 01h INT 21h ; gọi ngắt 21h MOV AH, 4Ch ; Thốt chương trình INT 21h CSEG ENDS END Begin 3.3 Viết chương trình đơn giản: 3.3.1 [SUM1.ASM] Viết chương trình dạng EXE để tính kết biểu thức sau, lưu trữ kết AX: 10 + 8086 - 100h + 350 + 0FAh Lưu ý: - Chỉ khai báo đoạn lệnh để viết chương trình a Dịch sửa lỗi (nếu có lỗi) chạy chương trình b Dùng Emu8086 để chạy chương trình kiểm tra kết lưu AX 3.3.2 [SUM2.ASM] Viết chương trình dạng EXE để tính kết biểu thức có dạng tổng quát sau: KQUA = A + B – C + D + E Trong đó: KQUA, A, B, C, D, E biến byte khai báo đoạn liệu Lưu ý: - Chương trình gồm đoạn: Đoạn lệnh Đoạn liệu dùng để chứa Biến a Gán giá trị biến A = 1000, B = 10, C = 1Fh, D = 30h, E = 300Ah Dịch chạy chương trình b Dùng Emu8086 để kiểm tra kết câu a c Áp dụng SUM2.ASM để tính biểu thức cho câu 3.3.1 Dùng Emu8086 để kiểm tra kết BÀI TẬP ĐỀ NGHỊ: 4.1 Dùng Emu8086 để khảo sát lệnh khác tập lệnh Intel-8086 4.2 Tự tìm hiểu thêm chức khác Emu8086 Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Nhập môn hợp ngữ 4.3 Viết chương trình tính biểu thức sau: (Phải viết theo kiểu sử dụng biến để chứa toán hạng kết quả, SV tự đặt tên biến theo ý mình) a 15h * 250 d 1000 ÷ 100 b 16 * 0AF1h e 1000 ÷ 100h c 300 * 400 f 3AB45Eh ÷ 0A1h 4.4 Sử dụng Emu8086 để kiểm chứng kết chương trình viết cho 4.3 Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Xuất nhập ký tự Bài 2: Xuất Nhập Ký Tự MỤC TIÊU - Sử dụng ngắt mềm để viết chương trình: in ký tự - chuỗi ký tự lên hình nhập ký tự - chuỗi ký tự từ bàn phím - Hiểu cách quản lý ký tự ký số Hợp ngữ KIẾN THỨC CẦN CHUẨN BỊ - Kết thực hành - Các hàm 01h, 02h, 06h, 07h, 08h, 09h, 0Ah ngắt 21h - Bảng mã ASCII 3.NỘI DUNG THỰC HÀNH 3.1 In ký tự nàm hình - Chương trình sử dụng hàm 2, ngắt 21h để in ký tự B hình viết sau Hãy soạn thảo lưu lại thành tập tin nguồn có tên BAI_2A.ASM CSEG start: CSEG SEGMENT ASSUME CS: CSEG mov ah, 02h ; Hàm 2, in ký tự hình mov dl, ‘B’ ; DL chứa ký tự cần in int 21h ; gọi ngắt để thực hàm mov ah, 08h ; Hàm 08h, ngắt 21h int 21h mov ah, 4Ch ; Thốt khỏi chương trình int 21h ENDS END start - Dịch sửa lỗi (nếu có) chạy chương trình để xem kết in hình - Các dòng lệnh thực chức in ký tự ‘B’ hình? Các dịng lệnh khác dùng làm gì? - Sửa lại chương trình để in hình ký tự ‘D’ Chạy chương trình kiểm chứng kết - Viết chương trình để in hình số - Viết chương trình để in hình số 89 - Hai dịng lệnh có chức chương trình? Nếu khơng có dịng lệnh chương trình thực nào? (Thử xóa bỏ dịng lệnh chạy chương trình, quan sát kết để phát chức năng) Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Xuất nhập ký tự 3.2 In chuỗi ký tự hình - Muốn in chuỗi ký tự hình sử dụng hàm 9, ngắt 21h chương trình sau đây, soạn thảo đặt tên tập tin nguồn BAI_2B.ASM - Dịch, sửa lỗi (nếu có) chạy chương trình để xem kết hình - Viết lại chương trình để in hình chuỗi “Truong Dai Hoc Can Tho” - Sửa khai báo biến chuoi có dạng sau: chuoi DB ‘Truong Dai Hoc’, 10, 13, ‘Can Tho$’ - Dịch chạy chương trình để xem kết Trong khai báo biến chuoi, giá trị 10, 13 có ý nghĩa việc in chuỗi hình - Sửa lại chương trình để in hình số 2006 DSEG SEGMENT chuoi DB ‘Chao sinh vien nganh Cong Nghe Thong Tin.$’ DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: mov ax, DSEG mov ds, ax mov ah, 09h ; Hàm 9, in chuỗi ký tự hình lea dx, chuoi ; dl chứa ký tự cần in int 21h ; gọi ngắt thực mov ah, 08h int 21h mov ah, 4Ch ; khỏi chương trình int 21h CSEG ENDS END start 3.3 Nhận ký tự từ bàn phím - Chương trình sau (trang 3) sử dụng hàm 01, ngắt 21h để nhận ký tự từ bàn phím Soạn thảo đặt tên tập tin nguồn BAI_2C.ASM - Dịch, sửa lỗi (nếu có) chạy chương trình, gõ phím cần nhập Quan sát kết hình - Ký tự nhập lưu trữ đâu CPU quản lý dạng thức gì? (Dùng Emu8086 để khảo sát) - Sửa chương trình để đọc ký tự hàm 7, ngắt 21h - Chạy chương trình so sánh hoạt động hàm hàm Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Xuất nhập ký tự DSEG SEGMENT tbao DB ‘Hay go vao phim: $’ DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start:mov ax, DSEG mov ds, ax mov ah, 09h ; In câu thông báo hình lea dx, tbao int 21h mov ah, 01h ; Ham 1, nhan ky tu tu ban phim int 21h ; goi ngat thuc hien ham mov ah, 4Ch ; tro ve he dieu hanh int 21h CSEG ENDS END start 3.4 Nhận chuỗi ký tự từ bàn phím - Chương trình sử dụng hàm 0Ah, ngắt 21h để nhập chuỗi ký tự từ bàn phím viết sau Sinh viên soạn thảo thành tập tin chương trình có tên BAI_2D.ASM DSEG SEGMENT max DB 30 len DB chuoi DB 30 dup(?) tbao DB ‘Hay go vao chuoi: $’ DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG start: mov ax, DSEG mov ds, ax mov ah, 09h ; In câu thông báo hình lea dx, tbao int 21h mov ah, 0Ah ; Ham 0Ah, nhap chuoi ky tu tu ban phim lea dx, MAX ; dx chua dia chi vung dem ban phim int 21h ; goi ngat thuc hien ham mov ah, 4Ch ; tro ve he dieu hanh int 21h CSEG ENDS END start Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Xuất nhập ký tự - Dịch, sửa lỗi thi hành chương trình trường hợp sau đây: Nhập từ bàn phím chuỗi 30 ký tự Nhập từ bàn phím chuỗi nhiều 30 ký tự - Giá trị biến len trường hợp bao nhiêu? - Tại nhập nhiều 30 ký tự? Chuỗi ký tự nhập vào lưu trữ biến nào? - Sửa chương trình để nhập nhiều 30 ký tự (60 ký tự chẳng hạn) - Tổng quát, khả tối đa hàm 0Ah, ngắt 21h nhận chuỗi ký tự? BÀI TẬP ĐỀ NGHỊ 4.1 Viết chương trình sử dụng hàm 7, ngắt 21h để nhận ký tự từ bàn phím, dùng biến để lưu trữ ký tự nhận (do sinh viên tự đặt tên biến), sau sử dụng hàm 2, ngắt 21h để in hình ký tự nhận lưu biến Chương trình phải có đủ câu thơng báo nhập xuất Ví dụ: Hay go phim: B Ky tu nhan duoc la: B 4.2 Sửa lại chương trình 4.1 cho khơng cần sử dụng biến để lưu trữ ký tự mà kết chạy chương trình khơng thay đổi 4.3 Viết chương trình nhận ký tự từ bàn phím, sau in hình ký tự kế trước kế sau ký tự vừa nhập Ví dụ: Hay go phim: B Ky tu ke truoc : A Ky tu ke sau : C 4.4 Viết chương trình cho phép nhập từ bàn phím tên người, in hình chuỗi có dạng sau: Xin chao Ví dụ: Khi chạy chương trình, nhập vào là: Nguyen Hua Duy Khang Chuỗi in hình là: Xin chao Nguyen Hua Duy Khang Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Cấu trúc rẽ nhánh – Vòng lặp Bài 3: Cấu trúc rẽ nhánh – Vòng lặp MỤC TIÊU - Hiểu cách so sánh hai số hợp ngữ - Hiểu cách thay đổi thứ tự thực lệnh - Biết cách sử dụng lệnh so sánh, nhảy lặp TÓM TẮT LÝ THUYẾT 2.1 Lệnh so sánh Cú pháp: CMP Trái, Phải ; Cờ ← Trái – Phải Nếu Trái > Phải ⇒ Trái - Phải > : CF = ZF = Nếu Trái < Phải ⇒ Trái - Phải < : CF = ZF = Nếu Trái = Phải ⇒ Trái - Phải = : CF = ZF = Trái, Phải: Immed, Reg, Mem Bản chất lệnh CMP lệnh SUB Đích, Nguồn (thực phép tính Đích – Nguồn) kết phép tính khơng lưu vào Đích lệnh SUB mà tính chất kết thể thơng qua cờ Ví dụ: so sánh hai số nguyên dương MOV AH, ; AH ← MOV AL, ; AL ← CMP AH, AL ; CF ← 1, ZF ← AH < AL Sau thực lệnh trên, cờ Carry bật (CF=1), báo hiệu AH < AL 2.2 So sánh nhị phân Cú pháp: TEST Trái, Phải ; Cờ ← Trái and Phải Nếu Trái and Phải = ZF = 1, ngược lại ZF = Bản chất lệnh TEST lệnh AND Đích, Nguồn kết phép tính khơng lưu vào Đích lệnh AND mà ảnh hưởng lên cờ Ví dụ: kiểm tra hai bit cuối AL TEST AL, ; 3h = 11b Nếu cờ Zero bật (ZF=1), có nghĩa hai bit AL 2.3 Lệnh nhảy không điều kiện Cú pháp: JMP ; Nhảy đến địa Có trường hợp sau: • JMP SHORT ; (short jump) Kiểu nhảy phạm vi từ –128 đến +127 byte so với vị trí Ví dụ: JMP SHORT Calculate Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh Bài – Cấu trúc rẽ nhánh – Vịng lặp • JMP ; (near jump) Kiểu nhảy tùy ý phạm vi segment Ví dụ: JMP Calculate • JMP FAR PTR ; (far jump) Kiểu nhảy đến chỗ Ví dụ: JMP FAR PTR Calculate • JMP ; (near indirect jump) Khi thực hiện, ghi PC gán giá trị lưu địa Có thể kết hợp dùng với định vị số Ví dụ: myPointer DW Prepare, Calculate, Check, Output MOV BX, ; số mảng trỏ SHL BX, ; nhân đôi JMP myPointer[BX] Prepare: ; công việc Calculate: ; công việc Check: ; công việc – nơi cần nhảy đến Output: ; công việc • JMP ; (far indirect jump) Tương tự trường hợp trên, trỏ gồm segment offset Chỉ khác khai báo trỏ • JMP ; (indirect jump via regs) Nhảy đến địa lưu ghi AX Ví dụ: MOV AX, offset Calculate JMP AX ; PC ← AX 2.4 Lệnh nhảy có điều kiện Cú pháp: J Các lệnh nhảy có điều kiện bắt đầu chữ J sau chữ biểu thị điều kiện (ví dụ JGE: Jump if Greater than or Equal, nhảy lớn hay bằng), tiếp sau tên nhãn Điều kiện để lệnh nhảy xem xét thi hành giá trị cờ tạo từ lệnh CMP hay TEST Khi sử dụng lệnh nhảy có điều kiện sau thực phép so sánh, Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 10 Bài – Cấu trúc rẽ nhánh – Vòng lặp phải đặc biệt lưu ý tốn hạng phép so sánh số có dấu (signed) hay khơng có dấu (unsigned) để lựa chọn lệnh cho phù hợp Ví dụ: MOV AH,AL ; AL 128 CMP AH,1 JGE Greater ; AH > khơng nhảy ???? Greater: Ví dụ: AL số ngun khơng dấu đoạn chương trình phải sửa lại sau: MOV AH,AL CMP AH,1 JAE Greater Greater: Một số lệnh nhảy có điều kiện thường dùng: Lệnh JB JNAE JAE JNB JBE JNA JA JNBE JE JZ JNE JNZ Ý Nghĩa Nhảy nhỏ (Jump if Below) Nhảy không lớn Nhảy lớn (Jump if Above or Equal) Nhảy không nhỏ Nhảy nhỏ (Jump if Below or Equal) Nhảy không lớn Nhảy lớn (Jump if Above) Nhảy không nhỏ Nhảy (Jump if Equal) Nhảy (Jump if Zero) Nhảy không (Jump if Not Equal) Nhảy không (Jump if Not Zero) Điều Kiện CF = CF = CF = ZF = CF = ZF = ZF = ZF = 2.5 Lệnh lặp Bằng cách dùng lệnh nhảy tạo vịng lặp Tuy nhiên, để viết chương trình tiện lợi ngắn gọn, dùng thêm lệnh lặp LOOP, LOOPZ,… Cú pháp: LOOP tự động giảm CX đơn vị, sau kiểm tra xem CX có 0, khơng nhảy đến nhãn Cú pháp: LOOPZ tự động giảm CX đơn vị, sau kiểm tra xem CX có cờ ZF có bật khơng (ZF=1), hai điều khơng xảy nhảy đến nhãn Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 11 Bài – Cấu trúc rẽ nhánh – Vịng lặp Ví dụ: Nhập mảng A gồm 10 ký tự MOV SI, ; số mảng MOV CX, 10 ; số lần lặp LAP: MOV AH, ; nhập ký tự INT 21H MOV A[SI], AL INC SI NỘI DUNG THỰC HÀNH 3.1 Cấu trúc Rẽ nhánh - Chương trình sau nhận ký tự Nếu ký tự HOA in hình "Ky tu HOA" Ngược lại in câu "Ky tu thuong" (Mã ASCII ký tự HOA ký tự thường Nếu không lớn => ký tự HOA in "Ky tu HOA" in "Ky tu thuong" trở hệ điều hành - Dịch chạy CT trường hợp khác để xem kết hình - Vẽ lưu đồ điều khiển chương trình Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 12 Bài – Cấu trúc rẽ nhánh – Vòng lặp - Tại cần phải có lệnh JMP EXIT? Nếu khơng có lệnh chương trình thực nào? Chạy chương trình để kiểm chứng - Thay lệnh JA NHAN lệnh JNA NHAN Sửa chương trình cho kết không thay đổi - Khi ký tự nhập vào chữ kết in hình gì? Tại sao? 3.2 Cấu trúc vịng lặp - Xem chương trình in hình ký tự từ A đến Z viết sau Hãy soạn thảo đặt tên tập tin BAI_3B.ASM - Dịch chạy chương trình để xem kết hình - Vịng lặp chương trình bao gồm đoạn lệnh nào? Viết theo kiểu while hay repeat until hay for? Vẽ lưu đồ chương trình - Sửa chương trình để in hình ký tự từ 'Z' đến 'A' - Tiếp tục sửa chương trình cho ký tự có khoảng trống (Z Y B A) - Dùng lệnh LOOP để viết lại chương trình BAI_3B.ASM theo cấu trúc vòng lặp for CSEG SEGMENT ASSUME CS: CSEG start:mov dl, 'A' ; nhan:mov ah, 02h ; int 21h inc dl ; cmp dl, 'Z' ; jna nhan ; mov ah, 08h ; int 21h mov ah, 4Ch int 21h CSEG ENDS END start DL chứa ký tự 'A' in ký tự DL hình DL chứa ký tự kế cần in So sánh DL với 'Z' Nếu 'Z' (khơng in tiếp) BÀI TẬP KIỂM TRA: 4.1 Viết chương trình cho nhập ký tự từ hình xuất câu thơng báo tương ứng sau: - Nếu ký tự nhập ‘S’ hay ‘s’ in “Good morning!” - Nếu ký tự nhập ‘T’ hay ‘t’ in “Good Afternoon!” - Nếu ký tự nhập ‘C’ hay ‘c’ in “Good everning!” 4.2 Viết lại chương trình BAI_3A.ASM cho chương trình phân biệt loại ký tự nhập từ bàn phím: "Ký tự HOA", "ký tự thường" "ký tự khác" Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 13 Bài – Cấu trúc rẽ nhánh – Vòng lặp 4.3 Viết chương trình nhập từ bàn phím ký tự thường Sau in hình ký tự từ ký tự nhận đến 'z' cho ký tự có khoảng trống 4.4 Khơng dùng hàm 0Ah/21h, dùng lệnh lặp để viết chương trình nhập vào chuỗi ký tự Sau nhập xong đếm xem chuỗi có ký tự In hình chuỗi nhận số ký tự có chuỗi Ví dụ: S = "Hello world !" ==> Số kí tự chuỗi 13 4.5 Viết chương trình cho phép nhập vào chuỗi Sau đó: - Đổi tất ký tự thường thành ký tự hoa in hình - Đổi tất ký tự hoa thành ký tự thường in hình Ví dụ: S = ‘weLcOme To AssEmblY’ In ra: welcome to assembly - WELCOME TO ASSEMBLY 4.6 Nhập vào chuỗi số, đổi chuỗi thành số, sau cộng hai số, đổi chuỗi xuất chuỗi tổng Ví dụ: S1 = "123" => N1 = 123 S2 = "456" => N2 = 456 N = N1 + N2 = 123 + 456 = 579 => S = "579" (xuất S hình) 4.7 Nhập số ngun dương A, B Tính A/B, A*B (khơng dùng lệnh DIV, MUL) in hình kết Ví dụ: A=18, B=3 Tính A/B: 18 - - - - - - = 0, A/B = (tổng trừ B A = 0) Tính A*B = 18 + 18 + 18 = 54 Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 14 Bài – Nhập xuất số dạng BIN-HEX-DEC Bài 4: Nhập xuất số dạng BIN – HEX - DEC Mục Tiêu: - Nhập từ bàn phím số dạng nhị phân, thập lục phân thập phân - In lên hình số dạng nhị phân, thập lục phân thập phân Kiến thức cần chuẩn bị: - Kết thực hành trước Các lệnh xử lý chuỗi Nội dung thực hành: 3.1 Nhập xuất nhị phận: Chương trình mẫu sau cho phép nhập số nhị phân bit, sau in hình số nhị phân nhận (BAI_6A.ASM): inchuoi MACRO chuoi MOV AH, 9h LEA DX, chuoi INT 21h ENDM DSEG SEGMENT msg1 DB "Hay nhap so nhi phan bit: $" msg2 DB "So nhi phan da nhap la: $" xdong DB 10, 13, ‘$’ sobin DB ? ; lưu trữ số nhị phân nhận DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG begin: MOV AX, DSEG MOV DS, AX inchuoi msg1 CALL bin_in MOV sobin, BL inchuoi xdong inchuoi msg2 MOV BL, sobin CALL bin_out MOV AH, 01 INT 21h MOV AH, 4Ch ; thoat khỏi chương trình INT 21h bin_in PROC MOV BL, ; Xóa BL MOV CX, ; nhập đủ bit dừng ThS Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 28 Bài – Nhập xuất số dạng BIN-HEX-DEC nhap:MOV AH, 01h INT 21h CMP AL, 0Dh JZ exit SHL BL, SUB AL, 30h ADD BL, AL LOOP nhap exit:RET bin_in ENDP bin_out PROC MOV CX, xuat:MOV DL, SHL BL, RCL DL, ADD DL, 30h MOV AH, 02h INT 21h LOOP xuat RET bin_out ENDP CSEG ENDS END begin ; Hàm nhập ký tự ; ; ; ; ; ; ; ; ; ; phím Enter thơi nhập khơng phải Enter đổi sang bit Dịch trái BL bit Ký số - 30h = số Chuyển bit từ AL sang BL lưu trữ Xuất bit BL M.Hình CF chứa MSB, xuất hình đưa CF vào LSB DL Số + 30h = Ký số In hình - Soạn thảo, Biên dịch cho chạy file BAI_6A.ASM để kiểm tra kết - Sửa chương trình thành BAI_6A1.ASM cho nhập xuất số nhị phân 16 bit - Viết lại chương trình để nhập ký tự từ bàn phím, sau in hình mã ASCII ký tự nhận dạng nhị phân 3.2 Nhập xuất thập lục phân: Chương trình sau cho phép nhập ký tự từ bàn phím, sau in hình mã ASCII ký tự nhận dạng thập lục phân - Soạn thảo, Biên dịch cho chạy file BAI_6B.ASM để kiểm tra kết - Viết lại chương trình để nhập số thập lục phân bit A B, sau in hình kết A + B dạng thập lục phân inchuoi MACRO chuoi MOV AH, 9h LEA DX, chuoi INT 21h ENDM DSEG SEGMENT msg1 DB "Hay nhap ky tu: $" msg2 DB "Ma ASCII o dang Hex: $" ThS Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 29 Bài – Nhập xuất số dạng BIN-HEX-DEC xdong DB 10, 13, ‘$’ kytu DB ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG begin: MOV AX, DSEG MOV DS, AX inchuoi msg1 MOV AH, 01h INT 21h MOV kytu, AL ; cất ký tự nhận inchuoi xdong inchuoi msg2 MOV BH, kytu ; Ký tự cần in CALL hex_out MOV AH, 02 ; in ký tự h sau số Hex MOV DL, ‘h’ INT 21h MOV AH, 01 INT 21h MOV AH, 4Ch ; thoat khỏi chương trình INT 21h hex_out PROC MOV CX, xuat:PUSH CX MOV CL, MOV DL, BH SHR DL, CL CMP DL, 09h JA kytu ADD DL, 30h JMP inra kytu:ADD DL, 37h inra:MOV AH, 02h INT 21h SHL BX, CL POP CX LOOP xuat RET hex_out ; Đổi thành ký số ‘0’-‘9’ ; Đổi thành ký tự ‘A-‘F’ ; In hình ký tự đổi ; Quay trái BX bit ENDP CSEG ENDS END begin 3.3 Xuất số thập phân nguyên dương: Chương trình sau cho phép nhập ký tự từ bàn phím, sau in hình mã ASCII ký tự nhận dạng thập phân ThS Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 30 Bài – Nhập xuất số dạng BIN-HEX-DEC - Soạn thảo, Biên dịch cho chạy file BAI_6C.ASM để kiểm tra kết - Đọc thủ tục DEC_OUT để tìm hiểu giải thuật xuất giá trị AX hình dạng thập phân Từ đưa giải thuật nhập số thập phân từ bàn phím - Viết lại chương trình để nhập số thập phân A B có chữ số, sau in hình kết A + B dạng thập phân - Nhập xuất số thập phân ÂM nào? inchuoi MACRO chuoi MOV AH, 9h LEA DX, chuoi INT 21h ENDM DSEG SEGMENT msg1 DB "Hay nhap ky tu: $" msg2 DB "Ma ASCII o dang Dec: $" xdong DB 10, 13, ‘$’ kytu DB ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG begin: MOV AX, DSEG MOV DS, AX inchuoi msg1 MOV AH, 01h INT 21h MOV kytu, AL ; cất ký tự nhận inchuoi xdong inchuoi msg2 XOR AX, AX MOV AL, kytu ; Ký tự cần in CALL dec_out MOV AH, 01 INT 21h MOV AH, 4Ch ; thoat khỏi chương trình INT 21h dec_out PROC XOR CX,CX ; CX đếm số chữ số thập phân MOV BX,10 chia10: XOR DX,DX DIV BX ; DX:AX÷BX => AX: Thương, DX: số dư PUSH DX ; Cất số dư vào stack INC CX CMP AX, JNZ chia10 ; AX>0 chia tiếp cho 10 inra: MOV AH,2 ; in hình POP DX ; lấy chữ số thập phân ThS Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 31 Bài – Nhập xuất số dạng BIN-HEX-DEC dec_out ADD DL,30h INT 21h LOOP inra RET ; đổi thành ký số ENDP CSEG ENDS END begin Bài tập kiểm tra: 4.1 Viết chương trình nhập số nhị phân 16 bit A B Sau in hình kết dạng nhị phân: A + B, A – B, A and B, A or B Ví dụ: Nhập số nhị phân A: 10101010 Nhập số nhị phân B: 01010101 A + B = 11111111 A – B = 01010101 A and B = 00000000 A or B = 11111111 4.2 Viết chương trình nhập ký tự từ bàn phím, sau in hình mã ASCII ký tự nhận dạng thập lục phân, thập phân nhị phân Ví dụ: Nhập ký tự: A Mã ASCII dạng Hex: 41h Mã ASCII dạng Dec: 65 Mã ASCII dạng Bin: 01000001b 4.3 Viết lại chương trình 4.1 số A B nhập theo dạng thập lục phân Các kết in hình dạng nhị phân 4.4 Viết lại chương trình 4.1 số A B nhập theo dạng thập phân In kết dạng thập phân: A + B, A – B 4.5 Viết chương trình tính giai thừa n! Với n số nguyên dương nhập từ bàn phím In kết hình dạng thập phân Cho biết, khả 8086 tính n lớn bao nhiêu? ThS Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 32 ... A or B Ví dụ: Nhập số nhị phân A: 10 1 010 10 Nhập số nhị phân B: 010 1 010 1 A + B = 11 111 111 A – B = 010 1 010 1 A and B = 00000000 A or B = 11 111 111 4.2 Viết chương trình nhập ký tự từ bàn phím, sau... tác thực hành Lập lại thao tác thực hành nhiều lần, tìm cách giải khác sau thực hành theo yêu cầu cho đề So sánh, nhận xét cách giải khác Sau thực hành: - Đối chiếu mục tiêu thực hành với thực hành. .. cần phải làm buổi thực hành Trong thực hành: - Tuyệt đối tuân thủ thực hành theo thứ tự nội dung thực hành Hoàn thành vấn đề trả lời câu hỏi đặt phần trước chuyển sang thực hành phần sau Quan sát