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: -

MOVS

di chuyển 1 byte, từ hoặc từ kép từ vi trí này đến vị trí khác trong bộ nhớ

LODS

nạp từ bộ nhớ 1 byte vào AL, một từ vào AX, hoặc từ kép vào EAX

STOS

cất nội dung các thanh ghi AL,AX hoặc EAX vào bộ nhớ

CMPS

So sánh các vùng nhớ trong bộ nhớ theo byte, từ hay từ kép

SCAS

So sánh nội dung của các thanh ghi AL,AX,EAX với nội dung của 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)

Thao tác Thanh ghi Giá trị Điều kiện

Vào DI Địa chỉ vùng dữ liệu đích ES:DI

SI

Địa chỉ vùng dữ liệu nguồn DS:SI

CX Số ký tự cần di chuyển

* 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 .DATA N1 DB 'Assembler$' N2 DB 10 DUP(' ') MSG5 DB 0Ah,0Dh,'Chuoi thu nhat=$' MSG6 DB 0Ah,0Dh,'Chuoi thu hai=$'

.CODE MOV AX,@DATA MOV DS,AX MOV ES,AX CALL DICHUYEN 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

DICHUYEN PROC NEAR MOV CX,10 LEA DI,N2 LEA SI,N1 REP MOVSB RET DICHUYEN ENDP

INKETQUA PROC NEAR MOV AH,9 LEA DX,MSg5 INT 21h LEA DX,N1 INT 21h 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)

* Chỉ thị CLD: Xóa DF về 0 * Chỉ thị STD: Thiết lập cờ DF lên 1

;Thiết lập DF=1

- Các chỉ thị thiết lập cờ hướng: Ví dụ: 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

DI,STRING2 SI,STRING1

LABEL2

JCXZ

AL,[SI] [DI],AL DI SI LABEL1

MOV MOV INC INC LOOP

* 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 CLD MOV CX,20 LEA LEA REP MOVSB 

LABEL1: LABEL2:......

- 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: Ví dụ: - 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

Thao tác Thanh ghi Giá trị Điều kiện

Vào DI Địa chỉ vùng dữ liệu đích ES:DI

SI Địa chỉ vùng dữ liệu nguồn DS:SI

CX Số ký tự cần nạp

* 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

Thao tác Thanh ghi Giá trị Điều kiện

Vào DI Địa chỉ vùng dữ liệu đích ES:DI

CX Số ký tự cần nạp

* 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

Thao tác Thanh ghi Giá trị Điều kiện

Vào SI, DI Địa chỉ vùng dữ liệu DS:SI, ES:DI

CX Số ký tự cần so sánh

* Ví dụ: So sánh hai chuỗi N1 và N2

CLD MOV CX,10 LEA SI,N1 DI,N2 LEA 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

Có dấu -7 +5 -5 Nhị phân 11110001 00000010 11111011 Không dấu 249 + 2 251 OF 0 CF 0

OF 0 CF 1

- Ví dụ: Số nhớ - Phép cộng tạo ra số nhớ từ việc cộng 2 bit cực trái - Ví dụ: Không dấu 252 + 5 1 (sai) Nhị phân 11111100 00000101 11111011 Có dấu -4 +5 +1 (đúng)

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

Trước khi nhân

AH

AL (Số bị nhân)

Sau khi nhân

AX (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

Trước khi nhân

DX

Sau khi nhân

AX (Số bị nhân) AX Phần thấp

DX Phần cao

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

SHL AX,01

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): - 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 DIV/IDIV - Cú pháp:

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

Trước khi chia

AX Số bị chia

Sau khi chia

AH Dư số

AL 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

Trước khi chia

DX:AX Số bị chia

Sau khi chia

DX Dư số

AX 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

SHR AX,01

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): - 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

AAA/AAS

MOV AL,35h SUB AL,30h

MOV AL,35h AAA

- 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: - Ví dụ: Tương đương: - Để 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 OR

AL,30h 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 (0255) sang hệ nhị phân 8 bit

Demo