home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.asm.x86      Ahh, the lost art of x86 assembly      4,675 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 4,121 of 4,675   
   wolfgang kern to luserdroog   
   Re: Comparing to zero   
   28 Aug 20 08:27:54   
   
   From: nowhere@nospicedham.never.at   
      
   On 28.08.2020 02:48, luserdroog wrote:   
   > On Thursday, August 27, 2020 at 3:12:28 PM UTC-5, luserdroog wrote:   
   >> Hi everyone,   
   >>   
   >> I'm working on primitives for my newly working forth interpreter and I'm   
   >> having difficulty with comparisons 0= 0> and 0> . These each take a   
   >> number from the stack and push 0 or all-bits-1.   
   >>   
   >> My code for 0= and 0> appear to be producing results, but I get the wrong   
   >> result for 0< even though it seems to follow appropriate parallel logic   
   >> as 0>. Any ideas? Does this suggest a bug in assembly or in my emulator?   
   >>   
   >> CODE(0=,     zeroeq,    POP(AX),MOVCXI(1,0), CMP(,R,AX,CX), SBB(,R,AX,AX),   
   PUSH(AX))   
   >> CODE(0>,     zerogt,    POP(AX),MOVCXI(0,0), CMP(,R,AX,CX), J   
   ,3,MOVCXI(0xff,0xff), PUSH(CX))   
   >> CODE(0<,     zerolt,    POP(AX),MOVCXI(0,0), CMP(,R,AX,CX), J   
   ,3,MOVCXI(0xff,0xff), PUSH(CX))   
   >>   
   >> testing:   
   >> WORD(run,    run,       c_lit,0, c_zeroeq, c_dot,   
   >>                          c_lit,12, c_zerogt, c_dot,   
   >>                          c_lit,minus(50), c_zerolt, c_dot,   
   >>                          c_lit,79,c_emit, c_lit,75,c_emit, c_   
   it,5,c_double,c_emit, c_bye)   
   >>   
   >> output:   
   >> $ ./a8086   
   >> 110OK   
   >   
   > I changed JL to JLE and JG to JGE. Still not right.   
   > Here's a trace through zerogt.   
   >   
   > ax:01f6 cx:0001 dx:0030 bx:01f8 sp:0ffe bp:2000 si:05ac di:0000 ip:01f8   
   fl:0004 NC NO NS NZ   
   > 58(130) popax:   
   > ax:000c cx:0001 dx:0030 bx:01f8 sp:1000 bp:2000 si:05ac di:0000 ip:01f9   
   fl:0004 NC NO NS NZ   
   > b9(271) movcxi: 00(000) 00(000)   
   > ax:000c cx:0000 dx:0030 bx:01f8 sp:1000 bp:2000 si:05ac di:0000 ip:01fc   
   fl:0004 NC NO NS NZ   
   > 3b(073) cmpwt: c8(310) x:0 y:12 ->fffffff4   
   > ax:000c cx:0000 dx:0030 bx:01f8 sp:1000 bp:2000 si:05ac di:0000 ip:01fe   
   fl:0891 CA OV SN NZ   
   > 7e(176) jle: 03(003) <0>   
   > ax:000c cx:0000 dx:0030 bx:01f8 sp:1000 bp:2000 si:05ac di:0000 ip:0200   
   fl:0891 CA OV SN NZ   
   > b9(271) movcxi: ff(377) ff(377)   
   > ax:000c cx:ffff dx:0030 bx:01f8 sp:1000 bp:2000 si:05ac di:0000 ip:0203   
   fl:0891 CA OV SN NZ   
   > 51(121) pushcx:   
   > ax:000c cx:ffff dx:0030 bx:01f8 sp:0ffe bp:2000 si:05ac di:0000 ip:0204   
   fl:0891 CA OV SN NZ   
   >   
   >   
   > It should be comparing 0 and 12, so it should take 0-12 and set   
   > zf=0 sf=1 and of=1. Then JLE should jump if (sf^of)|zf which is 0.   
   > And it seems to be doing all that. Maybe I'm just using CMP wrong?   
   >   
   > The description from the 8086 family manual:   
   >   
   > CMP destination,source   
   > CMP (Compare) subtracts the source from the destination, which may be   
   > bytes or words, but does not return the result. The operands are   
   > unchanged, but the flags are updated and can be tested by a subsequent   
   > conditional jump instruction. CMP updates AF, CF, OF, PF, SF and ZF.   
   > The comparison reflected in the flags is that of the destination to   
   > the source. IF a CMP instruction is followed by a JG (jump if greater)   
   > instruction, for example, the jump is taken if the destination operand   
   > is greater than the source operand.   
   >   
   > So, in "CMP CX=0,AX=12" CX is the destination. So 0-12. Hmmm.   
   > I still don't get it. But all the pieces seem to be here....   
      
      
   x86 Conditions:   
   O,  NO   
   C,  NC  aka B, NB    aka <, >=   
   Z,  NZ  aka E, NE    aka =, <>   
   NA, A   aka BE,NBE   aka <=,>   aka ZorC, aka NCNZ   
   S,  NS               aka -, +   
   PE, PO  aka P, NP   
      
   L,  NL  aka NGE,GE aka  <0,>=0   
   NG, G   aka LE,NLE aka <=0, >0   
      
   only the last four and S/NS work signed   
   __   
   wolfgang   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca