Legacy apps in Windows/OS X was Re: Old MS-DOS & Win Software
pat at computer-refuge.org
Wed Dec 7 23:21:28 CST 2005
Chuck Guzis declared on Wednesday 07 December 2005 21:32:
> On 12/7/2005 at 9:03 PM Patrick Finnegan wrote:
> >Chuck Guzis declared on Wednesday 07 December 2005 20:26:
> >> keeping things like the DAA instruction intact and supporting a
> >> bunch of do-nothing instructions like MOV DL,DL.
> >FYI, that most certainly doesn't just "do nothing." It updates the
> > flags based on the contents of the DL register, and you could do a
> > conditional jump based on the results.
> With all due respect, I suggest that you review your X86 instructions
> and their effect on flags. Try running this little bit of code under
> your favorite debugger (DEBUG is fine) and have a gander at the flags
> xor ax,ax
> mov dl,-1
> mov dl,dl
> int 3
I'll admit it's been a while since I've bother to do much x86 assembly,
but I don't doubt you're right. I think I might have been thinking more
of "and dl, dl", which I'm pretty sure ought to update the flags.
Pretty much any assembly language has useless constructs like that,
though, just because it makes the instruction set easier to implement
(and sometimes, compilers easier to write).
For example, in RISC architectures, register 0 is generally fixed to read
0. When you would normally do stuff like:
you can also do
mov r0, r0
(using syntax there the matching intel syntax
> Now, if your point of view held, the condition code should show a
> nonzero negative (signed) value. In fact, they show a zero positive
> value (i.e. the results of the XOR AX,AX). In fact, moves, be they
> register to memory, register to register or memory to register or
> memory to memory do not affect condition code bits. Else why have a
> nutty instruction like JCXZ? You coiuld just MOV CX,CX and jumpt on
> the zero result...
Sure there's a reason. JCXZ is one instruction, and (probably) uses up
less code space than the other. You could "AND CX,CX" and do a JZ
afterwards to do the same thing.
> >> Consider on Windows XP that you can still run the following code:
> >> mov cl,9
> >> mov dx,offset HWMes
> >> call 5
> >> mov cl,0
> >> call 5
> >Huh? Do you mean this?
> >MOV AH, 9
> >MOV DX, HWMes
> >INT 21h
> >MOV AH, 0
> >INT 21h
> Nope, I mean what I said--try it.
I don't have a Windows system to try it on. I could probably find
something running DOS (or OS/2) to try it on, assuming DEBUG is
installed on the machine... I vaguely remember the PCB "jump to DOS"
vector, but never used it when I wrote code (for the same reason I never
used an FCB to touch files.. probably just too young :).
Purdue University ITAP/RCAC --- http://www.rcac.purdue.edu/
The Computer Refuge --- http://computer-refuge.org
More information about the cctech