2011-12-06 16 views
8

मेरे पास एक छोटा सा टुकड़ा है (x86) असेंबली है कि मैं यह पता लगाने की कोशिश कर रहा हूं कि यह क्या करता है।x86 असेंबली में आप एक तुलना ऑपरेशन किए बिना शून्य ध्वज (जेडएफ) कैसे सेट कर सकते हैं?

... 
6:  81 ec 00 01 00 00  sub $0x100, %esp 
c:  31 c9     xor %ecx , %ecx 
e:  88 0c 0c    mov %cl , (%esp, %ecx, 1) 
11:  fe c1     inc %cl 
13:  75 f9     jne 0xe 
.... 

यह अपने पाशन की तरह लग रहा है, हालांकि जब तक "JNE", गलत का आकलन यानी शून्य झंडा = 0. (संभवतः इसकी संख्या 1, 2, 3 डाल ... ढेर ?? में)

असेंबली में मेरी छोटी जांच से (इस पर नया है) यह सीम आप एक तुलना ऑपरेशन (सीएमपी) करके शून्य झंडा सेट करते हैं, लेकिन मुझे एक तुलना ऑपरेशन नहीं दिखाई देता है।

तो, इस लूप से किस स्थिति में यह टूट जाएगा?

उत्तर

11

inc जेडएफ सेट करता है यदि वृद्धि के बाद cl का मान शून्य है। आपका पाश इस कर रही है:

sub $0x100, %esp   // unsigned char array[256]; 
xor %ecx , %ecx   // unsigned char cl = 0; 
mov %cl , (%esp, %ecx, 1) // e: array[cl] = cl; 
inc %cl      // cl += 1; 
jne 0xe      // if (cl != 0) goto e; 

पाश समाप्त हो जाता है जब cl 255 से वृद्धि और 0 के इर्द-गिर्द घूमती, जेडएफ स्थापित कर रही है।

+0

ठीक है, यह समझ में आता है। धन्यवाद! – Robert

+0

मुझे लगता है कि मैंने 'mov% cl, (% esp,% ecx, 1) को छोड़कर सभी का पालन किया। अंग्रेजी में मैं कहूंगा "ईएसपी + ईसीएक्स के पते पर रैम में सीएक्स (सीएल) के निचले 8 बिट्स को ले जाएं, जो समझ में आता है, लेकिन '1' ऑपरेंड क्या है? क्या यह वास्तव में 'सरणी [सीएल + 1] = सीएल' (ढेर ओवरफ्लो?) या शायद' सरणी [सीएल] = सीएल + 1' है? शायद मैं x86 असेंबली की कुछ बारीकियों को याद कर रहा हूं, लेकिन मैं उत्सुक हूं। – mpontillo

+3

1 वास्तव में एक आकार है जिसके द्वारा ऑफसेट को स्केल करना है। तो यह वास्तव में सरणी [सीएल * 1] = सीएल। –

2

गणित संचालन जैसे कि इंक और डीसी भी शून्य ध्वज सेट कर सकते हैं।

7

add, sub, inc, dec, sar, sal जैसे अंकगणितीय निर्देश, लेकिन test, shl, shr, or, and, xor, neg जैसे बिटवाईर ऑपरेशंस और इसी तरह, ZF को संशोधित करें।

+0

पूरी सूची के लिए धन्यवाद, यह उपयोगी होगा। क्या आप इसे किसी विशेष संदर्भ से प्राप्त करते हैं या क्या आप इसे हाथ से जानते हैं? – Robert

+0

मुझे इन निर्देशों को पता था, लेकिन मुझे इंटेल मैनुअल/Google में विशिष्ट प्रभावों को देखना पड़ा। मैं जेडएफ को प्रभावित करने वाले निर्देशों की एक सूची के बारे में नहीं जानता। – newgre

1

या, स्टार्टर्स के लिए, स्टैक पर झंडे को [पुश] सहेजें, [पॉप] रजिस्टर में स्टैक प्राप्त करें, रजिस्टर पर वांछित बिट के साथ अंकगणित या ऑपरेटर का उपयोग करें, रजिस्टर को दबाएं और ध्वज में पॉप करें।

ऐसा कुछ।

pushf 
pop ax 
or ax, 0x100 [this will set trap flag, you can get the value for any flag or flags you want] 
push ax 
popf