Question

I have a short piece of (x86) assembly that I am trying to figure out what it does.

...
 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
....

It looks like its looping though until the "JNE" evaluates to false, i.e. the zero flag = 0. (possibly its putting the numbers 1, 2, 3 ... into the stack??)

From my short investigation into assembly (im new at this) it seam you set the zero flag by doing a compare operation (CMP), but I dont see a compare operation.

So, under what conditions will it break out of this loop?

Was it helpful?

Solution

inc sets ZF if the value of cl after the increment is zero. Your loop is doing this:

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;

The loop terminates when cl is incremented from 255 and wraps around to 0, setting ZF.

OTHER TIPS

Arithmetic instructions such as add, sub, inc, dec, sar, sal, but also bitwise operations such as test, shl, shr, or, and, xor, neg and so on, modify the ZF.

math operations such as inc and dec can also set the zero flag.

Or, for starters, save [push] the flags on stack, [pop] get the stack in register, use arithmatic or operator with desired bit on the register, push the register and pop in the flag.

something like this.

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top