Hi Guys,

I have a simple "yes/no" question concerning, what I believe to be, a typing error in the brilliant AOA (beta version: 7/4/01) textbook.

There's this cool piece of code on page 752, under section, "Calculation Rather than Branching", that computes the absolute value of a number without using any jump/conditional-jump instructions. Here's how it appears in the textbook (note the code assumes eax already contains a number for computation:)

//---------------------------------------------------------------------------------------

// Set EDX to $FFFF_FFFF if EAX is negative, $0000_0000 if EAX is

// zero or positive:

cdq();

// If EAX was negative, the following code inverts all the bits in EAX,

// otherwise it has no effect on EAX.

xor( edx, edx);

// If EAX was negative, the following code adds one to EAX, otherwise

// it doesn?t modify EAX?s value.

and( 1, edx ); // EDX = 0 or 1 (1 if EAX was negative).

add( edx, eax );

//---------------------------------------------------------------------------------------

That second instruction: -

xor(edx, edx);

- is supposed to be: -

xor(edx, EAX);

- right?

I'm pretty sure that's what it's meant to be, but your professional view would strengthen mine, so thank you very much, in advance...

I have a simple "yes/no" question concerning, what I believe to be, a typing error in the brilliant AOA (beta version: 7/4/01) textbook.

There's this cool piece of code on page 752, under section, "Calculation Rather than Branching", that computes the absolute value of a number without using any jump/conditional-jump instructions. Here's how it appears in the textbook (note the code assumes eax already contains a number for computation:)

//---------------------------------------------------------------------------------------

// Set EDX to $FFFF_FFFF if EAX is negative, $0000_0000 if EAX is

// zero or positive:

cdq();

// If EAX was negative, the following code inverts all the bits in EAX,

// otherwise it has no effect on EAX.

xor( edx, edx);

// If EAX was negative, the following code adds one to EAX, otherwise

// it doesn?t modify EAX?s value.

and( 1, edx ); // EDX = 0 or 1 (1 if EAX was negative).

add( edx, eax );

//---------------------------------------------------------------------------------------

That second instruction: -

xor(edx, edx);

- is supposed to be: -

xor(edx, EAX);

- right?

I'm pretty sure that's what it's meant to be, but your professional view would strengthen mine, so thank you very much, in advance...