Dạng 1: MOVSB
Lệnh trên sao chép 1 byte dữ liệu từ ô nhớ có địa chỉ DS:SI sang ô nhớ có địa chỉ ES:DI.
Dạng 2: MOVSW
Lệnh trên sao chép 1 word dữ liệu từ ô nhớ có địa chỉ DS:SI sang ô nhớ có địa chỉ ES:DI.
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 26
Ví dụ 1:
Xét hai chuỗi được khai báo như sau: .DATA
Chuoi1 DB ‘Khoa CNTT$’ Chuoi2 DB 10 DUP (?)
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 27
Giải:
Để thực hiện yêu cầu trên ta sẽ lần lượt sao chép từng byte của Chuoi1 sang Chuoi2.
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 28 ‘K’ ← DS:SI Chuoi1 ‘h’ 10 byte ‘o’ ‘a’ ‘ ’ ‘C’ ‘N’ ‘T’ ‘T’ ‘$’ ? ← ES:DI Chuoi2 ? 10 byte ...
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 29
Muốn sao chép byte đầu tiên (kí tự ‘K’) thì DS:SI phải chứa địa chỉ đầu của Chuoi1, ES:DI phải chứa địa chỉ đầu của Chuoi2. Điều này được thực hiện bởi các lệnh sau:
LEA SI, Chuoi1 ;SI chứa offset của Chuoi1 LEA DI, Chuoi2 ;DI chứa offset của Chuoi2 MOVSB ;Chuyển 1 byte
Mỗi chuỗi có độ dài 10 byte nên phải lặp lại quá trình trên 10 lần thì mới sao chép xong.
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 30
Chú ý:
Mỗi khi sao chép xong 1 byte thì phải tăng SI và DI lên 1 để nó trỏ tới ô nhớ tiếp theo.
Sau mỗi lệnh MOVSB thì SI và DI sẽ được tự động tăng lên 1 nếu cờ DF = 0 (SI & DI sẽ tự động giảm đi 1 nếu cờ DF=1). Như vậy vấn đề là phải xoá được cờ DF trước khi thi hành lệnh MOVSB. Điều này được thực hiện nhờ lệnh CLD (Clear Direction Flag):
LEA SI, Chuoi1 ;SI chứa offset của Chuoi1 LEA DI, Chuoi2 ;DI chứa offset của Chuoi2 CLD ;Xoá cờ định hướng: DF = 0 MOVSB ;Chuyển 1 byte
Ngược lại với lệnh CLD là lệnh STD (Set Direction Flag), lệnh này sẽ thiết lập cờ DF=1. Ta có thể sử dụng lệnh STD để chuyển các byte dữ liệu theo chiều ngược lại.
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 31 TITLE Vi du Chuoi .MODEL SMALL .STACK 100H .DATA Chuoi1 DB ’Khoa CNTT$’ Chuoi2 DB 10 DUP (?) .CODE MAIN PROC
MOV AX, @DATA MOV DS, AX MOV DS, AX
MOV ES, AX ;DS và ES chứa segment của đoạn dữ liệu MOV CX, 10 ;Số lần lặp
LEA SI, Chuoi1 ;SI chứa offset của Chuoi1 LEA DI, Chuoi2 ;DI chứa offset của Chuoi2 CLD ;Xoá cờ định hướng: DF = 0 Lap:
MOVSB ;Thực hiện lặp 10 lần LOOP Lap
MOV AH, 9h ;Hiển thị chuỗi 2 để kiểm tra kết quả LEA DX, Chuoi2 INT 21h MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 32
Ví dụ 2:
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 33
Giải:
Do lệnh MOVSW mỗi lần sao chép được 2 byte nên chỉ phải thực hiện lặp 5 lần, các lệnh cụ thể như sau:
MOV CX, 5 ;Số lần lặp
LEA SI, Chuoi1 ;SI chứa offset của Chuoi1 LEA DI, Chuoi2 ;DI chứa offset của Chuoi2 CLD ;Xoá cờ định hướng: DF = 0 Lap:
MOVSW ;Thực hiện lặp 5 lần LOOP Lap
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 34