Đưa vào mã hợp ngữ tái CS:IP Đưa vào mã hợp ngữ tái CS:100h
3.2 Nhạy có đieău kieơn
Leơnh JNZ là moơt leơnh nhạy có đieău kieơn .Cú pháp cụa moơt leơnh nhạy có đieău kieơn là :
Jxxx destination-label
Nêu đieău kieơn cụa leơnh được thỏa mãn thì leơnh tái Destination-label sẽ được thực hieơn , nêu đieău kieơn khođng thỏa thì leơnh tiêp theo leơnh nhạy sẽ được thực hieơn. Đôi với leơnh JNZ thì đieău kieơn là kêt qụa cụa leơnh trước nó phại baỉng 0 .
Phám vi cụa leơnh nhạy có đieău kieơn .
Câu trúc mã máy cụa leơnh nhạy có đieău kieơn yeđu caău destination-label đên ( precede) leơnh nhạy phại khođng quá 126 bytes .
Làm thê nào đeơ CPU thực hieơn moơt leơnh nhạy có đieău kieơn ?
Đeơ thực hieơn moơt leơnh nhạy có đieău kieơn CPU phại theo dõi thanh ghi cờ. Nêu đieău kieơn cho leơnh nhạy ( được bieơu dieên bởi moơt toơ hợp tráng thái các cờ ) là đúng thì CPU sẽ đieău chưnh IP đên destination-label sao cho leơnh tái điá chư
destination-label được thực hieơn .Nêu đieău kieơn nhạy khođng thỏa thì IP sẽ khođng thay đoơi , nghĩa là leơnh tiêp theo leơnh nhạy sẽ được thực hieơn .
Trong chương trình tređn đađy , CPU thực hieơn leơnh JNZ PRINT_LOOP baỉng cách khám xét các cờ ZF . Nêu ZF=0 đieău khieơn được chuyeơn tới PRINT_LOOP. Nêu ZF=1 leơnh MOV AH,4CH sẽ được thưc hieơn .
Bạng 3-1 cho thây các leơnh nhạy có đieău kieơn . Các leơnh nhạy được chia thành 3 lối :
• nhạy có dâu ( dùng cho các dieên dịch có dâu đôi với kêt quạ)
• nhạy khođng dâu (dùng cho các dieên dịch khođng dâu đôi với kêt quạ)
• nhạy moơt cờ ( dùng cho các thao tác chư ạnh hưởng leđn 1 cờ )
Moơt soẫ leơnh nhạy có 2 Opcode . Chúng ta có theơ dùng moơt trong 2 Opcode , nhưng kêt quạ thực hieơn leơnh là như nhau .
Nhạy có dâu
SYMBOL DESCRITION CONDITION FOR JUMPS JG/JNLE jump if greater than ZF=0 and SF=OF
jump if not less than or equal to
JGE/JNL jump if greater than or equal to SF=OF jupm if not less or equal to
JL/JNGE jump if lees than
Chương 3 : Các leơnh laịp và rẽ nhánh 30 JLE/JNG jump if less than or equal ZF=1 or SF<>OF
jump if not greater
Nhạy có đieău kieơn khođng dâu
SYMBOL DESCRITION CONDITION FOR JUMPS JA/JNBE jump if above CF=0 and ZF=0
jump if not below or equal
JAE/JNB jump if above or equal CF=0 jump if not below
JB/JNA jump if below Cf=1 jump if not above or equal
JBE/JNA jump if below or equal CF=1 or ZF=1 jump if not above
Nhạy 1 cờ
SYMBOL DESCRITION CONDITION FOR JUMPS JE/JZ jump if equal ZF=1
jump if equal to zero
JNE/JNZ jump if not equal ZF=0 jump if not zero
JC jump if carry CF=1 JNC jump if no carry CF=0 JO jump if overflow OF=1 JNO jump if not overflow OF=0 JS jump if sign negative SF=1
Chương 3 : Các leơnh laịp và rẽ nhánh 31 JNS jump if nonnegative sign SF=0
JP/JPE jump if parity even PF=1 JNP/JPO jump if parity odd PF=0
Leơnh CMP ( Compare)
Các leơnh nhạy thường lây kêt qụa cụa leơnh Compare như là đieău kieơn . Cú pháp cụa leơnh CMP là :
CMP destination, source
Leơnh này so sánh toán háng nguoăn và toán háng đích baỉng cách tính hieơu Destinaition - Source . Kêt qụa sẽ khođng được cât giữ . Như vaơy là leơnh CMP giông như leơnh SUB , chư khác là trong leơnh CMP toán háng đích khođng thay đoơi .
Giạ sử chương trình chưá các leơnh sau :
CMP AX,BX ;trong đó AX=7FFF và BX=0001h JG BELOW
Kêt qụa cụa leơnh CMP AX,BX là 7FFEh . Leơnh JG được thỏa mãn vì ZF=0=SF=OF do đó đieău khieơn được chuyeơn đên nhãn BELOW.
Dieên dịch leơnh nhạy có đieău kieơn
Ví dú tređn đađy veă leơnh CMP cho phép leơnh nhạy sau nó chuyeơn đieău khieơn đên nhãn BELOW . Đađy là ví dú cho thây CPU thực hieơn leơnh nhạy như thê nào . Chúng thực hieơn baỉng cách khám xét tráng thả các cờ .Laơp trình vieđn khođng caăn quan tađm đên các cờ , mà có theơ dùng teđn cụa các leơnh nhạy đeơ chuyeơn đieău khieơn đên moơt nhãn nào đó . Các leơnh
CMP AX,BX JG BELOW
có nghĩa là nêu AX>BX thì nhạy đên nhãn BELOW
Maịc dù leơnh CMP được thiêt kê cho các leơnh nhạy . Nhưng leơnh nhạy có theơ đứng trước 1 leơnh khác , chẳng hán :
DEC AX JL THERE
có nghĩa là nêu AX trong dieên dịch có dâu < 0 thì đieău khieơn được chuyeơn cho THERE .
Chương 3 : Các leơnh laịp và rẽ nhánh 32 Moơt leơnh nhạy có dâu tương ứng với 1 nhạy khođng dâu . Ví dú leơnh nhạy có dâu JG và leơnh nhạy khođng dâu JA . Vieơc sử dúng JG hay JA là tuỳ thuoơc vào dieên dịch có dâu hay khođng dâu . Bạng 3-1 cho thây các leơnh nhạy có dâu phú thuoơc vào tráng thái cụa các cờ ZF,SF,OF .Các leơnh nhạy khođng dâu phú thuoơc vào tráng thái cụa các cờ ZF và CF . Sử dúnh leơnh nhạy khođng hợp lý sẽ táo ra kêt quạ sai .
Giạ sử raỉng chúng ta dieên dịch có dâu .Nêu AX=7FFFh và BX=8000h , các leơnh :
CMP AX,BX JA below
sẽ cho kêt qụa sai maịc dù 7FFFh > 8000h ( leơnh JA khođng thực hieơn được vì 7FFFFh < 8000h trong dieên dịch khođng dâu )
Sau đađy chúng ta sẽ lây ví dú đeơ minh hĩa vieơc sử dúng các leơnh nhạy Ví dú : Giạ sử raỉng AX và BX chưá các sô có dâu . Viêt đốn ct đeơ đaịt sô lớn nhât vào CX .
Giại :
MOV CX,AX ; đaịt AX vào CX CMP BX,CX ;BX lớn hơn CX? JLE NEXT ; khođng thì tiêp túc MOV CX,BX ; yes , đaịt BX vào CX NEXT:
3.3 Leơnh JMP
Leơnh JMP ( jump) là leơnh nhạy khođng đieău kieơn . Cú pháp cụa JMP là JMP destination
Trong đó destination là moơt nhãn ở trong cùng 1 đĩan với leơnh JMP .
Leơnh JMP dùng đeơ khaĩc phúc hán chê cụa các leơnh nhạy có đieău kieơn ( khođng quá 126 bytes keơ từ vị trí cụa leơnh nhạy có đieău kieơn )
Ví dú chúng ta có đốn chương trình sau : TOP:
; thađn vòng laịp DEC CX
JNZ TOP ; nêu CX>0 tiêp túc laịp MOV AX,BX
giạ sử thađn vòng laịp chứa nhieău leơnh mà nó vượt khỏi 126 bytes trước leơnh JNZ TOP . Có theơ giại quyêt tình tráng này baỉng các leơnh sau :
Chương 3 : Các leơnh laịp và rẽ nhánh 33 ; thađn vòng laịp
DEC CX
JNZ BOTTOM ; nêu CX>0 tiêp túc laịp JMP EXIT
BOTTOM:
JMP TOP EXIT:
MOV AX,BX