Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 2)
Bài 5 – Xử lý tập tin
ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 21
Bài 5: Xử Lý Tập Tin
1. Mục Tiêu:
Viết được các chương trình xử lý tập tin như tạo tập tin, xóa tập tin, ghi tập tin,
đọc nội dung của tập tin.
2. Kiến thức cần chuẩn bị:
- Kết quả của các bài thí nghiệm 1, 2, 3 và 4.
- Các hàm 3dh, 3ch, 3eh, 3fh, 40h, 41h, 42h và 56h của INT 21h đẻ xử lý tập
tin.
- Các hàm 01, 02h, 06h, 08h, 09h, 0Ah của INT 21h và các lệnh của CPU
8086
Bạn đang xem tài liệu "Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 2)", để 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 thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 2)
Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 21 Bài 5: Xử L ý Tập Tin 1. Mục Tiêu: Viết được các chương trình xử lý tập tin như tạo tập tin, xóa tập tin, ghi tập tin, đọc nội dung của tập tin. 2. Kiến thức cần chuẩn bị: - Kết quả của các bài thí nghiệm 1, 2, 3 và 4. - Các hàm 3dh, 3ch, 3eh, 3fh, 40h, 41h, 42h và 56h của INT 21h đẻ xử lý tập tin. - Các hàm 01, 02h, 06h, 08h, 09h, 0Ah của INT 21h và các lệnh của CPU 8086 3. Nội dung thực hành: 3.1. Tạo tập tin mới: Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5A.ASM. - Biên dịch và cho chạy file BAI_5A.ASM để kiểm tra và xem kết quả. Gợi ý: Thư mục TT_ASM phải có sẵn trong ổ đĩa. Để biết chương trình chạy đúng hay sai, vào thư mục TT_ASM để xem có tập tin Data.txt hay không, nếu có thì OK. - Tại sao thẻ file phải được khai báo như dạng thefile DW ? DSEG SEGMENT tenfile db "d:\tt_asm\data.txt",0 thefile dw ? DSEG ENDS CSEG SEGMENT ASSUME cs:cseg, ds:dseg begin: mov ax, dseg mov ds, ax mov ah, 3ch ; tao tap tin moi lea dx, tenfile mov cx, 0 ; thuoc tinh tap tin int 21h mov thefile, ax ; cat the file mov ah, 3eh ; dong tap tin mov bx, thefile int 21h mov ah, 4ch ; thoat ve Dos int 21h CSEG ENDS END begin Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 22 - Tại sao trong trường hợp này, chúng ta không phải dùng hàm 08h của int 21h đứng trước hàm 4ch của int 21h ? - Tại sao phải cất thẻ file. Nếu chúng ta không cần đóng file thì chúng ta có cần cất thẻ file hay không ? - Trong đoạn chương trình mẫu trên có cần thiết phải đóng tập tin hay không ? Có thể bỏ biến thefile trong đoạn chương trình mẫu trên không ?. Khi đó chúng ta phải dùng các lệnh gì để thay thế điều đó. Nếu có thay đổi, hãy biên dịch và cho chạy chương trình để kiểm chứng lại kết quả. - Hãy sửa đổi file BAI_5A.ASM và lưu với tên BAI_5A1.ASM để có thể thực hiện được yêu cầu sau: tạo một tập tin mới, tên tập tin được nhập từ bàn phím. Gợi ý: dùng hàm 0ah của int 21h để nhập vào tên file, chú ý cuối chuỗi chứa tên file phải có zero, nhưng khi dùng hàm 0ah thì chúng ta không thể nào nhập zero vào cuối chuỗi được, nếu ta nhập ký tự ‘0’ vào thì đó là mã ascii của ký tự ‘0’ chứ không phải là zero (con số 0). Do đó, để thực hiện được điều này chúng ta hãy dùng giải thuật đưa 0 về cuối chuỗi như sau: 3.2. Ghi nội dung của biến string1 vào một tập tin mới có tên trong thư mục và ổ đĩa với đường dẫn như sau: “D:\TT_ASM\DATA.TXT”. Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5B.ASM. - Biên dịch và cho chạy file BAI_5B.ASM để kiểm tra và xem kết quả. (vào D:\TT_ASM để xem tập tin DATA.TXT có trong đó hay chưa và có nội dung hay chưa ?, nếu có là OK.) - Xem xét đoạn chương trình mẫu, hãy đưa ra giải thuật ghi nội dung của vùng dữ liệu vào một tập tin vừa tạo. - Lệnh len db $ - string1 được dùng để làm gì ?. - Lệnh XOR CX, CX có ý nghĩa gì? Sau khi thực hiên xong lệnh này, thanh ghi CX có giá trị bằng bao nhiêu? Có thể thay thế nó bằng lệnh nào khác được không ? - Tại sao dùng lệnh MOV CL, LEN mà không dùng MOV CX, LEN hay MOV CH, LEN ? Khi dùng lệnh MOV CX, LEN thì cần phải thay đổi khai báo biến len như thế nào ? nếu không thay đổi thì sẽ có vấn đề gì xảy ra hay không ? Hãy thay đổi, biên dịch và chạy chương trình để kiểm chứng lại kết quả so với chương trình mẫu. - Hãy sửa đổi file BAI_5B.ASM và lưu với tên BAI_5B1.ASM để có thể thực hiện được yêu cầu sau: nhập từ một chuỗi ký tự bất kỳ, sau đó lưu vào tập tin có tên là “d:\tt_asm\solieu.txt”. Gợi ý: dùng hàm 0Ah của int 21h để nhập vào một chuỗi ký tự, sau đó áp dụng toàn bộ giải thuật của BAI_5B.ASM. - Hãy sửa đổi file BAI_5B1.ASM và lưu với tên BAI_5B2.ASM để có thể thực hiện được yêu cầu sau: tạo tên tập tin mới, tên tập tin được nhập từ bàn phím. xor cx, cx ; dua zero ve cuoi chuoi mov cl, len ;khai bao bien de dung ham 0ah cua int 21h dang lea bx, tenfile; max db 250 ; so ky tu toi da duoc nhap mov dl,0 ; len db ? ; chieu dai chuoi da nhap mov [bx], dl ; tenfile db 250 dup(?); chua noi dung duoc nhap Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 23 Sau đó nhập vào một chuỗi ký tự bất kỳ và lưu chuỗi ký tự đã nhập vào tập tin vừa tạo. Gợi ý: xem lại BAI_5A1.ASM để lấy lại giải thuật nhập vào tên file và đưa zero (con số 0) về cuối chuỗi đối với trường hợp tên file được nhập từ bàn phím và các vấn đề còn lại thì xem lại file BAI_5B1.ASM. - Hãy sửa đổi file BAI_5B2.ASM và lưu với tên BAI_5B3.ASM để có thể thực hiện được yêu cầu sau: tạo tên tập tin mới, tên tập tin được nhập từ bàn phím. Sau đó nhập vào một chuỗi ký tự thường, sau đó đổi hoa ký tự đầu của mỗi từ và lưu chuỗi ký tự đã thay đổi vào tập tin vừa tạo. Gợi ý: xem lại các bài tập đã làm trong bài 5 xử lý ký tự và các file BAI_5B2.ASM. 3.3. Đọc nội dung của tập tin (đã tồn tại trên đĩa và có nội dung). Hiển thị nội dung của tập tin lên màn hình. Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5C.ASM. - Biên dịch và cho chạy file BAI_5C.ASM để kiểm tra và xem kết quả. dseg segment string1 db "Chao em co gai Lam Hong" len db $ - string1 tenfile db "d:\tt_asm\data.txt",0 thefile dw ? dseg ends cseg segment assume cs:cseg, ds:dseg begin: mov ax, dseg mov ds, ax mov ah, 3ch ; tao tap tin moi lea dx, tenfile mov cx, 0 ; tap tin co thuoc tinh binh thuong int 21h mov thefile, ax ; cat the file mov ah, 40h ; ghi file mov bx, thefile xor cx, cx mov cl, len lea dx, string1 int 21h mov ah, 3eh ; dong tap tin mov bx, thefile int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 24 - Xem lại đoạn chương trình mẫu, hãy đưa ra giải thuật đọc nội dung của tập tin và hiển thị nội dung đó ra màn hình. - Hãy thử thay đổi thuộc tính tập tin trong lệnh mov al, 2 lần lượt thành các giá trị khác như 0, 1, 3 hoặc 4. Biện dịch và cho chạy chương trình để xem kết quả. Có nhận xét gì về các giá trị này ?. - Thẻ file có vai trò như thế nào trong xử lý tập tin. - Nếu số byte cần đọc (giá trị chứa trong thanh ghi cx) lớn hơn kích thước thật sự của tập tin thì có gây ra lỗi gì hay không ?. Sau khi đọc nội dung của tập tin vào vùng đệm bằng hàm 3fh của INT 21h, thanh ghi ax sẽ có giá trị thay đổi hay không và nó chứa (giá trị) gì ?. Làm sao xác định được khi nào đọc xong nội dung thành tập tin ?. Hãy thử đưa ra hướng giải quyết. - Hãy sửa đổi file BAI_5C.ASM và lưu với tên BAI_5C1.ASM để có thể thực hiện được yêu cầu sau: đọc nội dung của một tập tin và hiển thị nội dung đó lên màn hình. Tên tập tin được nhập từ bàn phím. Gợi ý: sử dụng lại giải thuật nhập tên file từ bàn phím và đưa zero về cuối chuỗi và các bài có liên quan trong bài 6. - Hãy sửa đổi file BAI_5C1.ASM và lưu với tên BAI_5C2.ASM để có thể thực hiện được yêu cầu sau: copy nội dung của một tập tin bất kỳ sau đó paste sang một vị trí khác. Gợi ý: các giải thuật nhập tên file từ bàn phím thì có sẵn, giải thuật copy và paste như sau: trước hết phải mở tập tin đã có bằng hàm 3dh, chúng ta định nghĩa sẵn đường dẫn chứa tên file cần mở, đọc nội dung của tập tin vào vùng đệm bằng hàm 3fh, nhớ cất thẻ file; tạo tên tập tin mới bằng hàm 3ch, chúng ta định nghĩa sẵn đường dẫn chứa tên file cần tạo, nhớ cất thẻ file; ghi nội dung của vùng đệm vào tập tin mới vừa tạo bằng hàm 40h; đóng hai tập tin lại bằng hàm 3eh, tất cả các hàm này đều của int 21h. - Hãy sửa đổi file BAI_5C2.ASM và lưu với tên BAI_5C3.ASM để có thể thực hiện được yêu cầu sau: copy nội dung của một tập tin bất kỳ sau đó paste sang một vị trí khác. Tên tập tin được copy và tập tin sau khi paste đều nhập từ bàn phím. Gợi ý: hoàn toàn tương tự như BAI_5C2.ASM, nhưng chúng ta cần tận dụng lại giải thuật nhập tên file từ bàn phím từ BAI_5B3.ASM. - Hãy sửa đổi file BAI_5C3.ASM và lưu với tên BAI_5C4.ASM để có thể thực hiện được yêu cầu sau: save as nội dung của một tập tin. Tên tập tin được copy và save as đều nhập từ bàn phím. Gợi ý: bài này giống tương tự như BAI_5C3.ASM. - Hãy sửa đổi file BAI_5C3.ASM và lưu với tên BAI_5C4.ASM để có thể thực hiện được yêu cầu sau: đọc nội dung của tập tin và sau đó nhập một chuỗi ký tự bất kỳ và ghi tiếp theo sau nội dung của tập tin vừa mở. Tên tập tin nhập từ bàn phím. Gợi ý: xem lại BAI_5C1.ASM, BAI_5B1.ASM, BAI_5B2.ASM và hàm 42h của int 21h (dời vị trí con trỏ tập tin). - Hãy sửa đổi file BAI_5C4.ASM và lưu với tên BAI_5C5.ASM để có thể thực hiện được yêu cầu sau: mã hóa nội dung của tập tin. Tên tập tin cần mà hóa được nhập từ bàn phím. Gợi ý: nhập vào tên file cần mã hóa, mở một file đã có bằng hàm 3dh; đọc nội dung của tập tin vào vùng đệm bằng hàm 3fh; mã hóa vùng đệm đọc được bằng một trong các phép toán cộng, trừ, nhân, chia, and, or, not , vừa mã hóa vừa lưu nội dung trở lại vùng đệm; dời vị trí con trỏ tập tin Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 25 về đầu tập tin bằng hàm 42h; sau đó ghi nội dung của vùng đệm trở lại tập tin ban đầu thông qua thẻ file của nó. Tất cả các hàm sử dụng ở đây đều của int 21h. - Hãy sửa đổi file BAI_5C5.ASM và lưu với tên BAI_5C6.ASM để có thể thực hiện được yêu cầu sau: giải mã nội dung của tập tin đã mã hóa. Tên tập tin cần giải mã được nhập từ bàn phím. Gợi ý: giải mã là trường hợp ngược lại của mã hóa, nếu mã hóa theo phương thức nào thì giải mã phải làm ngược lại phương thức mã hoá đó. 3.4. Xóa tập tin. Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5D.ASM. - Biên dịch và cho chạy file BAI_5D.ASM để kiểm tra và xem kết quả. - Hãy sửa đổi file BAI_5D.ASM và lưu với tên BAI_5D1.ASM để có thể thực hiện được yêu cầu sau: xóa tên một tập tin. Tên tập tin cần được nhập từ bàn phím. Gợi ý: xem lại các bài trước để lấy giải thuật nhập tên file từ bàn phím. dseg segment tenfile db "d:\tt_asm\data.txt",0 thefile dw ? buffer db 251 dup ('$') dseg ends cseg segment assume cs:cseg, ds:dseg begin: mov ax, dseg mov ds, ax mov ah, 3dh ; mo tap tin da co lea dx, tenfile mov al, 2 ; thuoc tinh tap tin int 21h mov thefile, ax ; cat the file mov ah, 3fh ; doc noi dung file vao vung dem mov bx, thefile lea dx, buffer mov cx, 250 ; so byte can doc tu file da mo int 21h mov ah, 3eh ; dong tap tin mov bx, thefile int 21h mov ah, 09h ; in noi dung cua file ra man hinh lea dx, buffer int 21h mov ah,08h ; dung man hinh de xem ket qua int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 26 3.5. Đổi tên tập tin cũ thành một tập tin mới trong cùng thư mục Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5E.ASM. - Biên dịch và cho chạy file BAI_5E.ASM để kiểm tra và xem kết quả. - Hãy tạo một thư mục con có tên là baitap nằm trong thư mục tt_asm. Sửa đổi lệnh oldfile db “d:\tt_asm\data.txt”,0 và newfile db “tt_asm\solieu.txt”,0 lại thành oldfile db “d:\tt_asm\solieu.txt”,0 và newfile db “tt_asm\baitap\data.txt”,0. Biên dịch lại và cho chạy chương trình để xem xét kết quả. Có nhận xét gì về kết quả nhận được. - Hãy sửa đổi file BAI_5E.ASM và lưu với tên BAI_5E1.ASM để có thể thực hiện được yêu cầu sau: đổi tên một tập tin. Tên tập tin cũ và mới được nhập từ bàn phím. Gợi ý: xem lại các bài tập trước để lấy giải thuật nhập tên file từ bàn phím dseg segment tenfile db "d:\tt_asm\data.txt",0 dseg ends cseg segment assume cs:cseg, ds:dseg begin: mov ax, dseg mov ds, ax mov ah,41h ; xoa tap tin da co lea dx, tenfile int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin dseg segment oldfile db "d:\tt_asm\data.txt",0 newfile db "d:\tt_asm\solieu.txt",0 dseg ends cseg segment assume cs:cseg, ds:dseg, es: dseg begin: mov ax, dseg mov ds, ax mov es, ax mov ah,56h ; rename/remove tên file cu thanh moi lea dx, oldfile lea di, newfile int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin Bài 5 – Xử lý tập tin ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 27 4. Bài tập kiểm tra: 4.1. Viết chương trình sử dụng hàm 41h/ INT 21h để xóa tập tin trên đĩa. Tên tập tin cần xóa được nhập từ bàn phím khi thực hiện chương trình. 4.2. Viết chương trình nhập 1 chuỗi từ bàn phím, sau đó ghép chuỗi nhận được vào cuối của nội dung tập tin có trên đĩa. Tên tập tin nhập từ bàn phím khi chạy chương trình. 4.3. Viết chương trình nhập 1 chuỗi từ bàn phím, sau đó chèn chuỗi nhận được vào đầu của nội dung tập tin có trên đĩa. Tên tập tin nhập từ bàn phím khi chạy chương trình. 4.4. Viết chương trình ghép nội dung 2 tập tin có sẳn trên đĩa thành 1 tập tin mới. Tên của các tập tin được nhập từ bàn phím khi chạy chương trình. 4.5. Viết chương trình đọc nội dung tập tin trên đĩa, sau đó đổi tất cả ký tự HOA thành ký tự thường và lưu lại vào tập tin đó. Tên tập tin phải được nhập từ bàn phím Bài 6 – Xử lý chuỗi ký tự Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 28 Bài 6: Xử Lý Chuỗi Ký Tự 1. Mục Tiêu: - Viết được các chương trình xử lý chuỗi ký tự bằng các lệnh xử lý chuỗi 2. Kiến thức cần chuẩn bị: - Bảng mã ASCII. - Kết quả của các bài thí nghiệm trước - Các hàm 01h, 02h, 06h, 08h, 09h, 0Ah của INT 21h và các lệnh xử lý chuỗi như MOVSB/W, SCASB/W, STOSB/W, CMPSB/W. 3. Nội dung thực hành: 3.1. So sánh hai chuỗi oldpass và newpass. Nếu hai chuỗi này giống nhau thì kết luận giống nhau và ngược lại. Soạn thảo như đoạn chương trình trên và lưu với tên là BAI_6A.ASM. - Biên dịch và cho chạy file BAI_6A.ASM để kiểm tra và xem kết quả. - Trong macro writeln, các lệnh nào có chức năng xuống dòng sau khi in xong chuỗi ký tự. - Mục đích của việc khai báo LOCAL bien1 trong macro là gì? - Hãy cho biết địa chỉ của DS và ES có giống nhau hay không? Điều này được thể hiện qua các câu lệnh nào trong đoạn chương trình mẫu? Tại sao người ta không khai báo DS và ES trên các phân đoạn khác nhau ? - Tiền tố REPE trong đoạn chương trình mẫu trên có ý nghĩa như thế nào? - Ta có thể thay đổi lệnh REPE CMPSB thành một nhóm lệnh khác được không? Nếu được hãy thay đổi nó, biên dịch và chạy chương trình để kiểm chứng. - Thử thay đổi nội dung ở oldpass và newpass sao cho chúng giống nhau. Biên dịch và chạy chương trình xem kết quả, sau đó hãy giải thích cơ chế làm việc của đoạn lệnh từ lệnh CLD cho đến lệnh REPE CMPSB. - Giả sử, người ta muốn thay thế lệnh cmpsb thành lệnh cmpsw, các bạn có cần sửa đổi các lệnh nào trong chương trình hay không ? Tại sao ?. Biên dịch và chạy chương trình để kiểm chứng. - Lệnh jmp thoat trong đoạn chương trình trên có nhiệm vụ gì ?. Thử bỏ lệnh jmp thoat sau đó biên dịch và chạy chương trình xem kết quả. - Hãy sửa đổi file BAI_6A.ASM và lưu với tên BAI_6A1.ASM để có thể thực hiện được nhiệm vụ sau: nhập vào một chuỗi ký tự có tối đa 10 ký tự, trong lúc nhập chỉ hiện thị ra ký tự “*”. Khi đã nhập đủ 10 ký tự hoặc khi gặp phím ESC thì sẽ in ra các ký tự đã nhập ra màn hình. Gợi ý: dùng hàm 08h, 02h hoặc 09h của int 21h, lệnh loop, cmp, Cần phải khai báo dùng đệm để lưu các ký tự đã nhập. Bài 6 – Xử lý chuỗi ký tự Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 29 - Hãy sửa đổi file BAI_6A1.ASM, kết hợp với file BAI_6A.ASM (chương trình mẫu) và lưu với tên BAI_6A2.ASM để có thể thực hiện được nhiệm vụ sau: nhập vào một chuỗi ký tự có 10 ký tự, trong lúc nhập chỉ hiện thị ra ký tự “*”. Sau đó so sánh với một oldpass có nội dung tùy ý (nhưng chỉ có độ dài là 10 ký tự mà do writeln macro bien1 LOCAL bien1 mov ah,09 lea dx, bien1 int 21h mov ah,02h mov dl, 0ah int 21h mov dl, 0dh int 21h endm dseg segment tbao db "Chuong tring so sanh oldpass va newpass$" oldpass db "0123456789" newpass db "1234567890" tbao1 db "Haichuoi giong nhau $" tbao2 db "Haichuoi khong giong nhau $" dseg ends cseg segment assume cs:cseg, ds:dseg, es: dseg begin: mov ax, dseg mov ds, ax mov es, ax writeln tbao cld ; chonchieu xu ly chuoi mov cx, 10 ; so ky tu/so byte can so sanh lea si, oldpass; (DS:SI)--> dia chi cua chuoi nguon lea di, newpass; (ES:DI)--> dia chi cua chuoi dich repe cmpsb ; so sanh tung ky tu/byte je intb1 writeln tbao2 jmp thoat intb1: writeln tbao2 thoat: mov ah,08h int 21h mov ah, 4ch int 21h cseg ends end begin Bài 6 – Xử lý chuỗi ký tự Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 30 chúng ta gán trước, ví dụ như oldpass db “1234567890”). Nếu 10 ký tự vừa nhập có nội dung giống oldpass thì in ra câu thông báo “Ban da nhap dung roi” và thoát, ngược lại thì in ra câu thông báo “Ban da nhap sai roi va vui long nhap lai” và quay trở lại nhập cho đến khi nào đúng mới thoát. Gợi ý: dùng hàm 08h, 02h, 09h của int 21h và các lệnh loop, cmpsb,. 3.2. Di chuyển 33 bytes từ nội dung của string1 sang string2, sau đó in nội dung của string2 ra màn hình. Soạn thảo như đoạn chương trình mẫu và lưu với tên là BAI_6B.ASM. - Biên dịch và cho chạy file BAI_6B.ASM để kiểm tra và xem kết quả. - Tại sao chỉ di chuyển 33 ký tự/byte mà lại khai báo biến string2 db 34 dup(‘$”). Thử thay 34 thành 33 và tiến hành biên dịch, chạy chương trình để xem kết quả. Có nhận xét gì về vấn đề này không ?. Giải thích ý nghĩa của việc khai báo này. - Thay lệnh CLD trong đoạn chương trình mẫu thành STD. Biên dịch và cho chạy chương trình để kiểm chứng kết quả. Cho nhận xét về kết quả nhận được. - Nếu thay lệnh movsb thành MOVSW thì chúng ta có phải thay đổi giá trị nào trong đoạn chương trình mẫu trên không ?. Nếu có thay đổi, hãy biên dịch và chạy chương trình để kiểm chứng lại kết quả. dseg segment string1 db "Khong co gi quy hon doc lap tu do" string2 db 34 dup('$') dseg ends cseg segment assume cs:cseg, ds:dseg, es: dseg begin: mov ax, dseg mov ds, ax mov es, ax cld ; chon chieu xu ly chuoi mov cx, 33 ; so ky tu/so byte can di chuyen lea si, string1 ; (DS:SI)--> dia chi cua chuoi nguon lea di, string2 ; (ES:DI)--> dia chi cua chuoi dich rep movsb ; di chuyen tung byte mov ah, 09h lea dx, string2 int 21h mov ah,08h ; dung man hinh de xem ket qua int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin Bài 6 – Xử lý chuỗi ký tự Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 31 - Có thể thay thế lệnh REP MOVSB bởi một số lệnh khác hay không? Nếu được thì hãy thay đổi và sau đó biên dịch, cho chạy chương trình để kiểm chứng lại kết quả. - Giả sử ta có nội dung của một biến string1 có tổng số byte >256 byte thì lúc đó chúng ta phải khai báo lại các biến này như thế nào ?. Lúc này có khó khăn gì xảy ra không ?. Hãy thử sửa lại, sau đó biên dịch và chạy chương trình để xem kết quả. - Có cách nào xác định chiều dài của một biến bất kỳ hay không ?. Hãy cho biết các cú pháp của lệnh có thể thực hiện được yêu cầu này. Sau đó thử áp dụng để xác định chiều dài của biến string1. 3.3. Tìm ký tự “A” có trong một chuỗi ký tự bất kỳ, nếu có thì in ra câu thông báo là có ký tự “A” trong chuỗi ký tự và ngược lại. Soạn thảo như đoạn chương trình mẫu và lưu với tên là BAI_6C.ASM. - Biên dịch và cho chạy file BAI_6C.ASM để kiểm tra và xem kết quả. write macro bien1 mov ah, 09h lea dx, bien1 int 21h endm dseg segment string1 db "NGAC NHIEN CHUA ?" tb1 db "co ky tu A trong chuoi string1 $" tb2 db "khong ky tu A trong chuoi string1 $" dseg ends cseg segment assume cs:cseg, ds:dseg, es: dseg begin: mov ax, dseg mov ds, ax mov es, ax cld ; chonchieu xu ly chuoi mov cx, 17 ; so ky tu can tim mov al, 'A' ; tim kien ky tu A trong string1 lea di, string1 ; (ES:DI)--> dia chi cua chuoi dich repne scasb ; lap lai viec tim kiem ky tu cho den jne intb2 ; khi gap duoc hoac den het chuoi write tb1 jmp thoat intb2: write tb2 thoat: mov ah,08h ; dung man hinh de xem ket qua int 21h mov ah, 4ch ; thoat ve Dos int 21h cseg ends end begin Bài 6 – Xử lý chuỗi ký tự Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 32 - Thay lệnh MOV AL, ‘A’ thành MOV AL, ‘B’, sau đó biên dịch và chạy chương trình để xem kết quả. - Giải thích nhiệm vụ của các lệnh từ CLD cho đến JNE INTB2. Có thể thay thế lệnh REPNE SCASB thành các lệnh khác được không ?. Nếu được hãy thay thế chúng, biên dịch và chạy chương trình để kiểm chứng lại kết quả. Phụ Lục – Môi trường phát triển hợp ngữ RadASM Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 33 Phụ lục Môi trường phát triển hợp ngữ RadASM RadASM là môi trường phát triển Hợp ngữ, được xây dựng để kết hợp những hợp ngữ khác nhau nhau MASM, TASM, HASM . và chạy trên môi trường Windows. Mỗi hợp ngữ khác nhau khi kếp hợp vào RadASM phải được cấu hình khác nhau. Vì mục đích cung cấp công cụ cho sinh viên sử dụng đơn gian, nên RadASM đã được cấu hình phù hợp với hợp ngữ MASM for DOS. Vì thế trong quá trình sử dụng, sinh viên không cần phải cấu hình gì thêm. 1. Khởi động RadASM Nhấp đúp biểu tượng trên desktop thì màn hình làm việc của RadASM xuất hiện như hình 1. Màn hình làm việc của RadASM chia thành 2 vùng: • Vùng soạn thảo dùng để soạn thảo chương trình nguồn ASM • Vùng thông báo kết quả: Khi dịch chương trình, những kết quả hay lỗi sẽ xuất hiện tại vùng này Hình 1: Màn hình làm việc của RadASM Số thứ tự dòng lệnh Vùng soạn thảo Vùng thông báo kết quả Dịch chương trình Phụ Lục – Môi trường phát triển hợp ngữ RadASM Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 34 Hình 2: Menu FILE Hình 2: Menu MAKE Các menu thường dùng là FILE (hình 2) và MAKE (hình 3), các lệnh thường dùng: • New File (Ctrl+N): Mở file mới để soạn thảo chương trình mới • Open File (Ctrl+O): Mở file đã lưu sẳn trên đĩa • Save File (Ctrl+S): Lưu file thành tên (nhớ đặt tên file không có khoảng trắng, phần mở rộng ASM được thêm vào tự động) • Assemble (F5): Hợp dịch file nguồn (ASM) thành file đối tượng (OBJ) • Link (Alt+Ctrl+F5): Liên kết file đối tượng (OBJ) thành file thực thi (EXE) • Run! (Ctrl+Shift+F5): Thực thi chương trình (EXE) 2. Soạn thảo file chương trình nguồn Chọn lệnh New File trong menu FILE (hay bấm phím nóng tương ứng) để mở vùng soạn thảo mới, trong vùng soạn thảo, sử dụng các chức năng soạn thảo giống như các trình soạn thảo khác. Sau khi soạn thảo file nguồn xong phải lưu lại thành tên file có phần mở rộng là ASM. Và trong tên file không có chứa khoảng trắng. 3. Hợp dịch (Assemble) Sau khi lưu file chương trình nguồn xong, chọn Assemble trong menu MAKE (Hay bấm phím nóng tương ứng) để tiến hành hợp dịch chương trình nguồn. • Nếu chương trình có lỗi cú pháp thì vùng thông báo có dạng hình 4. Trong đó từng lỗi được chỉ ra bởi số thứ tự dòng lệnh và mã lối Ví dụ: chuoi2.asm(18) : error A2008: syntax error : mod Lỗi ở dòng 18, mã lỗi A2008: sai cú pháp mod Phụ Lục – Môi trường phát triển hợp ngữ RadASM Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 35 Hình 4: Thông báo kết quả Hợp dịch không thành công • Khi chương trình xuất hiện lỗi thì file đối tượng (OBJ) không được tạo ra và người lập trình phải sửa lại cho đến khi không còn lỗi. • Khi không có lỗi chương trình (Hợp dịch thành công) thì trong vùng thông báo xuất hiện như hình 5 và file đối tượng (OBJ) được tạo ra. Khi đó mới chuyển sang bước LIÊN KẾT Hình 5: Thông báo kết quả Hợp dịch thành công 4. Liên kết (Link) Chọn lệnh Link trong menu MAKE. (hay bấm phím nóng tương ứng) Sau khi hoàn thành bước hợp dịch, thì bước liên kết là bước cuối cùng để tạo ra file thực thi (EXE). Trong bước này, không còn kiểm tra lỗi cú pháp nữa và thông thường sẽ liên kết thành công và file thực thi EXE sẽ được tạo ra. Nội dung thông báo khi liên kết thành công như hình 6. Hình 6: Liên kết thành công 5. Thực thi chương trình EXE Để thực thi chương trình vừa liên kết xong, chọn lệnh RUN trong menu MAKE (hay bấm phím nóng tương ứng) . Nếu chương trình có truy xuất đến bàn phím hay màn hình thì 1 cửa sổ (dạng màn hình của hệ điều hành DOS) xuất hiện như hình 7. Cửa sổ này được tạo ra để hiển thị kết quả hay để người dùng tương tác với chương trình đang chạy. Phụ Lục – Môi trường phát triển hợp ngữ RadASM Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 36 Nếu chương trình không có thao tác nào để truy xuất bàn phím hay màn hình thì chúng ta không thấy được cửa sổ này. Như vậy, trong lập trình hợp ngữ, nếu muốn nhìn thấy kết quả gì đó thì chúng ta phải có những đoạn lệnh tương ứng để xuất giá trị ra màn hình. Hình 7: Cửa sổ kết quả chương trình
File đính kèm:
- giao_trinh_thuc_hanh_lap_trinh_he_thong_nguyen_hua_duy_khang.pdf