2012-04-11 12 views
0

Ich schreibe ein kleines Programm in Assembly und ich muss ein Int, das ist eine Zweierpotenz berechnen und verwendet das letzte Bit in einem Register. Sagen wir, ich muss 2^31 berechnen und das Ergebnis im ebx-Register speichern.So verwenden Sie unsignierte Ints in Assembly

Wie kann ich dieses int für arithmetische Operationen als vorzeichenlos behandeln?

Antwort

1

Um eine Zweierpotenz zu berechnen Sie verwenden, um eine Verschiebung nach links Betrieb - so etwas wie

SAL EAX,31 

Addition und Subtraktion Operationen sind die gleichen für signierte und unsignierte Werte - dh, es ist nur, wenn Sie etwas mit dem Ergebnis zu tun (wie es angezeigt wird), die Sie haben zu prüfen, es mit oder ohne Vorzeichen

für Division und Multiplikation gibt es verschiedene Anweisungen für signierte (IDIV, IMUL) und ohne Vorzeichen (DIV, MUL)

+0

Das ist, was ich benutze. Aber wie du gesagt hast, wenn ich es zeige, bekomme ich eine negative Zahl. Wie kann ich es richtig anzeigen? – Bob

+0

Wie konvertieren Sie die Nummer in eine Zeichenfolge für die Anzeige? Das ist der Ort, der Änderungen braucht. – MiMo

+0

Ich rufe 'printf' mit einer formatierten Zeichenkette und der Zahl als Argumente – Bob

1

Daten in vielen Assemblersprachen (dh Befehlssatz-Architekturen) ist typenlos, außer in dem Umfang, dass sie eine Größe hat: dh 8 Bit ist ein „Typ“ unterscheidet sich von 16.

Ihr EBX-Register wird weder unterzeichnet noch ohne Vorzeichen; es ist nur eine Bank von 32 Bits.

Die Semantik der Bits (was die Bits bedeuten) hängt von der angewendeten Operation ab und nicht von irgendeiner Art deklariertem Typ wie in einer höheren Programmiersprache.

x86 unterscheidet "logische Verschiebungen" von "arithmetischen Verschiebungen".

Um 1 << 31 zu berechnen, möchten Sie eine logische Verschiebung nach links (SAL) verwenden. Verwenden Sie zum Verschieben von Vorzeichen die arithmetischen Verschiebungen.

+0

In einigen Befehlssatzarchitekturen gibt es verschiedene Anweisungen für die Addition von Vorzeichen und Vorzeichen, obwohl die Maschine Zweierkomplement ist. MIPS ist so; Es hat "Add" und "Addu" Anweisungen. Ironischerweise verwendet GCC auch 'addu' für vorzeichenbehaftete Zahlen. Die Ebene "add" erzeugt eine Überlauffalle, aber "addu" implementiert die Umbrucharithmetik. C-Programme erwarten jedoch häufig, dass Arithmetik auch von vorzeichenbehafteten Zahlen umhüllt wird, anstatt von einer Überlauf-Falle! – Kaz