www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/02/21/09:45:56

From: "Andrew Crabtree" <andrewc AT rosemail DOT rose DOT hp DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: !!Absolute value with inline ASM!!
Date: Tue, 17 Feb 1998 09:22:37 -0800
Organization: Hewlett Packard
Lines: 23
Message-ID: <6cch0m$khn$1@rosenews.rose.hp.com>
References: <D1FB30BBA491D1118E6D006097BCAE390B9202 AT Probe-nt-2a DOT Probe DOT co DOT uk>
NNTP-Posting-Host: ros51675cra.rose.hp.com
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

Shawn Hargreaves wrote in message ...
>Henri Ossi writes:
>> I need to get the absolute value of a registers (bx)
>> How is this done in asm.
>> (in one command, not using cmp)
>I don't know of any such method.
Me neither.  Unless Intel has an undocumented abs instruction.

> I think a test followed by conditional
>negation is probably the best you can do: that is what gcc produces for
>the abs() function.

I can do better (well ok, some guy on comp.lang.asm.x86 did ;).  Eliminating
the conditional is easy.  Just sign extend the value to the
next size up (convert word to dword say), then xor the values, then
subtract.  If the sign bit
was zero then both the xor and sub are effectively nops.  If it was one then
you negate everything,
and then add 1 to it, which gives the exact 2s complement.

Andy

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019