2011-12-06 53 views
8

我有一小段(x86)程序集,我試圖弄清楚它的功能。在x86程序集中,如何在不進行比較操作的情況下設置零標誌(ZF)?

... 
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 ...進棧??)

從我的短調查總成(IM在這個新)見不着你做一個比較操作(CMP)設置零標誌,但我沒有看到一個比較操作。

那麼,在什麼條件下它會打破這個循環?

回答

11

inc設置ZF如果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,設置ZF。

+0

好吧,這是有道理的。謝謝! – Robert

+0

我想我除了'mov%cl,(%esp,%ecx,1)'之外都跟着所有。在英文中,我會說「在ESP + ECX的地址處將CX(CL)的低8位移入RAM中」,這是合理的,但'1'操作數是什麼?這真的是'數組[cl + 1] = cl'(堆棧溢出?)或者'array [cl] = cl + 1'?可能我錯過了x86彙編的一些細微差別,但我很好奇。 – mpontillo

+3

1實際上是縮放偏移量的大小。所以它真的是數組[cl * 1] = cl。 –

2

數學運算,例如INC和DEC還可以設置零標誌。

7

算術指令如add, sub, inc, dec, sar, sal,還包括按位運算,如test, shl, shr, or, and, xor, neg等,修改ZF。

+0

感謝您的完整列表,它會很有用。你是從一個特定的參考文獻中得到這個信息還是你知道這個信息? – Robert

+0

我知道這些說明,但我必須在英特爾手冊/谷歌中查找具體效果。我不知道影響ZF的指令列表。 – newgre

1

或者,對於初學者來說,節省[PUSH]在堆棧中的標誌,[流行]獲得寄存器堆棧,對寄存器使用arithmatic或操作者與所需的位,推寄存器和標誌彈出。

這樣的事情。

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 
相關問題