8086 ASM Bresenham's Line Algorithm
These are just some quick thoughts, not a detailed analysis.


Comments.  Enough said.
If a conditional jump (like jge) is not taken, execution just continues with the next instruction.  So this seems redundant (likewise with numsetup1):




    jge lxisetup1
    jmp lxisetup2
lxisetup1:




could be written as:



    jl lxisetup2





You are repeatedly moving -1 into registers and using it in other ways.  Why not make use of an additional register (say si)?  Set it to -1 at the top of this routine (remember to push/pop it if your calling convention requires it) and use it as needed: mul si, mov ax, si.
A common shortcut for zeroing registers is xor ax, ax.  Produces slightly smaller code.
Looking at your final loop, you have:




lloopstart:
    cmp dx, lnumpix
    jg lloopend
    inc dx
    jmp lloopstart
lloopend:


This means that you will be doing 2 jumps in a row (jmp lloopstart, jg lloopend).  An alternative might be:



    cmp dx, lnumpix
    jg lloopend
lloopstart:
    inc dx
    cmp dx, lnumpix
    jle lloopstart
lloopend:


Instead of having your loop count up (for x=0 to 10), sometimes having your loop count down to zero (for x=10 to 0) can produce (slightly) more efficient code (not sure it would work in this case):



mov dx, lnumpix
lloopstart:
    dec dx
    jnz lloopstart