Condition: jumps if CF = 0 and ZF = 0. After CMP a, b the CPU has computed a − b. CF = 1 would mean the subtraction needed a borrow, which happens exactly when a is below b as unsigned numbers; ZF = 1 would mean they were equal. With both clear, a is strictly above b. In Intel's naming "above" and "below" are the unsigned words, "greater" and "less" the signed ones.

After CMP a, bUnsignedSigned
a = bJE (ZF = 1)JE (ZF = 1)
a ≠ bJNE (ZF = 0)JNE (ZF = 0)
a > bJA (CF = 0 and ZF = 0)JG (ZF = 0 and SF = OF)
a ≥ bJAE (CF = 0)JGE (SF = OF)
a < bJB (CF = 1)JL (SF ≠ OF)
a ≤ bJBE (CF = 1 or ZF = 1)JLE (ZF = 1 or SF ≠ OF)
Prints Y. Replace JA with JG and it prints N: the same bits, read as signed.
MOV AL, 200
CMP AL, 100 ; 200 > 100 unsigned; as signed, 200 is -56
MOV DL, "Y" ; MOV leaves the flags alone
JA SHOW1 ; taken: DL stays "Y"
MOV DL, "N"
SHOW1:
MOV AH, 02h ; DOS: print the character in DL
INT 21h

Use the unsigned family for addresses, offsets, sizes, counts, characters and anything else that cannot be negative. Taking the wrong family is a classic bug that hides until a value reaches 80h (bytes) or 8000h (words).

Range

On the 8086 JA exists only in the SHORT form: two bytes, opcode 77h and a signed 8-bit displacement counted from the end of the instruction. The target must lie within −128..+127 bytes of that point. To go farther, invert the test and hop over an unconditional JMP, which can reach the whole segment. MASM 6 makes this rewrite itself when it finds the target out of range (its default OPTION LJMP), so the listing may show two instructions where you wrote one.

JBE SKIP1 ; the opposite test, a short hop
JMP FARAWAY ; any distance in the segment
SKIP1:

Later CPUs

The 80386 added a near form of every conditional jump, 0Fh 87h followed by a 16-bit displacement (32-bit in 32-bit code), so from the 386 on JA can reach anywhere in the segment. Code for the 8086 must stay with the short form.