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, đế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