Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [ASM x86] Absolutwert eines vorzeichenbehafteten Integers (https://www.delphipraxis.net/159963-%5Basm-x86%5D-absolutwert-eines-vorzeichenbehafteten-integers.html)

BUG 20. Apr 2011 15:21

[ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Bekommt man in Assembler irgendwie mit einer Instruktion den Absolutwert eines vorzeichenbehafteten Integers in einem Register?
Oder muss ich das zu Fuß machen?

mkinzler 20. Apr 2011 15:24

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Das höchstwertige Bit ausblenden

shmia 20. Apr 2011 15:32

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Kuckst du: http://www.strchr.com/optimized_abs_function

himitsu 20. Apr 2011 15:33

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
nicht ganz, wobei dieses Bit schon richtig ist, aber die negativen Werte sind noch um 1 verschoben. ( die 0 braucht man ja nicht doppelt, da -0 = +0 )

wenn X negativ,
dann X negieren oder
Delphi-Quellcode:
X := X xor -1 {$FFFFFFFF}
.


oder so wie Delphi es delphi macht
Delphi-Quellcode:
//mov EAX, X
cdq
xor EAX, EDX { wenn X negativ, dann ist EDX = -1,           }
              { ansonsten ist es 0 und es würde nix passieren }
sub EAX, EDX { wenn X negativ, dann -(-1) aka +1, ansonsten -0 aka nichts }
//mov X, EAX
Da sollte man nur beachten, daß man hierfür ein freies EDX benötigt und der Wert in EAX liegen muß,

ansontens kommt man wohl nicht um die ASM-Variante des IF-Konstrukts nicht herum.

[add]
das vergessene SUB eingefügt

Neutral General 20. Apr 2011 15:34

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Zitat:

Zitat von mkinzler (Beitrag 1096232)
Das höchstwertige Bit ausblenden

.. ist Schwachsinn, da Integer-Zahlen 2k-codiert sind.

Was mir momentan einfällt:
Delphi-Quellcode:
function AbsAsm(A: Integer): Integer;
asm
  cmp eax, 0
  jge @@ende
  neg eax
  @@ende:
end;
Kann aber gut sein, dass es da noch was optimierteres gibt.

@himitsu: Dein Code funktioniert bei mir aber auch nicht richtig...
Hab mal nachgeguckt.. Hast bei deinem Code was vergessen:
Delphi-Quellcode:
function AbsAsm2(A: Integer): Integer;
asm
  cdq
  xor eax, edx
  sub eax, edx
end;
So gehts auch!

BUG 20. Apr 2011 15:40

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Zitat:

Zitat von mkinzler (Beitrag 1096232)
Das höchstwertige Bit ausblenden

Dann hab ich das Zweierkompliment des Wertes den ich haben will in den unteren Bits.

Zitat:

Zitat von shmia (Beitrag 1096233)

Mhm, dann wird es wohl nicht in einer Instruktion gehen :(

Danke für die Vorschläge.

himitsu 20. Apr 2011 15:53

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Zitat:

Zitat von BUG (Beitrag 1096236)
Mhm, dann wird es wohl nicht in einer Instruktion gehen :(

Kommt drauf an, was für dich eine Instruktion ist :stupid:

Delphi-Quellcode:
call ABS

BUG 20. Apr 2011 16:39

AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
 
Code:
cdq
add eax, edx
xor eax, edx
Das lässt sich gut erklären, falls die Tutoren nachfragen :mrgreen:
Werde ich nehmen, edx ist in dem Moment bei mir eh frei.

Auf die Idee cdq dafür zu missbrauchen, wäre ich wohl ewig nicht gekommen. Werde ich mir merken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz