Springen Sie nicht unterzeichnet-Anweisung in c
test ecx,ecx
jns 00400000
ist dieser Assembler-code äquivalent zu dieser c-code?
int ECX;
if((ECX>>31)==1){..}
wenn nicht, wie kann ich es machen das äquivalent?
Vielen Dank für Ihre Hilfe.
Hmmm, wie wäre es
Deinen C-code kann concidered als gleichwertig.
Auf den meisten Implementierungen
jeder code, der versucht, das zu tun diese Art der emulation von Computer-Anweisung Logik sollte mit unsigned-Typen. Unterzeichnet Typen sind voll von der Implementierung definierte und Undefinierte Verhalten, wenn es um die Arten von Dinge, die Sie tun möchten, für diese Art von Anwendung.
if (ecx < 0)
?unsigned int ECX
hatDeinen C-code kann concidered als gleichwertig.
Auf den meisten Implementierungen
(ECX>>31)==1
ist immer false, da >>
auf Ganzzahlen mit Vorzeichen behandelt wird als arithmetische Verschiebung, woraus sich (ECX>>31)==-1
.jeder code, der versucht, das zu tun diese Art der emulation von Computer-Anweisung Logik sollte mit unsigned-Typen. Unterzeichnet Typen sind voll von der Implementierung definierte und Undefinierte Verhalten, wenn es um die Arten von Dinge, die Sie tun möchten, für diese Art von Anwendung.
InformationsquelleAutor Mike L | 2014-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basiert der Wikipedia-Eintrag für die test-Anweisung, wird der test-Satz der sign-flag des flags-Registers auf der Grundlage der bedeutendste bit des Registers
ecx
.Deshalb wird der Sprung genommen wird, iff der
MSB
ist nicht festgelegt, wie Sie gesehen haben. Ihre ErgänzungC
code ist fast gleichwertig, aber je nachdem, ob>>
bedeutet ein logisches oder Bitweises shift (verschieben, sollten Sie die Maske, um sicher zu sein.Natürlich, als Jester erwähnt, wenn das signed-bit gesetzt ist, dann ist es auch wahr, dass
ECX < 0
, so dass ein einfacher test in diesem Fall.InformationsquelleAutor merlin2011
Den
test reg,reg
- Befehl setzt flags, und dass ist äquivalent zu tun, einen Vergleich in C. So wie Jester erwähntreg < 0
bedeutet, ist das Vorzeichen-bit gesetzt.Jedoch in C müssen Sie vorsichtig sein, über die variable Art, die Sie zu tun haben. In Ihrem Fall, würden Sie wollen, zu einem Typ, wie
int32_t
. So stellen Sie sicher, dass Sie testen ein 32-bit-integer. Den gleichen code auf einer 64 bit Plattform kann verwandeln Sie Ihrenint
in 64 bit und das Zeichen sein würde, ein wenig weiter oben.Mit einer Verschiebung in C, wenn man sich nur an einen test in der Montage ist wirklich nicht gleichwertig. Eigentlich, wenn Sie wirklich wollte, zu einem shift, sollten Sie eine ganze Zahl ohne Vorzeichen:
Aber wirklich, das ist nicht sinnvoll und wesentlich schwerer zu Lesen als die einfachen:
Nicht nur das, es wird langsamer (2-Anweisungen anstelle von 1, obwohl der compiler kann herausfinden, dass
test reg,reg + jns
wäre genug, aber Sie sollten nicht darauf zählen.)InformationsquelleAutor Alexis Wilke