![]() |
[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? |
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Das höchstwertige Bit ausblenden
|
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Kuckst du:
![]() |
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:
Da sollte man nur beachten, daß man hierfür ein freies EDX benötigt und der Wert in EAX liegen muß,
//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 ansontens kommt man wohl nicht um die ASM-Variante des IF-Konstrukts nicht herum. [add] das vergessene SUB eingefügt |
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Zitat:
Was mir momentan einfällt:
Delphi-Quellcode:
Kann aber gut sein, dass es da noch was optimierteres gibt.
function AbsAsm(A: Integer): Integer;
asm cmp eax, 0 jge @@ende neg eax @@ende: end; @himitsu: Dein Code funktioniert bei mir aber auch nicht richtig... Hab mal nachgeguckt.. Hast bei deinem Code was vergessen:
Delphi-Quellcode:
So gehts auch!
function AbsAsm2(A: Integer): Integer;
asm cdq xor eax, edx sub eax, edx end; |
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Zitat:
Zitat:
Danke für die Vorschläge. |
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Zitat:
Delphi-Quellcode:
call ABS
|
AW: [ASM x86] Absolutwert eines vorzeichenbehafteten Integers
Code:
Das lässt sich gut erklären, falls die Tutoren nachfragen :mrgreen:
cdq
add eax, edx xor eax, edx 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 07:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz