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