Viết lệnh: CMP Đích,Gốc.
Mô tả: Đích - Gốc
Trong đó toán hạng đích vμ gốc có thể tìm đ−ợc theo các chế độ địa chỉ khác nhau, nh−ng phải chứa dữ liệu có cùng độ dμi vμ không đ−ợc phép đồng thời lμ 2 ô nhớ.
Lệnh nμy chỉ tạo các cờ, không l−u kết quả so sánh, sau khi so sánh các toán hạng không bị thay đổi. Lệnh nμy th−ờng đ−ợc dùng để tạo cờ cho các lệnh nhảy có điều kiện (nhảy theo cờ).
Các cờ chính theo quan hệ đích vμ gốc khi so sánh 2 số không dấu: CF ZF
Đích = Gốc 0 1
Đích > Gốc 0 0 Đích < Gốc 1 0
Cập nhật: AF, CF,OF, PF, SF, ZP.
CMPS/CMPSB/CMPSW - Compare String Bytes or String Words (So sánh 2 chuỗi byte hay 2 chuỗi từ)
Viết lệnh: CMPS Chuỗiđích,Chuỗigốc
CMPSB CMPSW CMPSW
Mô tả: Chuỗiđích - Chuỗigốc
Lệnh nμy so sánh từng phần tử (byte hay từ) của 2 xâu có các phần tử cùng loại. Lệnh chỉ tạo các cờ, không l−u kết quả so sánh, sau khi so sánh các toán hạng không bị thay đổi. Trong lệnh nμy ngầm định các thanh ghi với các chức năng:
+ DS:SI lμ địa chỉ của phần tử so sánh trong chuỗi gốc, + ES:DI lμ địa chỉ của phần tử so sánh trong chuỗi đích.
+ Sau mỗi lần so SI ← SI ± 1, DI ← DI ± 1 hoặc SI ← SI ± 2, DI ← DI ± 2 một cách tự động tuỳ thuộc cờ h−ớng DF lμ 0 hay 1 vμ chuỗi lμ chuỗi byte hoặc chuỗi từ.
Ta sẽ giải thích cụ thể các tr−ờng hợp dùng các dạng lệnh trên. Giả thích nμy cũng có thể áp dụng cho các lệnh có dạng thức lệnh hoặc cấu trúc ngữ pháp t−ơng tự:
MOVS, STOS, LODS, SCAS.
Có 2 cách để chỉ ra một chuỗi lμ chuỗi byte hoặc chuỗi từ. Cách đầu tiên lμ ta khai rõ bằng tên ngay từ đầu chuỗi nguồn vμ chuỗi đích lμ loại gì. Sau đó ta dùng lệnh COMPS để thao tác với các chuỗi đó:
StrByte1 DB "daylachuoibyte1" StrByte2 DB "daylachuoibyte2" StrWord1 DW "daylachuoitu1" StrWord2 DW "daylachuoitu2" .... LEA SI,StrByte1 LEA DI,StrByte2
COMPS StrByte2,StrByte1 ; có thể thay
; bằng COMPSB.
....
LEA SI,StrWord1
LEA DI,StrWord2
COMPS StrWord2,StrWord1 ; có thể thay
; bằng COMPSW.
Cách thứ hai lμ ta thêm vμo lệnh CMPS đuôi thích hợp để báo cho ch−ơng trình dịch biết kiểu thao tác trên chuỗi đã đ−ợc định nghĩa: đuôi "B" để thao tác với byte hoặc đuôi "W" để thao tác với từ (xem ví dụ sau).
Lệnh CMPS/CMPSB/CMPSW có thể dùng kèm với lệnh REPE hoặc REPNE để so sánh tất cả các phần tử trong chuỗi.
Cập nhật: AF, CF,OF, PF, SF, ZP.
Ví dụ
MOV DI,OFFSET Chuỗiđích ; lấy địa chỉ lệch
; của Chuỗiđích tại
; ES vμo DI,
MOV SI,OFFSET Chuỗigốc ; lấy địa chỉ lệch
; của Chuỗigốc tại
; DS vμo SI,
CLD ; lμm việc với chuỗi theo
; chiều tiến →,
CMPSB ; chuyển 1 byte.
CWD - Convert a Word to a DoubleWord (Chuyển từ thμnh từ kép) Lệnh nμy mở rộng bit dấu của AX sang 16 bit của DX. DX lúc nμy đ−ợc gọi lμ phần mở rộng dấu của AX. Ta dùng CWD để mở rộng dấu cho số có dấu nằm trong AX tr−ớc khi muốn chia nó cho một số có dấu khác bằng lệnh IDIV.
Lệnh nμy không tác động đến các cờ.
Ví dụ: Nếu DX = 0000H, AX = 8086H thì sau lệnh đổi ta có: DX = FFFFH, AX = 8086H.
DAA - Decimal Adjust AL after BCD Addition (Chỉnh AL sau khi cộng số BCD)
Lệnh nμy dùng để chỉnh lại kết quả (hiện nằm ở AL) sau phép cộng 2 số BCD. Lý do phải chỉnh lại kết quả nμy lμ do ta đã dùng bộ ALU của CPU, vốn chỉ biết lμm toán với các số hệ hai, để lμm toán với các số BCD. Lệnh DAA chỉ tác động đúng đến kết quả ở AL ngay sau khi vừa thực hiện phép cộng. Hoạt động của lệnh DAA:
+ Nếu 4 bit thấp của AL lớn hơn 9 hoặc AF=1 thì AL ← AL + 6, + Nếu 4 bit cao của AL lớn hơn 9 hoặc CF=1 thì AL ← AL + 60H.
Cập nhật: AF,CF, PF,SF, ZP. Không xác định: OF.
Ví dụ
a) ;AL = 0101 1001BCD = 59
;BL = 0011 0110BCD = 36
ADD AL,BL ;AL = 1000 1111 B = 8FH
DAA ;vì F>9 nên AL + 6 = 1001 0101BCD = 95 b) ;AL = 1000 1001BCD = 89
;BL = 0100 0111BCD = 47
ADD AL,BL ;AL = 1101 0000 B = D0H, AF = 1 DAA ;vì D > 9 vμ AF =1 nên
;AL+60H+6 = 0011 0110BCD = 36,CF = 1.
DAS - Decimal Adjust AL after BCD Subtraction (Chỉnh AL sau khi trừ 2 số BCD)
Lệnh nμy dùng để chỉnh lại kết quả (hiện nằm ở AL) sau phép trừ 2 số BCD. Lý do phải chỉnh lại kết quả nμy lμ do ta đã dùng bộ ALU của CPU, vốn chỉ biết lμm toán với các số hệ hai, để lμm toán với các số BCD. Lệnh DAS chỉ tác động đúng đến kết quả ở AL ngay sau khi vừa thực hiện phép trừ. Hoạt động của lệnh DAS:
+ Nếu 4 bit thấp của AL lớn hơn 9 hoặc AF=1 thì AL ← AL - 6, + Nếu 4 bit cao của AL lớn hơn 9 hoặc CF=1 thì AL ← AL - 60H.
Cập nhật: AF,CF, PF,SP, ZP. Không xác định: OF.
Ví dụ
a) ;AL = 0101 0110BCD = 56
;BL = 0011 1001BCD = 39
SUB AL,BL ;AL = 0001 1101B = 1DH
DAS ;vì D>9 nên AL-6 = 0001 0111BCD = 17. b)
;AL = 0100 1000BCD = 48
;BL = 0100 1001BCD = 49
SUB AL,BL ;AL = 1111 1111B = FFH,CF=1,AF=1 DAS ;vì CF=1 vμ AF =1 nên
;AL-60H-6 = 1001 1001BCD = 99, CF = 1. Trong thí dụ trên CF=1 có nghĩa lμ phải m−ợn 100 thêm vμo số bị trừ để đ−ợc kết quả lμ 99. Nói khác đi kết quả đúng sẽ lμ -1.
DEC - Decrement Destination Register or Memory (Giảm toán hạng đích đi 1)
Viết lệnh: DEC Destination
Mô tả: Đích ← Đích - 1
Trong đó toán hạng đích có thể tìm đ−ợc theo các chế độ địa chỉ khác nhau. L−u ý lμ nếu Đich = 00H (hoặc 0000H) thì Đích-1=FFH (hoặc FFFFH) mμ không lμm ảnh h−ởng đến cờ CF. Lệnh nμy cho kết quả t−ơng đ−ơng nh− lệnh SUB Đích,1 nh−ng chạy nhanh hơn.
Cập nhật: AF,OF, PF, SF, ZP. Không tác động: CF.