在x86汇编中,如何在不进行比较操作的情况下设置零标志(ZF)?

Rob*_*ert 8 x86 assembly machine-code

我有一小段(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
....
Run Code Online (Sandbox Code Playgroud)

它看起来像循环,直到"JNE"评估为false,即零标志= 0.(可能是它将数字1,2,3 ......放入堆栈?)

从我对程序集的简短调查(我刚接触到它)接缝你通过做一个比较操作(CMP)设置零标志,但我没有看到比较操作.

那么,它会在什么条件下突破这个循环呢?

Ste*_*non 12

inc如果cl增量后的值为零,则设置ZF .你的循环是这样做的:

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;
Run Code Online (Sandbox Code Playgroud)

当循环cl从255递增并且回绕到0时,循环终止,设置ZF.

  • 1实际上是缩放偏移量的大小.所以它真的是数组[cl*1] = cl. (3认同)
  • @GreyCat,迂腐`[esp + 1*ecx]`(特别是没有位移,而不是disp8 = 0或者disp32 = 0),虽然在这种情况下它并不是很模糊,因为`esp`不能用作索引寄存器. (2认同)

new*_*gre 8

诸如此类的算术指令以及诸如等的add, sub, inc, dec, sar, sal按位运算test, shl, shr, or, and, xor, neg修改ZF.