Hướng dẫn tổng quát về lập trình hệ thống cơ bản phần 7

5 26 0
Hướng dẫn tổng quát về lập trình hệ thống cơ bản phần 7

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

Thông tin tài liệ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 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….

Bài – Xử lý chuỗi ký tự Bài 6: Xử Lý Chuỗi Ký Tự Mục Tiêu: - Viết chương trình xử lý chuỗi ký tự lệnh xử lý chuỗi Kiến thức cần chuẩn bị: - Bảng mã ASCII - Kết thí nghiệm trước - Các hàm 01h, 02h, 06h, 08h, 09h, 0Ah INT 21h lệnh xử lý chuỗi MOVSB/W, SCASB/W, STOSB/W, CMPSB/W… Nội dung thực hành: 3.1 So sánh hai chuỗi oldpass newpass Nếu hai chuỗi giống kết luận giống ngược lại Soạn thảo đoạn chương trình lưu với tên BAI_6A.ASM - Biên dịch cho chạy file BAI_6A.ASM để kiểm tra xem kết - Trong macro writeln, lệnh có chức xuống dòng sau in xong chuỗi ký tự - Mục đích việc khai báo LOCAL bien1 macro gì? - Hãy cho biết địa DS ES có giống hay khơng? Điều thể qua câu lệnh đoạn chương trình mẫu? Tại người ta khơng khai báo DS ES phân đoạn khác ? - Tiền tố REPE đoạn chương trình mẫu có ý nghĩa nào? - Ta thay đổi lệnh REPE CMPSB thành nhóm lệnh khác khơng? Nếu thay đổi nó, biên dịch chạy chương trình để kiểm chứng - Thử thay đổi nội dung oldpass newpass cho chúng giống Biên dịch chạy chương trình xem kết quả, sau giải thích chế làm việc đoạn lệnh từ lệnh CLD lệnh REPE CMPSB Giả sử, người ta muốn thay lệnh cmpsb thành lệnh cmpsw, bạn có cần sửa đổi lệnh chương trình hay khơng ? Tại ? Biên dịch chạy chương trình để kiểm chứng - - Lệnh jmp thoat đoạn chương trình có nhiệm vụ ? Thử bỏ lệnh jmp thoat sau biên dịch chạy chương trình xem kết - Hãy sửa đổi file BAI_6A.ASM lưu với tên BAI_6A1.ASM để thực nhiệm vụ sau: nhập vào chuỗi ký tự có tối đa 10 ký tự, lúc nhập thị ký tự “*” Khi nhập đủ 10 ký tự gặp phím ESC in ký tự nhập hình Gợi ý: dùng hàm 08h, 02h 09h int 21h, lệnh loop, cmp, … Cần phải khai báo dùng đệm để lưu ký tự nhập Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 28 Bài – Xử lý chuỗi ký tự 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 $" tbao2 db "Haichuoi khong giong $" 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 - 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) lưu với tên BAI_6A2.ASM để thực nhiệm vụ sau: nhập vào chuỗi ký tự có 10 ký tự, lúc nhập thị ký tự “*” Sau so sánh với oldpass có nội dung tùy ý (nhưng có độ dài 10 ký tự mà Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 29 Bài – Xử lý chuỗi ký tự gán trước, ví dụ oldpass db “1234567890”) Nếu 10 ký tự vừa nhập có nội dung giống oldpass in câu thông báo “Ban da nhap dung roi” thốt, ngược lại in câu thơng báo “Ban da nhap sai roi va vui long nhap lai” quay trở lại nhập thoát Gợi ý: dùng hàm 08h, 02h, 09h int 21h lệnh loop, cmpsb,… 3.2 Di chuyển 33 bytes từ nội dung string1 sang string2, sau in nội dung string2 hình Soạn thảo đoạn chương trình mẫu lưu với tên BAI_6B.ASM - Biên dịch cho chạy file BAI_6B.ASM để kiểm tra xem kết 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 - Tại 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 tiến hành biên dịch, chạy chương trình để xem kết Có nhận xét vấn đề khơng ? Giải thích ý nghĩa việc khai báo - Thay lệnh CLD đoạn chương trình mẫu thành STD Biên dịch cho chạy chương trình để kiểm chứng kết Cho nhận xét kết nhận - Nếu thay lệnh movsb thành MOVSW có phải thay đổi giá trị đoạn chương trình mẫu khơng ? Nếu có thay đổi, biên dịch chạy chương trình để kiểm chứng lại kết Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 30 Bài – Xử lý chuỗi ký tự - Có thể thay lệnh REP MOVSB số lệnh khác hay khơng? Nếu thay đổi sau biên dịch, cho chạy chương trình để kiểm chứng lại kết - Giả sử ta có nội dung biến string1 có tổng số byte >256 byte lúc phải khai báo lại biến ? Lúc có khó khăn xảy khơng ? Hãy thử sửa lại, sau biên dịch chạy chương trình để xem kết - Có cách xác định chiều dài biến hay không ? Hãy cho biết cú pháp lệnh thực yêu cầu Sau thử áp dụng để xác định chiều dài biến string1 3.3 Tìm ký tự “A” có chuỗi ký tự bất kỳ, có in câu thơng báo có ký tự “A” chuỗi ký tự ngược lại Soạn thảo đoạn chương trình mẫu lưu với tên BAI_6C.ASM 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 chuoi string1 $" tb2 db "khong ky tu A 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 string1 lea di, string1 ; (ES:DI) > dia chi cua chuoi dich repne scasb ; lap lai viec tim kiem ky tu cho den jne intb2 ; 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 - Biên dịch cho chạy file BAI_6C.ASM để kiểm tra xem kết Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 31 Bài – Xử lý chuỗi ký tự - Thay lệnh MOV AL, ‘A’ thành MOV AL, ‘B’, sau biên dịch chạy chương trình để xem kết - Giải thích nhiệm vụ lệnh từ CLD JNE INTB2 Có thể thay lệnh REPNE SCASB thành lệnh khác không ? Nếu thay chúng, biên dịch chạy chương trình để kiểm chứng lại kết Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh 32 ... biên dịch, chạy chương trình để xem kết Có nhận xét vấn đề khơng ? Giải thích ý nghĩa việc khai báo - Thay lệnh CLD đoạn chương trình mẫu thành STD Biên dịch cho chạy chương trình để kiểm chứng... endm dseg segment tbao db "Chuong tring so sanh oldpass va newpass$" oldpass db "012345 678 9" newpass db "12345 678 90" tbao1 db "Haichuoi giong $" tbao2 db "Haichuoi khong giong $" dseg ends cseg segment... Nếu thay lệnh movsb thành MOVSW có phải thay đổi giá trị đoạn chương trình mẫu khơng ? Nếu có thay đổi, biên dịch chạy chương trình để kiểm chứng lại kết Ths Nguyễn Hứa Duy Khang, Ks Trần Hữu Danh

Ngày đăng: 11/05/2021, 02:57

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

Tài liệu liên quan