Bàithựchànhsố 5 Làm việcvớixâukítự Mục đích Biết sử dụng các phép toán trên chuỗi Biết làm một số thao tác vớixâukítự (tìm kiếm, đếm từ, chuyển hoa / thường …. ) Tóm tắt lý thuyết Cờ hướng DF (Direction Flag) : xác định hướng xử lí chuỗi. Khi DF = 0 (dùng lệnh CLD) chuỗi được xử lí tăng dần, ngược lại DF = 1 (lệnh STD) chuỗi được xử lí giảm dần. Con trỏ chuỗi: DS:SI – địa chỉ nguồn và ES:DI – địa chỉ đích Các lệnh trên chuỗi : 1. MOVSB (MOVSW) : chuyển nội dung của byte (word) được định bởi DS:SI đến byte (word) được chỉ bởi ES: DI. Sau đó SI và DI tự động tăng lên 1 (hoặc 2) nếu cờ DF = 0 hay giảm 1 (hoặc 2) nếu DF = 1 Ví dụ: giả sử cần chép nội dung chuỗi thứ nhất : ‘HELLO’ vào chuỗi thứ hai theo thứ tự ngược lại ta làm như sau : .DATA STR1 DB ‘HELLO’ STR2 DB 5 DUP(‘?’) .CODE MOV AX, @DATA MOV DS, AX MOV ES, AX LEA SI, STR1+4 ; cuối STR1 LEA DI, STR2 ; đầu STR2 STD ; định hướng xử lí giảm MOV CX, 5 move : MOVSB ADD DI,2 ; + 2 do DI bị giảm ; 1 sau lệnh MOVSB LOOP move 2. STOSB (STOSW): chuyển nội dung của thanh ghi AL (AX) đến byte (word) được định bởi ES:DI. Sau đó DI tự động tăng lên 1 (hoặc 2) nếu cờ DF = 0 hay giảm 1 (hoặc 2) nếu DF = 1. Ví dụ: Đọc và lưu một chuỗi kítự bằng chức năng AH = 1, ngắt 21H NhapChuoi PROC ;Vào: DI = chứa offset của chuỗi ;Ra: DI = nội dung chuỗi vừa nhập ; BX = kích thước chuỗi CLD ; đặt cờ DF theo hướng tăng XOR BX, BX ; gán BX = 0 MOV AH, 1 INT 21H while1 : CMP AL, 13 ; nếu gõ ENTER JE end_while1 ; kết thúc nhập CMP AL, 8 ; nếu gõ BS JNE else1 ;không phải lưu chuỗi DEC DI ;ngược lại lùi 1 kítự DEC BX ;giảm kích thước chuỗi JMP read ; đọc kítự khác else1: STOSB INC BX read: INT 21H JMP while1 end_while1: ; thoát khỏi vòng lặp 4. LODSB (LODSW) : chuyển nội dung của byte (word) được định bởi DS:SI vào AL (hoặc AX) sau đó tăng (hoặc giảm) SI 1 (hoặc 2) đơn vị. 5. SCASB (SCASW): tìm nội dung chứa trong AL (hoặc AX) có trong chuỗi định bởi ES:DI hay không. Nếu tìm thấy thì cờ ZF sẽ được bật. Sau mỗi lần thực hiện con trỏ DI sẽ tăng hoặc giảm 1 (hoặc 2) đơn vị. 6. CMPSB (CMPSW) : so sánh byte tại DS:SI và byte tại ES:DI, sau đó tăng (hoặc giảm) SI và DI 1 (hoặc 2) đơn vị. Bài tập 1. VCT nhập một chuỗi kítự và in ra chuỗi theo thứ tự ngược lại. In chiều dài chuỗi. Ví dụ : Nhập chuỗi : abcd Chuỗi kết quả: dcba Chiều dài chuỗi: 4 2. VCT nhập họ tên .Sau đó biến tất cả thành chữ hoa rồi in ra. Biến tất cả thành chữ thường rồi in ra. Ví dụ: Nhập vào chuỗi : Thanh cHi khanG Chuỗi Hoa : THANH CHI KHANG Chuỗi kết quả thường: thanh chi khang 3. Nhập một chuỗi kítự tính tần số xuất hiện của các nguyên âm. Ví dụ : Nhập chuỗi : Thanh Chi Khang Số lần xuất hiện của các nguyên âm là: 3 4. VCT nhập hai chuỗi, liệt kê các kítự có mặt trong hai chuỗi. Ví dụ: Nhập chuỗi: computer và chuỗi : informatic Các kítự có mặt trong hai chuỗi : o, m, t, r 5. Nhập vào hai chuỗi kí tự, so sánh hai chuỗi (= > < ). Ví dụ: Chuỗi thứ nhất: forn Chuỗi thứ hai : form Kết quả : Chuỗi thứ nhất > chuỗi thứ hai. 6. Nhập vào hai chuỗi kí tự, kiểm tra chuỗi thứ nhất là chuỗi con chuỗi tthứ hai không, không phân biệt hoa thường. Ví dụ: Chuỗi thứ nhất : form Chuỗi thứ hai: inFoRMatic Kết quả : Chuỗi thứ nhất là con chuỗi thư hai . Bài thực hành số 5 Làm việc với xâu kí tự Mục đích Biết sử dụng các phép toán trên chuỗi Biết làm một số thao tác với xâu kí tự (tìm kiếm,. else1 ;không phải lưu chuỗi DEC DI ;ngược lại lùi 1 kí tự DEC BX ;giảm kích thước chuỗi JMP read ; đọc kí tự khác else1: STOSB INC BX read: INT 21H JMP while1