vm381
vm381

Reputation: 179

assembly check if number is even

I have homework to write assembly code for checking if number is odd or even. I have this code

code_seg SEGMENT
    ASSUME cs:code_seg, ds:data_seg;

    mov ax, 11;
    test ax, 1;

end: jmp end;
code_seg ENDS

And to check if number is even I look if zero flag is set. I know that the test instruction is like logical AND and that if result is 0 it sets zero flag. My question is: how this checks if number is odd/even? Actually I can't figure out why some even (binary) number and (logical and) 1 gives result of 0?

Upvotes: 8

Views: 49609

Answers (4)

Craig Bob
Craig Bob

Reputation: 1

Use a SHIFT operation to set a carry flag equal to the least significant bit. If the carry is 1, the number is odd.

For little-ending: Shift right, check carry

For big-ending: Shift left, check carry

As far as I know this works on any binary CPU but some CPUs are overly complicated with shift operations and carry flags so you must be sure you are only shifting a single bit one time to a single 1-bit register

Upvotes: -1

zx485
zx485

Reputation: 29052

Both unsigned and signed numbers (Two's complement) are odd if the lowest bit is set:

00000001 = 1    (odd)    // unsigned, or signed positive
11111111 = 255  (odd)    // unsigned
01111111 = 127  (odd)    // unsigned, or signed positive
10000001 = -127 (odd)    // signed negative
11111111 = -1   (odd)    // signed negative

So the test instruction

test al, 1

checks if the lowest bit of AL/AX/EAX/RAX is set. If it is, the number is odd.
This can be checked using the Jcc instructions, especially those testing the ?ZERO flag with

JNZ target    ; jump if odd  = lowest bit set
JZ  target    ; jump if even = lowest bit clear = zero

Upvotes: 9

AJNeufeld
AJNeufeld

Reputation: 8705

A (small) integer can be expressed in binary as b3 b2 b1 b0:

b3 * 2^3  +  b2 * 2^2  +  b1 * 2^1  +  b0 * 2^0 =
b3 *  8   +  b2 *  4   +  b1 *  2   +  b0 *  1

where all bn values are either zero or one.

The only way to get an odd number is if the least significant bit (b0) is 1.

AND’ing a value with 1 (in binary, 0001) masks off all bits except the least significant bit (b0) ...

            b3  b2  b1  b0
binary-AND   0   0   0   1
            --  --  --  --
             0   0   0  b0

... giving a zero value if the least significant bit was zero (an even number), or a non-zero value (specifically 1) if the least significant bit was one (an odd number).

Upvotes: 3

ba_D
ba_D

Reputation: 9

sadly am not very experienced with assembly, but in pseudocode there is a feature called "mod" which gives the remainder of a division.

have a look here: Assembly Language - How to Do Modulo?

for example:

x = 3 z = x mod 2

z would be 1, and if x were equal, z would be 0

Upvotes: -2

Related Questions