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,119 of 4,675    |
|    luserdroog to luserdroog    |
|    Re: Comparing to zero    |
|    27 Aug 20 17:48:47    |
      From: luser.droog@nospicedham.gmail.com              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), JL       3,MOVCXI(0xff,0xff), PUSH(CX))       > CODE(0<, zerolt, POP(AX),MOVCXI(0,0), CMP(,R,AX,CX), JG       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_li       ,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....              --- 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