Các tác vụ về chuỗi

6 220 1
Tài liệu đã được kiểm tra trùng lặp
Các tác vụ về chuỗi

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

Thông tin tài liệu

40 CHƯƠNG 7 : CÁC TÁC VỤ VỀ CHUỖI 7.1LODSB/LODSW Tác dụng : nạp vào AL (đối với LODSB) hay AX (đối với LODSW) giá trò tại đòa chỉ xác đònh bởi DS:SI . Sau đó: Nếu DF = 0 tăng SI 1 đơn vò đối với LODSB, 2 đơn vò đối với LODSW Nếu DF = 1 giảm SI 1 đơn vò đối với LODSB, 2 đơn vò đối với LODSW 7.2STOSB/STOSW Tác dụng : lấy giá trò của AL (đối với LODSB) hay AX (đối với LODSW) đặt vào byte hay word tại đòa chỉ xác đònh bởi ES:DI . Sau đó Nếu DF = 0 tăng DI 1 đơn vò đối với STOSB, 2 đơn vò đối với STOSW Nếu DF = 1 giảm DI 1 đơn vò đối với STOSB, 2 đơn vò đối với STOSW 7.3SCASB/SCASW Tác dụng : So sánh giá trò của AL (đối với SCASB) hay AX (đối với SCASW) với byte hay word tại đòa chỉ xác đònh bởi ES:DI . Sau đó Nếu DF = 0 tăng DI 1 đơn vò đối với SCASB, 2 đơn vò đối với SCASW Nếu DF = 1 giảm DI 1 đơn vò đối với SCASB, 2 đơn vò đối với SCASW 7.4CMPSB/CMPSW Tác dụng : so sánh 1 byte (đối với CMPSB) hay 1 word (đối với CMPSW) tại DS:SI với giá trò tương ứng tại ES:DI . Sau đó Nếu DF = 0 tăng SI và DI 1 đối với CMPSB, 2 đối với CMPSW Nếu DF = 1 giảm SI và DI 1 đối với CMPSB, 2 đối với CMPSW 7.5MOVSB/MOVSW Tác dụng : lấy 1 byte (đối với MOVSB) hay 1 word (đối với MOVSW) tại đòa chỉ xác đònh bởi DS:SI đặt vào đòa chỉ xác đònh bởi ES:DI . Sau đó Nếu DF = 0 tăng SI và DI 1 đối với MOVSB, 2 đối với MOVSW Nếu DF = 1 giảm SI và DI 1 đối với MOVSB, 2 đối với MOVSW Để thay đổi cờ hiệu DF bộ vi xử lý 8088/8086 có các lệnh sau : - STD : dựng cờ hiệu DF ---> DF = 1 - CLD : xóa cờ hiệu DF ---> DF = 0 7.6TIỀN TỐ REPEAT (REP) Các tác vụ về chuỗi thường được sử dụng trên nhiều byte/word liên tiếp . Do đó cần một vòng lặp để thực hiện nhiều lần một tác vụ về chuỗi . Thí dụ : mov al,020h ; dùng mã ASCII 020h (khoảng trống) mov cx,30 ; để xóa trống biến buffer1 có chiều lea di,Buffer1 ; dài 30 byte cld L1: ; stosb ; Có thể thay đoạn chương trình lặp loop L1 ; này bằng chỉ thò 41 . ; REP STOSB Các tiền tố repeat thường được sử dụng chung với các tác vụ về chuỗi để thay thế các vòng lặp nói trên . Tiền tố REP khi đi kèm với một tác vụ chuỗi sẽ có tác dụng lặp đi lặp lại tác vụ chuỗi đó cho đến khi CX = 0 . Mỗi lần lặp, CX tự động giảm 1 . Chú ý : Việc CX bò trừ 1 sau mỗi lần lặp khi sử dụng tiền tố REP không ảnh hưởng đến thanh ghi cờ hiệu như các tác vụ số học và logic. Như vậy để thực hiện n lần liên tiếp một tác vụ chuỗi ta cần làm : mov cx,n rep <tác vụ chuỗi> Tiền tố REPE (repeat while equal) : giống REP nhưng sẽ kết thúc quá trình lặp bất cứ khi nào phép so sánh có kết quả không bằng xảy ra. Tiền tố REPNE (repeat while not equal) : giống REP nhưng sẽ kết thúc quá trình lặp bất cứ khi nào phép so sánh có kết quả bằng xảy ra. REPE và REPNE thường được dùng với SCASB/SCASW hoặc CMPSB/CMPSW 7.7CHUỖI TRONG PASCAL ( KIỂU STRING ) Đối với PASCAL,chuỗi là một đoạn dữ liệu gồm nhiều byte liên tiếp nhau, và thường có ý nghóa là một dãy các ký tự hơn là một dãy các byte. Nói một cách khác, các thông tin lưu chứa trong chuỗi thường dùng để mô tả một đoạn văn theo ngôn ngữ của con người . Chuỗi chỉ là một khái niệm của người lập trình . Mỗi chuỗi của PASCAL chiếm 256 byte liên tiếp với cấu trúc : Byte đầu tiên trong một chuỗi của PASCAL được dùng để ghi nhớ độ dài hiện tại của thông tin đang được chuỗi lưu chứa . Giá trò này được gọi là str-len . Các byte kế tiếp dùng để lưu chứa thông tin của chuỗi. Thông tin của chuỗi chỉ tính từ byte đầu tiên của vùng lưu chứa thông tin đến byte thứ str-len . TURBO PASCAL đưa ra khái niệm chuỗi với kích thước tối đa bé hơn 256 byte Các chuỗi được khai báo như : string[30] có kích thước 31 byte string[50] có kích thước 51 byte 7.7CÁC THÍ DỤ ỨNG DỤNG Chuỗi được nhắc đến trong các thí dụ sau là chuỗi của PASCAL 7.7.1Đổi các mẫu tự của một chuỗi thành các chữ cái in hoa Up-string proc near ; Input ; DS:SI = Đòa chỉ của chuỗi cần đổi push ds pop es mov di,si mov cl,byte ptr es:[di] ; Chiều dài chuỗi xor ch,ch inc si inc di US-1: 42 cld lodsb call Up-char ; stosb loop US-1 ret Up-string endp Up-char proc near ; Input ; AL = ký tự cần đổi ; ; Output ; AL = ký tự đã được đổi cmp al,’a’ jb UC-end ; Kiểm tra AL có thuộc về cmp al,’z’ ; ‘a’ ’z’ hay không ja UC-end sub al,’a’-‘A’ UC-end: ret Up-char endp 7.7.2Tìm một byte trong một chuỗi Find-char proc near ; Input ; ES:DI = Đòa chỉ của chuỗi ; AL = Byte cần tìm ; Output ; ZF = 0 --> không tìm thấy ; ZF = 1 --> ES:DI là đòa chỉ của byte cần tìm mov cl,byte ptr es:[di] xor ch,ch ; CX = Str-len inc di cld repne scasb ret Find-char endp 7.7.3Tìm một chuỗi con trong một chuỗi mẹ Find-string proc near ; Input ; ES:DI = Đòa chỉ của chuỗi mẹ 43 ; DS:SI = Đòa chỉ của chuỗi con cần tìm ; Output ; ZF = 0 --> không tìm thấy ; ZF = 1 --> DX = vò trí tìm thấy trong chuỗi mẹ mov cl,byte ptr es:[di] xor ch,ch ; CX = Chiều dài của chuỗi mẹ mov bl,byte ptr ds:[si] xor bh,bh ; BX = Chiều dài của chuỗi con inc si inc di mov dx,cx cld lodsb ; Lấy ký tự đầu của chuỗi con đặt vào AL dec si ; Đònh lại SI FS-begin: repne scasb ; so sánh các ký tự của chuỗi mẹ với AL jne FS-end ; ZF = 0 --> JNE = OK dec di ; Đònh lại DI inc cx ; Đònh lại CX cmp cx,bx ; Kiểm tra chiều dài còn lại của chuỗi mẹ jb FS-end ; nếu bé hơn chuỗi con thì kết thúc ; ZF = 0 --> JNE = OK push si ; DS:SI = đòa chỉ chuỗi con push di ; ES:DI = đòa chỉ ký tự bằng với ký tự ; đầu của chuỗi con push cx mov cx,bx ; CX = chiều dài chuỗi con repe cmpsb ; Bắt đầu so sánh chuỗi con với chuỗi mẹ pop cx pop di pop si je FS-end ; ZF = 1 --> JE = OK inc di dec cx jmp FS-begin FS-end: pushf sub dx,cx inc dx ; DX = Vò trí tìm thấy trong chuỗi popf 44 ret Find-string endp Có thể sửa đổi bài trên thành một thủ tục có thể tìm một chuỗi con trong cả một segment ( 64 Kb ). 7.7.4Insert một byte vào một chuỗi Insert-Char proc near ; ; DS:SI = đòa chỉ chuỗi mẹ ; AL = byte cần chèn vào ; DX = vò trí cần chèn ( tính từ 1 ) ; push ds pop es ; ES = DS mov cl,byte ptr ds:[si] cmp cl,255 je IC-end ; Không thể chèn thêm inc byte ptr ds:[si] ; Tăng kích thước chuỗi mẹ lên 1 xor ch,ch add si,cx ; DS:SI = đòa chỉ byte cuối chuỗi mẹ mov di,si inc di sub cx,dx inc cx ; CX = tổng số ký tự cần dòch chuyển std ; SI,DI sẽ giảm sau mỗi lần MOVSB rep movsb mov byte ptr ds:[si+1],al ; DS:[SI+1] = đòa chỉ cần chèn IC-end: ret Insert-Char endp 7.7.5Delete một byte từ một chuỗi Delete-Char proc near ; ; DS:SI = đòa chỉ chuỗi mẹ ; DX = vò trí cần xóa ( tính từ 1 ) ; push ds pop es ; ES = DS mov cl,byte ptr ds:[si] cmp cl,0 je DC-end ; Không thể delete dec byte ptr ds:[si] ; Giảm kích thước chuỗi mẹ xor ch,ch add si,dx ; DS:SI = đòa chỉ byte sẽ được xóa 45 mov di,si inc si sub cx,dx ; CX = tổng số ký tự cần dòch chuyển cld rep movsb DC-end: ret Delete-Char endp 7.7.6Trích một chuỗi con từ một chuỗi mẹ Sub-string proc near ; ; Input ; DS:SI = đòa chỉ chuỗi mẹ ; ES:DI = đòa chỉ chuỗi con ; BX = số byte cần chép ; DX = vò trí bắt đầu ( tính từ 1 ) ; ; Output ; BX = chiều dài chuỗi con mov cl,byte ptr ds:[si] xor ch,ch ; CX = chiều dài chuỗi mẹ add si,dx ; DS:SI = đòa chỉ điểm bắt đầu chép mov byte ptr es:[di],0 ; Nếu điểm bắt đầu vượt quá chiều dài cmp cx,dx ; hiện tại của chuỗi mẹ thì cho lại jb SS-end ; chuỗi rỗng sub cx,dx inc cx ; CX = số byte cho đến hết chuỗi mẹ cmp cx,bx ; Nếu số byte cần chép vượt quá kích jbe SS-1 ; thước chuỗi mẹ thì chỉ chép đến mov cx,bx ; cuối chuỗi mẹ. SS-1: mov byte ptr es:[di],cl ; Gán chiều dài cho chuỗi con cld inc di rep movsb SS-end: ret Sub-string endp . STOSB Các tiền tố repeat thường được sử dụng chung với các tác vụ về chuỗi để thay thế các vòng lặp nói trên . Tiền tố REP khi đi kèm với một tác vụ chuỗi. ghi cờ hiệu như các tác vụ số học và logic. Như vậy để thực hiện n lần liên tiếp một tác vụ chuỗi ta cần làm : mov cx,n rep < ;tác vụ chuỗi& gt; Tiền tố

Ngày đăng: 29/09/2013, 11:20

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

Tài liệu liên quan