TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP
KHOA ĐIỆN TỬ
BỘ MÔN TIN HỌC CÔNG NGHIỆP
SÁCH GIAO BÀI TẬP
TÊN HỌC PHẦN: VI XỬ LÝ – VI ĐIỀU KHIỂN
MÃ HỌC PHẦN: TEE408 NGƯỜI BIÊN SOẠN: NGUYỄN TUẤN LINH
Lưu hành nội bộ
2
TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP
KHOA ĐIỆN TỬ
BỘ MÔN TIN HỌC CÔNG NGHIỆP
o0o
Lưu hành nội bộ
3
CHƯƠNG 1. TỔNG QUAN VỀ VI XỬ LÝ – VI ĐIỀU KHIỂN
1.1. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra nhị phân 1 byte:
112, 21, 32, 45, 92 , 156, 231, 143, 69.
1.2. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra hệ thập lục phân :
41,39,58,91,146, 246, 99,88, 140,177.
1.3. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.4. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập lục phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.5. Hãy chuyển đổi các số thập lục phân sau đây ra thập phân : AF , 20 , A5 , CF , B8 , D9 ,
E5 .
1.6. Hãy chuyển đổi các số thập lục phân sau đây ra nhị phân : AF , 20 , A5 , CF , B8 , D9 , E5
.
1.7. Hãy chuyển đổi các số thực biểu diễn dạng thập phân sau đây ra nhị phân :
112.18 , 21.25 , 32.04, 45.625, 92.40 , 156.2, 231.5 , 143.60 , 69.32
1.8. Hãy chuyển đổi các số thực biểu diễn dạng nhị phân sau đây ra số thập phân:
0101 01100.011 , 0101 1110.0011 , 0101 1100.011 , 0111 0111.1101 , 0101 1110.0111 , 0101
1001.0011
1.9. Hãy chuyển đổi các số thập lục phân lẻ sau đây ra thập phân :
AF.22 , 20.E , A5.2F , CF.04 , B8.9 , D9.E , E5.A
1.10. Đổi các số sau từ hệ thập phân sang hệ nhị phân:
a) 28; b) 89; c) 294
d) 34,5; e) 55,25; f) 46,3125
1.11. Đổi các số sau từ hệ nhị phân sang hệ thập phân:
a) 11001; b) 111001
1.23. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD :
a) 235 ; b) 647 ; e) 568 f) 729
1.24. Hãy chuyển các số nhị phân BCD ra số thập phân sau đây :
a) 1001 0011 0111 ; 0111 1000 0101 0110 ; 0101 1001 0011 0110
1.25. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD rồi cộng theo nhị phân. Kết
quả chuyển sang số thập phân.
a) 123 + 456 ; 348 +241 ; 532 + 461 ; 255 + 433.
1.26. Tính tổng sau: 4A9Bh + 97A2h
1.27. Đổi các giá trị sau thành byte
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.28. Đổi các giá trị sau thành bit
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.29. Cho các s ố nhị phân sau, hãy xác đị nh giá trị c ủ a chúng n ếu chúng là (i) s ố nhị
phân không dấu; (ii) s ố nhị phân có dấu
a. 0000B
5
b. 0001B
c. 0111B
d. 1000B
e. 1001B
f. 1110B
ADD AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.3. Giải thích các lệnh sau:
MOV AL,41h
MOV BL,50h
CMP AL,BL
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.4. Giải thích các lệnh sau:
MOV AX,3D85h
MOV BX,2CFEh
CMP AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.5. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn DS và thanh ghi lệch BX với DS=0F35h,
BX=150Dh. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.6. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn CS và thanh ghi lệch IP với CS=4530h,
IP=49A6h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.7. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn ES và thanh ghi lệch DI với ES=1793h,
DI=2004h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.8. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn SS và thanh ghi lệch SP với SS=11080,
SP=2004. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào trong
bộ nhớ.
2.9. Giả sử có một ngăn xếp có địa chỉ đáy là FFFEh.
7
SHR AX,CX
Hãy cho biết giá trị của thanh ghi AX sau mỗi lần dịch
2.13. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2534
MOV BX,5000
MUL BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.14. Giải thích các lệnh trong đoạn chương trình sau:
MOV AL,7Fh
MOV BL,13h
8
MUL BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.15. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2500
MOV BL,50
DIV BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.16. Giải thích các lệnh trong đoạn chương trình sau:
MOV DX,6400
MOV AX,2000
MOV BX,10000
DIV BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.17. Hãy giải thích và chỉ ra chế độ địa chỉ của các lệnh sau:
MOV BX, Array2 ;
BX= ….
XCHG AX, BX ;
AX= ….
INC AX ;
AX=….
ADD Array2, Array1 ;
Array2=
SUB AX, Array1 ;
AX=….
SUB BH, BL ;
BX= ….
….
….
Array1 DW AAh, BBh
Array2 DW 01h, 02h 2.21. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
MOV AX, Array1 ;
AX= ….
XCHG Array2, AX ;
AX= ….
DEC AX ;
AX=….
SUB Array2, 2 ;
Array2=
MOV BX, Array2 ;
AX=….
ADD AX, 0123H ;
AX= ….
PUSH AX ;
POP BX
AX= ….
BX
SUB AX, BX ;
AX=….
SUB Array2, 2 ;
Array2=
MOV BX, Array2 ;
AX=….
10
ADD AH, BL ;
AX= ….
….
….
Array1 DB 1Fh, 62h
Array2 DB 2Fh, 49h 2.24. Xác định giá trị trong thanh ghi AL và BL sau khi thực hiện xong đoạn chương trình
sau
org 100h
MOV AL, -52
MOV BL, -42
SAR AL, 4
IMUL BL
2.27. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong đoạn
chương trình sau:
org 100h
mov AX, 1122h ;
11
mov BX, 0A3Dh ;
mov CX, 80A1h ;
mov DX, 1357h ;
start:
ADD AL, BL
SUB BL, AL
CMP AL, BL
JA TA1
XOR DX, CX
JMP OK
TA1:OR DX, CX
JMP OK
OK:
ret
2.28. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong đoạn
chương trình sau:
org 100h
mov AX, 1234h;
mov BX, 5678h;
mov CX, 2468h;
mov DX, 1357h;
start:
PUSH AX
mov al, 5
mov bl, 10h
add al, bl
xor bl, 55h
2.31. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi BL bằng bao nhiêu ?
2.32. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi AL bằng bao nhiêu ?
2.33. Giả sử cho: AX=1000H; BX=2000H; CX=3000H. Sau khi thực hiện các lệnh:
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
POP CX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.34. Giả sử cho: AX=FF00H; BX=0001H; CX=1000H. Sau khi thực hiện các lệnh:
PUSH CX
PUSH BX
PUSH AX
POP AX
POP BX
MOV DS:[1001h],AX
MOV BX,AX
ADD BH,10h
MOV DS:[1002h],BH
HD: xác định các chế độ địa chỉ được sử dụng trong mỗi ý
2.37. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL>=0x41) && (AL<=0x5A) )
AL=AL+0x20;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.38. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL=0x43) | (AL=0x63) )
printf(chr(AL));
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.39. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
for (AL=100; AL> 0;AL )
AL=AL+50;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.40. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AX=1000;
WHILE (AX > 0) {AX=AX-100;}
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.41. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AL=0x61;
CX=0x1A;
do{
14
AL=AL-0x20;
printf(chr(AL));
.CODE
main PROC
MOV AX,@DATA ;
MOV DS,AX
MOV AX,… ;
INT …
MOV …,02h ;
MOV …,0C15h ;
INT …
LEA DX,… ;
MOV AH,… ;
INT …
MOV AH,4Ch ;
INT 21h
main ENDP
END main
HD: quan tâm đến các ngắt sử dụng trong chương trình
15
2.56. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số nhị
phân.
HD: dựa vào thuật toán đổi một số từ hệ mười sang hệ 2 và sử dụng hàm 01h
của ngắt 21h
2.57. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số thập
phân.
HD: dựa vào thuật toán đổi một số từ hệ 2 sang hệ 10 và sử dụng hàm 01h của
ngắt 21h
2.58. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số hệ 16.
HD: dựa vào thuật toán: lấy số cần đổi chia cho 10, nếu số dư nhỏ hơn hoặc 9
thì in ra màn hình, còn số dư lớn hơn 9 và nhỏ hoặc bằng 15 thì lấy số dư cộng
ch1 đến ch2 và lưu kết quả vào thanh ghi BX.
2.74. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, và nhập vào một ký tự ch bất kỳ. Đếm
số lượng ký ch trong chuỗi và lưu kết quả vào AX
2.75. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, đếm số lượng ký tự là chữ cái và nhập
vào AX, số lượng ký tự là số nhập vào thanh ghi BX
16
2.76. Thực hiện nhập vào một số tự nhiên N<8, tính N! và lưu kết quả vào BX.
2.77. Thực hiên in dạng biểu diễn nhị phân của thanh ghi BX.
2.78. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX. kiểm tra số nhỏ nhất nằm trong
thanh ghi nào?
2.79. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra số lớn nhất nằm trong
thanh ghi nào?
2.80. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra hiệu của 2 số, nếu có trị
tuyệt đối nhỏ hơn 10 thì in trị tuyệt đối ra màn hình, ngược lại in kết quả vào thanh ghi
DX.
2.81. Thực hiện nhập một số tự nhiên N (N<65536)vào từ bàn phím và lưu kết quả vào thanh
ghi BX.
2.82. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập phân của số tự nhiên
đó.
2.83. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập lục phân của số tự
nhiên đó.
2.84. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn bát phân của số tự nhiên
đó.
2.85. Cho một xâu S gồm các chữ cái in thường, tạo ra sâu S1 là xâu chứa các chữ cái in hoa
của xâu S và in xâu S1 ra màn hình.
2.86. Cho một xâu ký tự S, tạo ra xâu S1 là xâu đảo ngược của xâu S và in xâu S1 ra màn
hình.
2.87. Cho 2 xâu ký tự S1 và S2, kiểm tra xem S1 và S2 có bằng nhau hay không?
2.88. Cho xâu ký tự S, kiểm tra xem S có phải là xâu đối xứng hay không?
c. 1001 1100b-0101 111b
d. 1010 1111b-0111 1101b
e. 0001 1111b*1110 1101b
f. 0001 0000b*0001 1111b
3.3. Nếu thanh ghi Avà B được sử dụng để chứa kết quả của các phép toán, hãy cho biết giá trị
của 2 thanh ghi sau khi thực hiện các phép toán sau:
a. ABh*Fh
b. 10h*1Ah
c. CFh*2Ch
d. 10h*Abh
e. CDE0h/10h
f. 1F2Dh/8Ah
3.4. Cho biết giá trị (ở dạng hexa) của thanh ghi PSW nếu muốn sử dụng
a. Bank 0
b. Bank 1
c. Bank 2
d. Bank 3
Các Bit khác mặc định bằng 0
3.5. Cho biết giá trị (ở dạng hexa) của thanh ghi PSWsau khi thực hiện các phép toán sau
a. FFh+FFh
b. 80h+80h
c. 80h-01h
d. FFh+01h
e. ABh-80H
f. F0H-10h
3.6. Nếu chuyển các giá trị sau đây vào thanh ghi A, thanh ghi PSW có giá trị bằng bao nhiêu
a. A=F0h
b. A=ABh
18
MOV R1,#10 CLR A MOV R2,A MOV R3,A Loop: MOV A,@R0 JB ACC.7,Neg INC R3 SJMP Cont Neg: INC R2 Cont:INC R0
MOV R2,#1CH MOV A,#28H MOV R0,#0C7H PUSH 2 PUSH 0 ADD A, R2 POP 1 ADD A, R1 POP 0 MOV A, R3
nhớ 41H. Kết quả byte cao được đưa vào thanh ghi A, byte thấp được chứa trong ô nhớ
42h.
3.20. Cộng nội dung của 5 ô nhớ liên tiếp, biết rằng địa chỉ của ô nhớ đầu tiên được lưu trong
thanh ghi R1 và R1 bằng 42h. Kết quả byte cao được lưu trong ô nhớ 30h, byte thấp lưu
trong 31h. Hãy xác định các chế độ địa chỉ của các thao tác trên
3.21. Hãy cho biết giá trị của các thanh ghi R0, R1, R2 sau khi thực hiện xong đoạn chương
trình dưới đây.
ORG 0000H
MOV DPTR, #200H
CLR A
MOVC A, @A + DPTR
MOV R0, A
20
INC DPTR
CLR A
MOVC A, @A + DPTR
MOV R1, A
INC DPTR
CLR A
MOVC A, @A + DPTR
MOV R2, A
HERE: SJMP HERE
ORG 200H
MYDATA: DB ‘VXL’
END ;
3.22. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh
MOV A,#12
; A ADD A,#11110001B
; A CY
MOV DPTR,#2000H
3.23. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh
ANL A,R7
; A INC A
; A DEC A
; A
3.26. Write a program to clear location 31H in internal RAM using 2 methods of addressing:
direct addressing and indirect addressing.
Hint: to clear means to reset the data to zero.
DPH
DPL
DPH
DPL
A
21
3.27. Write a program to move (read) the content of location 33H in internal RAM to register
A using 2 methods of addressing: direct addressing and indirect addressing.
3.28. Write a program to move the content of registerA to location 0033H in external RAM.
ORG 0000H
MOV DPTR,#0033H
MOVX @DPTTR,A
END
3.29. Write a program to write 40H to location 0030H in external RAM.
ORG 0000H
MOV A,#40H
MOV DPTR,#0030H
MOVX @DPTR,A
END
3.30. Viết các câu lệnh để xóa ô nhớ31H của RAM nội theo 2 cách
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.31. Viết các câu lệnh để ghi nội dung thanh ghi A vào ô nhớ 32H của RAM nội theo 2
cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.32. Viết các câu lệnh để đọc ô nhớ33H của RAM nội vào thanh ghi A của RAM nội theo 2
cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
ADD
3.37. Viết đoạn chương trình cộng nội dung thanh ghi A với 19H, cho biết nội dung của
thanh ghi PSW sau khi thực hiện xong đoạn chương trình trên
3.38. Viết đoạn chương trình cộng nội dung thanh ghi A với thanh ghi B (giả sử A=19h,
B=FEh). Cho biết nội dung của thanh ghi PSW sau khi thực hiện xong đoạn chương trình
trên
3.39. Giả sử ô nhớ 20h trong RAM nội có giá trị bằng 25, viết đoạn chương trình để cộng nội
dung trong thanh ghi A với ô nhớ 20H
3.40. Giả sử thanh ghi R0 chứa giá trị là 20h, hãy viết đoạn chương trình để cộng nội dung
của thanh ghi A với ô nhớ có địa chỉ được lưu trong R0
3.41. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 số bắt đầu từ ô nhớ30H. Hãy
viết CT con cộng chuỗi sốnày và ghi kết quảvào ô nhớ2FH (giả sử kết quả nhỏ hơn hoặc
bằng 255)
3.42. Giả sử các ngăn nhớ 40 - 44 của RAM có giá trị sau: 40 = (7D); 41 = (EB); 42 = (C5);
43 = (5B) và 44 = (30). Hãy viết một chương trình tính tổng của các giá trị trên. Cuối
chương trình giá trị thanh ghi A chứa byte thấp và R7 chứa byte cao (các giá trị trên được
cho ở dạng Hex).
3.43. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 sốbắt đầu từô nhớ 30H. Hãy
viết CT con cộng chuỗi số này và ghi kết quảvào ô nhớ 2EH:2FH (ô nhớ 2EH chứa byte
cao của kết quả và ô nhớ 2FH chứa byte thấp của kết quả).
3.44. Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H và 3B8DH. Cất
tổng số vào R7và R6 trong đó R6 chứa byte thấp.
INC/ DEC
3.45. Hãy viết giải thích cho các lệnh sau :
INC A ; A <-A + 1
INC B ; B<-B + 1
MOV R0,#30H
INC @R0 ; Tăng byte với contrỏ R0 lên 1 (30H) = (30H) + 1
INC R0
xong :
a. MOV A,#25h
ADD A,#17h
DA A
b. MOV A,#25h
ADD A,#17h
ADD A,B
DA A
c. MOV A,#25h
ADD R0,#17h
ADD A,R0
DA A
d. MOV 20h,#17h
MOV A,#25h
ADD A,20h
DA A
e. MOV R0,#17h
MOV A,#25h
ADD A,@R0
DA A
Câu 1. Giả sử 5 dữ liệu BCD được lưu trong RAM tại địa chỉ bắt đầu từ 40H như sau:
40 = (71), 41 = (11), 42 = (65), 43 = (59) và 44 = (37). Hãy viết chương trình tính
tổng của tất cả 5 số trên và kết quả phải là dạng BCD.
ANL, ORL, XRL
24
3.50. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện
xong các câu lệnh:
a. MOV A,#15h
ANL A,#3Ah
c. MOV A,0FH
SETB C ;
RRC A
d. MOV A0FH
SETB C
RLC A
3.54. Sử dụng lệnh dịch phải để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15
RR A ; A = 1000_0111B = 87H
CLR ACC.7 ; A = 0000_0111B = 07H = 7= 15/2
25
3.55. Sử dụng lệnh dịch phải có nhớ để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM2 ; A = -12 = F4H = 1111_0100B
MOV C,ACC.7 ; C = bit dau cua A
RRC A
3.56. Viết chương trình để thực hiện chia một số không dấu trong A cho 2n (n=1->8)( n
được lưu trước trong thanh ghi R7)
MOV R7,#2
MOV A,#00011111B ; A = 31
CALL DIV2EXPN ; A = 0000_0111B = 7 = 31 div 4
DIV2EXPN: ; Chương trình con chia nguyên không dấu cho 2^n
RR A
CLR ACC.7
DJNZ R7, DIV2EXPn
RET
END
SO SÁNH
3.57. Cho hai số 8 bit, số thứ 1 chứa trong (30H), số thứ 2 chứa trong (31H). Viết CT con so
sánh hai số này. Nếu sốthứ 1 lớn hơn hoặc bằng số thứ 2 thì set cờ F0, nếu ngược lại thì