Xem mẫu
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các đặc trưng của chỉ thị chuỗi
Một chỉ thị chuỗi có thể xử lý trên một byte, một từ hay từ kép
-
Các chỉ thị chuỗi sử dụng các thanh ghi DS:SI hoặc ES:DI, trong đó SI và
-
DI chứa địa chỉ offset
5 chỉ thị chuỗi thường sử dụng:
-
di chuyển 1 byte, từ hoặc từ kép từ vi trí này đến vị trí khác trong bộ
MOVS
nhớ
nạp từ bộ nhớ 1 byte vào AL, một từ vào AX, hoặc từ kép vào EAX
LODS
cất nội dung các thanh ghi AL,AX hoặc EAX vào bộ nhớ
STOS
So sánh các vùng nhớ trong bộ nhớ theo byte, từ hay từ kép
CMPS
So sánh nội dung của các thanh ghi AL,AX,EAX với nội dung của
SCAS
một vùng nhớ
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị MOVS
* Chức năng: Di chuyển chuỗi (sao chép nội dung chuỗi)
Giá trị Điều kiện
Thao tác Thanh ghi
Địa chỉ vùng dữ liệu đích ES:DI
Vào DI
Địa chỉ vùng dữ liệu nguồn DS:SI
SI
Số ký tự cần di chuyển
CX
* Ví dụ: Chép nội dung của chuỗi N1 vào N2 (với N2 là chuỗi rỗng)
.MODEL SMALL .CODE
.DATA MOV AX,@DATA
N1 DB 'Assembler$' MOV DS,AX
N2 DB 10 DUP(' ') MOV ES,AX
MSG5 DB 0Ah,0Dh,'Chuoi thu nhat=$' CALL DICHUYEN
MSG6 DB 0Ah,0Dh,'Chuoi thu hai=$' CALL INKETQUA
MOV AH,1
INT 21h
MOV AH,4Ch
INT 21h
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị MOVS
INKETQUA PROC NEAR
DICHUYEN PROC NEAR
MOV AH,9
MOV CX,10
LEA DI,N2
LEA DX,MSg5
LEA SI,N1
INT 21h
REP MOVSB
LEA DX,N1
RET
INT 21h
DICHUYEN ENDP
LEA DX,MSG6
INT 21h
LEA DX,N2
INT 21h
RET
INKETQUA ENDP
Demo
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị thay đổi cờ hướng DF
Cờ hướng DF xác định hướng mà chỉ thị chuỗi được lặp lại (0: trái sang
-
phải, 1=phải sang trái)
Các chỉ thị thiết lập cờ hướng:
-
* Chỉ thị CLD: Xóa DF về 0
* Chỉ thị STD: Thiết lập cờ DF lên 1
V í dụ :
;Thiết lập DF=1
STD
MOV CX,20
LEA DI,S2
LEA SI,S1
REP MOVSB
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Tiền tố lặp lại - REP
Cho phép lặp lại việc thực thi chỉ thị dựa trên giá trị CX
-
Sau mỗi lần lặp, CX giảm đi 1 cho đến khi CX=0
-
Cờ hướng DF xác định hướng mà chuỗi lặp lại:
-
* Xử lý từ trái sang phải: dùng chỉ thị CLD xóa cờ DF về 0
* Xử lý từ phải sang trái: dùng chỉ thị STD để thiết lập cờ DF về 1
V í dụ :
CLD
MOV CX,20
LEA DI,STRING2
LEA SI,STRING1
REP MOVSB JCXZ LABEL2
LABEL1:
MOV AL,[SI]
MOV [DI],AL
INC DI
INC SI
LOOP LABEL1
LABEL2:......
- Các lệnh khác: REPE/REPZ – REPNE/REPNZ ( Điều kiện bởi Cờ ZF)
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị LODS
* Chức năng: Nạp chuỗi
- Nạp từ bộ nhớ vào AL (byte), vào AX (từ)
- Địa chỉ vùng dữ liệu được nạp vào DS:SI
- Giảm/tăng nội dung SI bởi 1 (nạp byte), bởi 2 (nạp từ) với cờ DF
Giá trị Điều kiện
Thao tác Thanh ghi
Địa chỉ vùng dữ liệu đích ES:DI
Vào DI
Địa chỉ vùng dữ liệu nguồn DS:SI
SI
Số ký tự cần nạp
CX
* Ví dụ: Chép nội dung của chuỗi N1 vào N2 theo thứ tự ngược lại (với N2 là
chuỗi rỗng) CLD
MOV CX,10
LEA SI,N1
LEA DI,N2+9
LAP:
LODSB
MOV [DI],AL
DEC DI
LOOP LAP
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị STOS
* Chức năng: Lưu chuỗi
- Nạp nội dung AL (byte), AX (từ) vào bộ nhớ
- Địa chỉ vùng lưu dữ liệu được chứa vào ES:DI
- Giảm/tăng nội dung DI bởi 1 (lưu byte), bởi 2 (lưu từ) với cờ DF
Giá trị Điều kiện
Thao tác Thanh ghi
Địa chỉ vùng dữ liệu đích ES:DI
Vào DI
Số ký tự cần nạp
CX
* Ví dụ: Lặp 5 lần việc lưu một từ chứa giá trị 2020h vào N1
CLD
MOV CX,5
MOV AX,2020h
LEA DI,N1
REP STOSW
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị CMPS
* Chức năng: So sánh chuỗi
- So sánh nội dung vùng nhớ tại DS:SI và ES:DI
- Giảm/tăng nội dung SI, DI bởi 1 (lưu byte), bởi 2 (lưu từ) với cờ DF
- Chỉ so sánh các giá trị ASCII
Giá trị Điều kiện
Thao tác Thanh ghi
Địa chỉ vùng dữ liệu DS:SI, ES:DI
Vào SI, DI
Số ký tự cần so sánh
CX
* Ví dụ: So sánh hai chuỗi N1 và N2
CLD
MOV CX,10
LEA SI,N1
LEA DI,N2
REPE CMPSB
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Dữ liệu có dấu và không dấu
- Các chỉ thị ADD, SUB không phân biệt dữ liệu có dấu/không dấu và
không tác động lên cờ CF và OF
- Ví dụ:
Nhị phân Không dấu Có dấu OF CF
11110001 249 -7
00000010 +2 +5
11111011 251 -5 0 0
Số nhớ
- Phép cộng tạo ra số nhớ từ việc cộng 2 bit cực trái
- Ví dụ:
Nhị phân Không dấu Có dấu OF CF
11111100 252 -4
00000101 +5 +5
11111011 1 +1 0 1
(đúng)
(sai)
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Phép nhân nhị phân
Chỉ thị MUL thực hiện nhân dữ liệu không dấu
-
Chỉ thị IMUL thực hiện nhân dữ liệu có dấu
-
Ảnh hưởng cờ CF và OF
-
- Cú pháp: MUL/IMUL
Nhân byte với byte
Số hạng bị nhân lưu trong AL
-
Số nhân lưu trong 1 byte bộ nhớ hoặc 1 thanh ghi khác
-
Kết quả được chứa trong AX
-
Ví dụ:
- MUL DL
AL
Trước khi nhân AH
(Số bị nhân)
AX
Sau khi nhân (Chứa tích số)
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Nhân từ với từ
- Số hạng bị nhân lưu trong AX
- Số nhân lưu trong 1 từ bộ nhớ hoặc 1 thanh ghi khác
- Kết quả được chứa trong DX:AX, với phần thấp chứa trong AX và phần
cao chứa trong DX
- Ví dụ: MUL DX
AX
Trước khi nhân DX
(Số bị nhân)
DX AX
Sau khi nhân Phần cao Phần thấp
Tích số
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Nhân nhiều từ
Điều gì xảy ra khi nhân 1365 x 12?
-
Nhân từng 2 số hiệu với nhau, nghĩa là: nhân 13 và 65 cho 12, ta có:
13 x 12=156 và 65x12=780
Cộng các tích số (với 13 ở vị trí hàng trăm nên được x 100)
15600 + 780 = 16380
Ứng dụng kỷ thuật này để thực hiện các phép nhân giữa các kiểu dữ liệu
-
khác nhau
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Nhân bằng cách dịch bit
Nhân một số với lũy thừa của 2 (2,4,8,..) Dịch trái số bị nhân một số bit
tương ứng
V í dụ:
- Nhân với 2 (dịch trái 1 bit): SHL AX,01
- Nhân với 8 (dịch trái 3 bit): MOV CL,3
SHL AX,CL
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Phép chia nhị phân
Chỉ thị DIV thực hiện chia dữ liệu không dấu
-
Chỉ thị IDIV thực hiện chia dữ liệu có dấu
-
Các phép chia cơ bản: Chia từ/byte, Từ kép/từ,..
-
Ảnh hưởng cờ CF và OF
-
- Cú pháp: DIV/IDIV
Chia từ cho byte
Số bị chia lưu trong AX
-
Số chia lưu trong 1 byte bộ nhớ hoặc 1 thanh ghi khác
-
Kết quả được chứa trong AL và dư số chứa trong AH
-
Ví dụ:
- DIV CL
AX
Trước khi chia
Số bị chia
AH AL
Sau khi chia
Dư số Thương số
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Chia từ kép cho từ
Số bị chia lưu trong DX:AX
-
Số chia lưu trong 1 từ bộ nhớ hoặc 1 thanh ghi khác
-
Kết quả được chứa trong AX và dư số chứa trong DX
-
Ví dụ:
- DIV CX
DX:AX
Trước khi chia
Số bị chia
DX AX
Sau khi chia
Dư số Thương số
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Các chỉ thị xử lý dữ liệu nhị phân
Chia bằng cách dịch bit
Chia một số với lũy thừa của 2 (2,4,8,..) Dịch phải số bị chia một số bit
tương ứng
V í dụ:
- Chia với 2 (dịch phải 1 bit): SHR AX,01
- Chia với 8 (dịch phải 3 bit): MOV CL,3
SHR AX,CL
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Chỉ thị xử lý dữ liệu ASCII
Các chỉ thị AAA, AAS trực tiếp hiệu chỉnh trên dữ liệu ASCII
-
Hiệu chỉnh giá trị trong AL và lưu kết quả trong AX
-
AAA được dùng hiệu cỉnh sau khi thực hiện phép cộng
-
AAS được dùng hiệu cỉnh sau khi thực hiện phép trừ
-
- Cú pháp: AAA/AAS
Ví dụ:
-
MOV AL,35h
SUB AL,30h
Tương đương:
MOV AL,35h
AAA
Để lấy lại kết quả ban đầu dạng ASCII, chèn số 3 vào trước số bên trái
-
AH và AL:
V í dụ : OR AL,30h
OR AX,3030h
- Chöông 4: Caùc chæ thò chuoãi, döõ lieäu nhò phaân vaø ASCII
Một số ví dụ ứng dụng các chỉ thị
Ví dụ: Chuyển đổi một số N (0255) sang hệ nhị phân 8 bit
Demo
nguon tai.lieu . vn