IV. GIỚI THIỆU CHƯƠNG TRÌNH EMU 8086
4.4. Các lệnh logic, lệnh nhảy
Các lệnh logic và lệnh Jump được dùng rất nhiều trong ngôn ngữ Assembly.
4.4.1. Các lệnh logic
Các lệnh logic gồm có NOT, AND, OR, XOR, TEST vv... được dùng để so sánh dữ liệu và cho kết quả phụ thuộc vào đặc tính logic. Ví dụ:
MOV BX, 30H; 110000 ở dạng nhị phân NOT BX; 001111 ở dạng nhị phân
Đoạn mã trên nạp giá trị vào BX và sau đó đảo toàn bộ các bit và lưu giá trị mới vào BX. Ví thế sau khi thực hiện lệnh NOT BX sẽ chứa 0FH. Ví dụ khác:
89
MOV BX, 70H; 1110000 ở dạng nhị phân MOV CX, 40H; 1000000 ở dạng nhị phân AND CX, BX; 1000000 ở dạng nhị phân
Lệnh AND thực hiện AND từng bit với nhau và sau đó lưu kết quả vào đối số thứ nhất. Trong đoạn mã CX chứa kết quả cuối cùng.
MOV BX, 70H; 1110000 ở dạng nhị phân MOV CX, 40H; 1000000 ở dạng nhị phân OR CX, BX; 1110000 ở dạng nhị phân
Lệnh OR thực hiện OR từng bit với nhau và sau đó lưu kết quả vào đối số thứ nhất. Trong đoạn mã trên CX chứa kết quả cuối cùng. Tương tự đối với lệnh XOR được đưa ra ở dưới:
MOV BX, 70H; 1110000 ở dạng nhị phân MOV CX, 40H; 1000000 ở dạng nhị phân XOR CX, BX; 0110000 ở dạng nhị phân
Lệnh TEST khác một chút so với lệnh AND. Nó thực hiện AND từng bit với nhau nhưng không làm thay đổi giá trị của các đối số.
MOV BX, 70H; 1110000 ở dạng nhị phân MOV CX, 40H; 1000000 ở dạng nhị phân
TEST CX, BX; giá trị của CX ở dạng nhị phân là 1000000
Tất cả các lệnh logic ở trên đều tác động đến các bit trạng thái của thanh ghi cờ ngoại trừ cờ AF. Lệnh NOT không tác động lên bit cờ nào. Trạng thái của các cờ được thay đổi như sau:
MOV BX, 70H; 1110000 ở dạng nhị phân MOV CX, 40H; 1000000 ở dạng nhị phân AND CX, BX; 1110000 ở dạng nhị phân
Sau lệnh này cờ Zero bằng 0 (ZF = 0; nếu giá trị của CX không bằng 0), cờ Carry bằng 0 (CF = 0; nếu phép toán không có nhớ), cờ Parity bằng 0 (PF = 0; nếu số bit 1 là lẻ), cờ Sign bằng 0 (SF = 1, nếu kết quả âm), cờ Overflow bằng 0 (OF = 0; nếu kết quả không tràn). Dấu chấm phẩy ở trên được dùng để viết chú thích sau mỗi câu lệnh trong ngôn ngữ assembly.
90
4.4.2. Các lệnh JUMP
Đôi khi ta cần di chuyển từ một dòng lệnh trong chương trình đến một dòng lệnh khác mà không phải thực hiện lệnh nào cả. Khi đó ta dùng lệnh Jump. Chúng ta có thể xem một ví đụ đơn giản sau:
MOV AX, 3254H MOV BX, 1FABH MOV CX, 412AH ADD AX, CX JMP L3T2 SUB AX, BX
L3T2: AND AX, BX HLT
Trong ví dụ này L3T2 là một nhãn. Chúng ta có thể thấy lệnh JMP được dùng ở dòng thứ năm. Nó làm con trỏ chương trình nhảy từ dòng thứ năm đến nhãn L3T2 là dòng thứ bảy. Do đó dòng lệnh thứ sáu không được thực hiện. Có hai loại lệnh nhảy. Đó là lệnh nhảy có điều kiện và lệnh nhảy không cần bất cứ điều kiện gì. Ví dụ ở trên dùng lệnh nhảy vô điều kiện. Lệnh nhảy có điều kiện giống như lệnh IF. Lệnh nhảy có điều kiện được thực thi chỉ sau khi có một vài cờ được tác động. Chúng ta có thể xem ví dụ sau đây:
MOV AX, 125BH MOV BX, 125BH MOV CX, 412AH SUB AX, BX JZ L3T2 DIV BX
L3T2: AND AX, CX HLT
Dễ thấy trong đoạn mã trên, ở dòng thứ tư lệnh trừ được thực hiện và cả AX và BX có cùng một giá trị. Kết quả của phép trừ bằng 0. Vì thế ZF = 1. Câu lệnh JZ L3T2 được viết ở dòng thứ năm có nghĩa là nếu ZF = 1 thì nhảy đến nhãn L3T2;
nếu không thì đi tiếp. Do ZF = 1, chương trình sẽ di chuyển đến dòng thứ 8. Đó chính là lệnh nhảy có điều kiện.
Chúng ta có một số lệnh nhảy có điều kiện khác nữa như là:
91
JA/JNBE khi CF = 0, ZF = 0
JBE/JNA khi CF = 0 or ZF = 0
JNB/JAE/JNC khi CF = 0
JB/JNAE/JC khi CF = 1
JG/JNLE khi SF OF = 0, ZF = 0
JLE/JNG khi SF OF = 0, ZF = 1
JGE/JNL khi SF OF = 0
JL/JNGE khi SF OF =1
JZ/JE khi ZF = 1
JNZ/JNE khi ZF = 0
JS khi SF = 1
JNS khi SF = 0
JPE/JP khi PF = 1
JPO/JNP khi PF = 0
JO khi OF = 1
JNO khi OF = 0