Intel x86 Assembly Language & Microarchitecture
बहाव को काबू करें
खोज…
बिना शर्त कूदता है
jmp a_label ;Jump to a_label
jmp bx ;Jump to address in BX
jmp WORD [aPointer] ;Jump to address in aPointer
jmp 7c0h:0000h ;Jump to segment 7c0h and offset 0000h
jmp FAR WORD [aFarPointer] ;Jump to segment:offset in aFarPointer
कूद के पास रिश्तेदार
jmp a_label है:
- पास में
यह केवल गंतव्य के तार्किक पते के ऑफसेट भाग को निर्दिष्ट करता है। खंड कोCSमाना जाता है। - सापेक्ष
अगले शब्द पते याIP = IP + relनिर्देश सिमेंटिक जंप रिलेट बाइट्स फॉरवर्ड 1 है।
यह निर्देश EB <rel8> या EB <rel16/32> रूप में एन्कोड किया गया है, कोडांतरक सबसे उपयुक्त फॉर्म उठा रहा है, आमतौर पर एक छोटा पसंद करता है।
प्रति असेंबलर ओवरराइडिंग संभव है, उदाहरण के लिए NASM jmp SHORT a_label , jmp WORD a_label और jmp DWORD a_label तीन संभावित रूपों को उत्पन्न करता है।
जंप के पास बिल्कुल अप्रत्यक्ष
jmp bx और jmp WORD [aPointer] हैं:
- पास में
वे केवल गंतव्य के तार्किक पते के ऑफसेट भाग को निर्दिष्ट करते हैं। खंड कोCSमाना जाता है। - पूर्ण अप्रत्यक्ष
निर्देशों के शब्दार्थ को reg या mem याIP = reg,IP = memके पते परIP = mem।
निर्देश को FF /4 रूप में एन्कोड किया गया है, मेमोरी के लिए अप्रत्यक्ष रूप से ऑपरेंड का आकार हर दूसरे मेमोरी एक्सेस के लिए निर्धारित किया जाता है।
बिल्कुल दूर तक कूद जाता है
jmp 7c0h:0000h है:
दूर
यह तार्किक पते के दोनों हिस्सों को निर्दिष्ट करता है: खंड और ऑफसेट।निरपेक्ष निर्देश का सिमेंटिक एड्रेस सेगमेंट पर जाता है: ऑफ़सेट या
CS = segment, IP = offset।
कोड आकार के आधार पर निर्देश को EA <imm32/48> रूप में एन्कोड किया गया है।
कुछ कोडांतरक में दो रूपों के बीच चयन करना संभव है, उदाहरण के लिए NASM jmp 7c0h: WORD 0000h और jmp 7c0h: DWORD 0000h पहला और दूसरा रूप उत्पन्न करते हैं।
बिलकुल अप्रत्यक्ष रूप से दूर की छलांग
jmp FAR WORD [aFarPointer] है:
दूर यह तार्किक पते के दोनों हिस्सों को निर्दिष्ट करता है: खंड और ऑफसेट।
पूर्ण अप्रत्यक्ष निर्देश के शब्दार्थ खंड में कूद गया है : मेम 2 या
CS = mem[23:16/32], IP = [15/31:0]में संग्रहीत ऑफसेट ।
निर्देश को FF /5 रूप में एन्कोड किया गया है, ऑपरेंड का आकार आकार विनिर्देशक के साथ नियंत्रक हो सकता है।
NASM में, थोड़ा सा सहज नहीं है, वे 16:16 jmp FAR WORD [aFarPointer] लिए jmp FAR WORD [aFarPointer] और एक 16:32 ऑपरेंड के लिए jmp FAR DWORD [aFarPointer] ।
गुम हो जाता है
पूर्ण के पास
एक अप्रत्यक्ष कूद के साथ अनुकरण किया जा सकता है।mov bx, target ;BX = absolute address of target jmp bxदूर के रिश्तेदार
वैसे भी कोई मतलब नहीं या बहुत संकीर्ण उपयोग करें।
एक हस्ताक्षरित ऑफसेट को निर्दिष्ट करने के लिए 1 दो पूरक का उपयोग किया जाता है और इस प्रकार पिछड़े कूदते हैं।
2 जो एक seg16 हो सकता है : off16 या एक seg16: off32 , आकारों का 16:16 और 16:32 ।
परीक्षण की स्थिति
सशर्त कूद का उपयोग करने के लिए एक शर्त का परीक्षण किया जाना चाहिए। यहां एक स्थिति का परीक्षण केवल झंडे की जांच के अधिनियम को संदर्भित करता है, वास्तविक कूद को सशर्त कूदता के तहत वर्णित किया गया है।
E86AGS रजिस्टर पर भरोसा करके x86 परीक्षण की स्थिति है, जो एक झंडे का एक सेट रखता है जिसे प्रत्येक निर्देश संभावित रूप से सेट कर सकता है।
अंकगणित निर्देश, जैसे sub या add , और तार्किक निर्देश, जैसे xor या and , जाहिर है "झंडे सेट"। इसका मतलब यह है कि झंडे सीएफ , ओएफ , एसएफ , जेडएफ , एएफ , पीएफ उन निर्देशों द्वारा संशोधित किए गए हैं। किसी भी निर्देश को झंडे को संशोधित करने की अनुमति है, उदाहरण के लिए cmpxchg ZF को संशोधित करता है।
हमेशा यह जानने के लिए निर्देश के संदर्भ की जांच करें कि कौन से झंडे एक विशिष्ट निर्देश द्वारा संशोधित किए गए हैं।
x86 में पहले से संदर्भित सशर्त जंप का एक सेट होता है, जो कि कूदता है अगर और केवल कुछ झंडे सेट किए जाते हैं या कुछ स्पष्ट या दोनों होते हैं।
झंडे
झंडे स्थापित करने में अंकगणित और तार्किक संचालन बहुत उपयोगी हैं। उदाहरण के लिए sub eax, ebx एक sub eax, ebx , अब अहस्ताक्षरित मान रखने के लिए, हमारे पास:
| झंडा | जब सेट किया गया | जब स्पष्ट हो |
|---|---|---|
| जेडएफ | जब परिणाम शून्य हो। EAX - EBX = 0 ⇒ EAX = EBX | जब परिणाम शून्य न हो । EAX - EBX ⇒ 0 ⇒ EAX। EBX |
| सीएफ | जब परिणाम एमएसबी के लिए ले जाने की जरूरत थी। EAX - EBX <0 ⇒ EAX <EBX | जब परिणाम को एमएसबी के लिए कैरी की जरूरत नहीं थी। EAX - EBX ⇒ 0 ⇒ EAX। EBX |
| एस एफ | जब परिणाम MSb सेट किया जाता है। | जब परिणाम MSb सेट नहीं होता है। |
| का | जब एक हस्ताक्षरित अतिप्रवाह हुआ। | जब एक हस्ताक्षरित अतिप्रवाह नहीं हुआ। |
| पीएफ | जब बिट्स की संख्या परिणाम के कम से कम महत्वपूर्ण बाइट में सेट होती है। | जब परिणाम की कम से कम महत्वपूर्ण बाइट में सेट बिट्स की संख्या विषम होती है। |
| ए एफ | जब कम BCD अंक एक कैरी उत्पन्न करता है। यह बिट 4 कैरी है। | जब निचला बीसीडी अंक एक कैरी उत्पन्न नहीं करता था। यह बिट 4 कैरी है। |
गैर-विनाशकारी परीक्षण
sub और and निर्देश अपने गंतव्य को संशोधित संकार्य और दो अतिरिक्त प्रतियां की आवश्यकता होगी (बचाने और बहाल) गंतव्य असंशोधित रखने के लिए।
एक गैर-विनाशकारी परीक्षण करने के लिए निर्देश cmp और test । वे अपने विनाशकारी समकक्ष के समान हैं , केवल ऑपरेशन के परिणाम को छोड़ दिया गया है, और केवल झंडे सहेजे गए हैं ।
| हानिकारक | गैर विनाशकारी |
|---|---|
sub | cmp |
and | test |
test eax, eax ;and eax, eax
;ZF = 1 iff EAX is zero
test eax, 03h ;and eax, 03h
;ZF = 1 if both bit[1:0] are clear
;ZF = 0 if at least one of bit[1:0] is set
cmp eax, 241d ;sub eax, 241d
;ZF = 1 iff EAX is 241
;CF = 1 iff EAX < 241
हस्ताक्षरित और अहस्ताक्षरित परीक्षण
सीपीयू 1 मान दर्ज करने के लिए कोई विशेष अर्थ नहीं देता है, साइन एक प्रोग्रामर निर्माण है। हस्ताक्षरित और अहस्ताक्षरित मानों के परीक्षण के समय कोई अंतर नहीं है। यदि प्रोसेसर को हस्ताक्षरित और अहस्ताक्षरित माना जाना था, तो प्रोसेसर सामान्य सामान्य संबंधों (समान, से कम, अधिक, आदि) का परीक्षण करने के लिए पर्याप्त ध्वज की गणना करता है।
1 हालांकि इसके कुछ निर्देश हैं जो केवल विशिष्ट स्वरूपों के साथ समझ में आते हैं, जैसे दो के पूरक। यह कोड को अधिक कुशल बनाना है क्योंकि सॉफ्टवेयर में एल्गोरिथ्म को लागू करने के लिए बहुत सारे कोड की आवश्यकता होगी।
सशर्त कूदता है
झंडे की स्थिति के आधार पर सीपीयू या तो एक कूद को निष्पादित या अनदेखा कर सकता है। एक निर्देश जो झंडे के आधार पर एक कूद करता है, वह Jcc के सामान्य नाम के अंतर्गत आता है - जंप ऑन कंडिशन कोड 1 ।
पर्यायवाची और शब्दावली
असेंबली कोड की पठनीयता में सुधार करने के लिए, इंटेल ने समान स्थिति कोड के लिए कई समानार्थक शब्द परिभाषित किए। उदाहरण के लिए, jae , jnb और jnc सभी एक ही हालत कोड सीएफ = 0 है।
हालांकि निर्देश नाम का उपयोग करने या न करने के लिए एक बहुत मजबूत संकेत दे सकता है, लेकिन एकमात्र सार्थक दृष्टिकोण उन झंडे को पहचानना है जिन्हें परीक्षण करने की आवश्यकता है और फिर उचित रूप से निर्देशों का चयन करें।
हालांकि इंटेल ने निर्देश नाम दिए हैं जो एक cmp निर्देश के बाद उपयोग किए जाने पर सही अर्थ बनाते हैं। इस चर्चा के प्रयोजनों के लिए, cmp को सशर्त कूदने से पहले झंडे लगाने के लिए माना जाएगा।
समानता
ऑपरैंड बराबर हैं यदि जेडएफ को सेट किया गया है, तो वे अलग-अलग हैं। समानता के लिए परीक्षण करने के लिए हमें ZF = 1 की आवश्यकता है।
je a_label ;Jump if operands are equal
jz a_label ;Jump if zero (Synonym)
jne a_label ;Jump if operands are NOT equal
jnz a_label ;Jump if not zero (Synonym)
| अनुदेश | झंडे |
|---|---|
je , jz | ZF = 1 |
jne , jnz | ZF = 0 |
से अधिक
अहस्ताक्षरित ऑपरेंड के लिए , गंतव्य स्रोत से अधिक है यदि कैरी की आवश्यकता नहीं थी, अर्थात, यदि CF = 0 । जब सीएफ = 0 यह संभव है कि ऑपरेशंस समान थे, तो ZF का परीक्षण करना असहमत होगा।
jae a_label ;Jump if above or equal (>=)
jnc a_label ;Jump if not carry (Synonym)
jnb a_label ;Jump if not below (Synonym)
ja a_label ;Jump if above (>)
jnbe a_label ;Jump if not below and not equal (Synonym)
| अनुदेश | झंडे |
|---|---|
jae , jnc , jnb | सीएफ = 0 |
ja , jnbe | सीएफ = 0, जेडएफ = 0 |
हस्ताक्षरित परिचालनों के लिए हमें उस एसएफ = 0 की जांच करने की आवश्यकता है, जब तक कि एक हस्ताक्षरित अतिप्रवाह नहीं हुआ है, जिसके परिणामस्वरूप एसएफ उलट है। OF = 0 के बाद से यदि कोई हस्ताक्षरित अतिप्रवाह नहीं हुआ और 1 अन्यथा, हमें यह जांचने की आवश्यकता है कि SF = OF ।
ZF का उपयोग सख्त / गैर सख्त परीक्षण को लागू करने के लिए किया जा सकता है।
jge a_label ;Jump if greater or equal (>=)
jnl a_label ;Jump if not less (Synonym)
jg a_label ;Jump if greater (>)
jnle a_label ;Jump if not less and not equal (Synonym)
| अनुदेश | झंडे |
|---|---|
jge , jnl | एसएफ = ऑफ |
jg , jnle | एसएफ = ओएफ, जेडएफ = 0 |
से कम
ये ऊपर की उलटी स्थितियों का उपयोग करते हैं।
jbe a_label ;Jump if below or equal (<=)
jna a_label ;Jump if not above (Synonym)
jb a_label ;Jump if below (<)
jc a_label ;Jump if carry (Synonym)
jnae a_label ;Jump if not above and not equal (Synonym)
;SIGNED
jle a_label ;Jump if less or equal (<=)
jng a_label ;Jump if not greater (Synonym)
jl a_label ;Jump if less (<)
jnge a_label ;Jump if not greater and not equal (Synonym)
| अनुदेश | झंडे |
|---|---|
jbe , jna | CF = 1 या ZF = 1 |
jb , jc , jnae | सीएफ = 1 |
jle , jng | एसएफ! = ओएफ या जेडएफ = 1 |
jl , jnge | एसएफ! = OF |
विशिष्ट झंडे
प्रत्येक ध्वज को व्यक्तिगत रूप से j<flag_name> साथ परीक्षण किया जा सकता है, जहाँ flag_name में अनुगामी F (उदाहरण के लिए CF → C , PF → P ) नहीं है।
इससे पहले कवर नहीं किए गए शेष कोड हैं:
| अनुदेश | झंडा |
|---|---|
js | एसएफ = 1 |
jns | एसएफ = 0 |
jo | का = १ |
jno | का = ० |
jp , jpe (ई = ईवन) | पीएफ = 1 |
jnp , jpo (ओ = विषम) | पीएफ = 0 |
एक और सशर्त कूद (अतिरिक्त एक)
एक विशेष x86 सशर्त कूद ध्वज का परीक्षण नहीं करता है। इसके बजाय यह cx या ecx रजिस्टर (वर्तमान CPU पता मोड 16 या 32 बिट पर आधारित) का परीक्षण मूल्य करता है, और जब रजिस्टर में शून्य होता है, तो कूद को निष्पादित किया जाता है।
यह निर्देश काउंटर रजिस्टर के सत्यापन के लिए डिजाइन किया गया था ( cx/ecx ) से आगे rep निर्देश की तरह, या के आगे loop छोरों।
jcxz a_label ; jump if cx (16b mode) or ecx (32b mode) is zero
jecxz a_label ; synonym of jcxz (recommended in source code for 32b target)
| अनुदेश | रजिस्टर करें (झंडा नहीं) |
|---|---|
jcxz , jecxz | cx = 0 (16 बी मोड) |
jcxz , jecxz | ecx = 0 (32b मोड) |
1 या ऐसा कुछ।
अंकगणित संबंधों का परीक्षण करें
निरुपित पूर्णांक
से अधिक
cmp eax, ebx
ja a_label
से बड़ा या बराबर
cmp eax, ebx
jae a_label
से कम
cmp eax, ebx
jb a_label
इससे कम या इसके बराबर
cmp eax, ebx
jbe a_label
बराबरी का
cmp eax, ebx
je a_label
बराबर नहीं
cmp eax, ebx
jne a_label
पूर्णांक पर हस्ताक्षर किए
से अधिक
cmp eax, ebx
jg a_label
से बड़ा या बराबर
cmp eax, ebx
jge a_label
से कम
cmp eax, ebx
jl a_label
इससे कम या इसके बराबर
cmp eax, ebx
jle a_label
बराबरी का
cmp eax, ebx
je a_label
बराबर नहीं
cmp eax, ebx
jne a_label
a_label
a_label ऊपर के a_label में CPU के लिए लक्ष्य गंतव्य है जब परीक्षण की स्थिति "सही" है। जब परीक्षण की स्थिति "झूठी" होती है, तो सीपीयू सशर्त कूदने के बाद अगले निर्देश पर जारी रहेगा।
समानार्थक शब्द
निर्देश समानार्थक शब्द हैं जिनका उपयोग कोड की पठनीयता को सुधारने के लिए किया जा सकता है।
उदाहरण के लिए ja और jnbe (न तो नीचे jnbe और न ही बराबर) समान निर्देश हैं।
अहस्ताक्षरित साथी कोड पर हस्ताक्षर किए
| ऑपरेशन | अहस्ताक्षरित | पर हस्ताक्षर किए |
|---|---|---|
| > | ja | jg |
| > = | jae | jge |
| < | jb | jl |
| <= | jbe | jle |
| = | je | je |
| ,; =!, <> | jne | jne |