Đư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 kin
Lnh JNZ là mt lnh nhạy cĩ đieău kin .Cú pháp cụa mt lnh nhạy cĩ đieău kin là :
Jxxx destination-label
Nêu đieău kin cụa lnh được thỏa mãn thì lnh tái Destination-label sẽ được thực hin , nêu đieău kin khođng thỏa thì lnh tiêp theo lnh nhạy sẽ được thực hin. Đơi với lnh JNZ thì đieău kin là kêt qụa cụa lnh trước nĩ phại baỉng 0 .
Phám vi cụa lnh nhạy cĩ đieău kieơn .
Câu trúc mã máy cụa lnh nhạy cĩ đieău kin 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 hin mt lnh nhạy cĩ đieău kieơn ?
Đeơ thực hin mt lnh nhạy cĩ đieău kin CPU phại theo dõi thanh ghi cờ. Nêu đieău kin cho lnh nhạy ( được bieơu din bởi mt 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 lnh tái điá chư
destination-label được thực hin .Nêu đieău kin nhạy khođng thỏa thì IP sẽ khođng thay đoơi , nghĩa là lnh tiêp theo lnh nhạy sẽ được thực hin .
Trong chương trình tređn đađy , CPU thực hin lnh 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 lnh MOV AH,4CH sẽ được thưc hin .
Bạng 3-1 cho thây các lnh nhạy cĩ đieău kin . Các lnh nhạy được chia thành 3 lối :
• nhạy cĩ dâu ( dùng cho các din dịch cĩ dâu đơi với kêt quạ)
• nhạy khođng dâu (dùng cho các din 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ờ )
Mt soẫ lnh nhạy cĩ 2 Opcode . Chúng ta cĩ theơ dùng mt trong 2 Opcode , nhưng kêt quạ thực hin lnh 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 lnh 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 kin 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 lnh 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 lnh nhạy thường lây kêt qụa cụa lnh Compare như là đieău kin . Cú pháp cụa lnh CMP là :
CMP destination, source
Leơnh này so sánh tốn háng nguoăn và tốn háng đích baỉng cách tính hiu Destinaition - Source . Kêt qụa sẽ khođng được cât giữ . Như vy là lnh CMP giơng như lnh SUB , chư khác là trong lnh CMP tốn háng đích khođng thay đoơi .
Giạ sử chương trình chưá các lnh sau :
CMP AX,BX ;trong đĩ AX=7FFF và BX=0001h JG BELOW
Kêt qụa cụa lnh CMP AX,BX là 7FFEh . Lnh JG được thỏa mãn vì ZF=0=SF=OF do đĩ đieău khieơn được chuyeơn đên nhãn BELOW.
Din dịch lnh nhạy cĩ đieău kin
Ví dú tređn đađy veă lnh CMP cho phép lnh 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 hin lnh nhạy như thê nào . Chúng thực hin baỉng cách khám xét tráng thả các cờ .Lp 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 lnh nhạy đeơ chuyeơn đieău khieơn đên mt nhãn nào đĩ . Các lnh
CMP AX,BX JG BELOW
cĩ nghĩa là nêu AX>BX thì nhạy đên nhãn BELOW
Maịc dù lnh CMP được thiêt kê cho các lnh nhạy . Nhưng lnh nhạy cĩ theơ đứng trước 1 lnh khác , chẳng hán :
DEC AX JL THERE
cĩ nghĩa là nêu AX trong din dịch cĩ dâu < 0 thì đieău khieơn được chuyeơn cho THERE .
Chương 3 : Các lnh laịp và rẽ nhánh 32 Moơt lnh nhạy cĩ dâu tương ứng với 1 nhạy khođng dâu . Ví dú lnh nhạy cĩ dâu JG và lnh nhạy khođng dâu JA . Vic sử dúng JG hay JA là tuỳ thuc vào din dịch cĩ dâu hay khođng dâu . Bạng 3-1 cho thây các lnh nhạy cĩ dâu phú thuc vào tráng thái cụa các cờ ZF,SF,OF .Các lnh nhạy khođng dâu phú thuc vào tráng thái cụa các cờ ZF và CF . Sử dúnh lnh nhạy khođng hợp lý sẽ táo ra kêt quạ sai .
Giạ sử raỉng chúng ta din dịch cĩ dâu .Nêu AX=7FFFh và BX=8000h , các lnh :
CMP AX,BX JA below
sẽ cho kêt qụa sai maịc dù 7FFFh > 8000h ( lnh JA khođng thực hin được vì 7FFFFh < 8000h trong din dịch khođng dâu )
Sau đađy chúng ta sẽ lây ví dú đeơ minh hĩa vic sử dúng các lnh 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à lnh nhạy khođng đieău kin . Cú pháp cụa JMP là JMP destination
Trong đĩ destination là mt nhãn ở trong cùng 1 đĩan với lnh JMP .
Lnh JMP dùng đeơ khaĩc phúc hán chê cụa các lnh nhạy cĩ đieău kin ( khođng quá 126 bytes keơ từ vị trí cụa lnh nhạy cĩ đieău kin )
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 lnh mà nĩ vượt khỏi 126 bytes trước lnh JNZ TOP . Cĩ theơ giại quyêt tình tráng này baỉng các lnh sau :
Chương 3 : Các lnh 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