![]() |
wie mach ich einen aritmethic shift?
Nabend,
In C++ gibt es ja folgende operatoren: << = shl >>> = shr >> = ? was ist das equivalent zum >> Aritmethic shift? in asm müsste es dafür eigentlich asr geben, aber er kennt asr nicht >.< Kann mir da jemand helfen? PS: Delphi XE MFG Memnarch |
AW: wie mach ich einen aritmethic shift?
Zitat:
Code:
Was genau würdest du auch von einem Arithmetic Shift erwarten? Ich meine wenn ich die Bits nach links rausschiebe, macht es Sinn daß Flags gesetzt werden. Bei dem Verschieben nach rechts erschließt sich mir nicht was der Unterschied sein würde.
$ gcc -o test test.cpp
test.cpp: In function ‘int main(int, char**)’: test.cpp:21: error: expected primary-expression before ‘>=’ token |
AW: wie mach ich einen aritmethic shift?
|
AW: wie mach ich einen aritmethic shift?
ach es ist SAR, jetzt versteht mich auch der inlineassembler :D
ein SAR darf nicht so einfach das vorzeichen bit mitverschieben, wie es das SHR macht. kann auch sien das ich was verwechselt habe und in C++ der >>> automatisch erkannt wird.(hatte den C den operator?) |
AW: wie mach ich einen aritmethic shift?
Zitat:
Zitat:
Zitat:
|
AW: wie mach ich einen aritmethic shift?
Zitat:
Delphi-Quellcode:
Ergebnis:
var
a,b,c,d: integer; begin a := 4242; b := -4242; c := a; d := b; asm shr a, 8; shr b, 8; sar c, 8; sar d, 8; nop; end; end; a = 16 CPU-Ansicht:
Code:
Oder hab ich dich missverstanden?
Unit1.pas.36: shr a, 8;
00453364 C16DFC08 shr dword ptr [ebp-$04],$08 Unit1.pas.37: shr b, 8; 00453368 C16DF808 shr dword ptr [ebp-$08],$08 Unit1.pas.38: sar c, 8; 0045336C C17DF408 sar dword ptr [ebp-$0c],$08 Unit1.pas.39: sar d, 8; 00453370 C17DF008 sar dword ptr [ebp-$10],$08 Meintest du vielleicht den Shift-Left-Befehl? Denn da sollte es logischerweise keinen Unterschied machen... |
AW: wie mach ich einen aritmethic shift?
@Assarbard:
kann ich mir nicht vorstellen edit@Assarbard: Wo hast du den das Zitat her? denkdran das in Delphi shr was anderes ist als in C. Delphi macht hier nen logic shift, während in den c sprachen nen arithmetic shift gemacht wird. shr = logic shift sar = arithmetic shift ´@NamenLozer: Danke für die gegenüberstellung :) |
AW: wie mach ich einen aritmethic shift?
Zitat:
Zitat:
|
AW: wie mach ich einen aritmethic shift?
ein normales shr füllt links immer mit 0en auf.
Ein sar dem Vorzeichen entsprechend (2er Komplement): Zitat:
|
AW: wie mach ich einen aritmethic shift?
aritmethic?
arithmetic :gruebel: Delphi unterscheidet leider nicht so wirklich, zwischen arithmetisch und logisch/binär. Obwohl es z.B. in den Record-Opertaoren vorgesehn ist, wird dennoch standardmäßig überall nur das logische/binäre Shift verwendet. Nur bei den Booleans wird logisch gearbeitet, aber sonst eben überall nur binär. (and, or, not und xor) Du könntest jetzt zwar mit den Operatoren versuchen dir ein arithmetisches Shift zu basteln oder du nutzt eben Funktionen dafür.
Delphi-Quellcode:
(nur für Win32 ... bei Win64 wurden ja die Register verschoben)
function {sal}AritmethicShiftLeft(i: Integer; Count: Byte): Integer;
asm SAL EAX, DL end; function {sar}AritmethicShiftRighti: Integer; Count: Byte): Integer; asm SAR EAX, DL end; In Pascal würde der Code zwar plattformunabhängig, aber optimal würde der Code nicht wirklich.
Delphi-Quellcode:
(läßt sich aber bestimmt noch etwas optimieren)
function {sal}AritmethicShiftLeft(i, Count: Integer): Integer;
begin if Count < 0 then Exit(AritmethicShiftRight(i, -Count)); Result := (i and $80000000) or ((i shl Count) and not $80000000); end; function {sar}AritmethicShiftRight(i, Count: Integer): Integer; begin if Count < 0 then Exit(AritmethicShiftLeft(i, -Count)); Result := (i and $80000000) or ((i shr Count) or (Integer(-1) shl (32 - Max(Count, 32)))); end; |
AW: wie mach ich einen aritmethic shift?
@Himi whoops, ja die Rechtschreibung :stupid:
In meinem Emulator brauch ich SAR an 3 stellen, weswegen ich dort jetzt ganz einfach und stumpf nen ASM-Block aufmache. Funktioniert :thumb: MFG Memnarch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 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 by Thomas Breitkreuz