2016-10-27 2 views
0

Ich bin sehr verwirrt, wenn es so aussieht, als ob mein Code einen bestimmten Wert manchmal als signiert behandelt und manchmal als vorzeichenlos behandelt, wenn man Werte vergleicht. Woher weiß der Code, ob ein Wert signiert oder unsigniert ist?Woher weiß der Assembly-Code, ob ein Wert signiert oder unsigniert ist?

+2

Wenn Sie Assemblercode schreiben, liegt es in Ihrer Verantwortung zu wissen, wann Sie welche Anweisungen verwenden. Wenn Sie in einer anderen Sprache programmieren, liegt dies in der Verantwortung des Compilers oder Interpreters, basierend auf den Datentypen, die Sie in Ihrem Code verwenden. – Michael

+0

Abgesehen von Anweisungen, die speziell signiert oder unsigniert sind: es weiß nicht. Es ist * du *, wer den Code geschrieben hat, wer weiß. Zum Beispiel wird ein Vergleich verschiedene Flags setzen oder löschen, ohne zu wissen, ob die Verwendung dieses Bitmusters signiert oder unsigniert ist. Sie verwenden verschiedene Versionen der Verzweigungsbefehle, die verschiedene Kombinationen von Flags entsprechend Ihren Anforderungen testen. Und wenn eine Anweisung das Vorzeichen-Flag aus dem Ergebnis ms.s setzt. Bit, und Ihr Wert ist unsigned, dann ignorieren Sie es einfach. –

+0

Können Sie mir ein Beispiel geben? – fuz

Antwort

1

Einige Prozessorbefehle sind signiert, einige andere nicht, wenn Sie eine Var in C deklarieren, was ein unsigned ist, wird in Assembly mit vorzeichenlosen Anweisungen kompilieren (normalerweise schneller auszuführen) Wenn Sie Assembly verwenden, werden Sie müssen die Anweisungen wählen, die Sie wirklich brauchen.

+0

Die meisten Anweisungen (z. B. add/sub) ist es egal, und es ist die gleiche Anweisung für beide. Vielleicht denkst du an MIPS, wo es ADD vs. ADDU gibt, mit dem Unterschied, dass ADD beim Überlauf eine Ausnahme auslöst (oder so ähnlich, IIRC). Normalsigniert und Unsigned sind nur relevant für Rechtsverschiebung, Division und Voll-Multiplikation (Wort * Wort -> Doppelwort-Ergebnis). Die untere Hälfte einer Multiplikation (d. H. Bis zur gleichen Breite wie die Eingabeoperanden) ist unabhängig von Vorzeichen oder Vorzeichen die gleiche. (Für Zweierkomplement). –

+0

@rcgldr: Ich habe alle diese Fälle in meinem Kommentar erwähnt. Ich glaube, ich meinte am meisten mit der Befehlszählung in realen Programmen, nicht mit dem Bruchteil des Befehlssatzes. Aber mein Hauptpunkt war, dass viele Anweisungen nicht signiert oder nicht signiert sind, sie sind nur Anweisungen. ** Diese Antwort scheint zu implizieren, dass Sie immer unterschiedliche Anweisungen für signiert vs. unsigned benötigen, auch für die Addition, was nicht der Fall ist. ** –

+0

@PeterCordes - löschte meinen vorherigen Kommentar, es war für den anderen Beitrag gedacht, aber Sie habe schon darüber geredet. Ich werde diesen Kommentar später löschen. – rcgldr

3

Warum denken Sie, dass Assembler-Code "wissen" muss, wenn ein Wert signiert oder unsigniert ist?

Für die meisten Operationen die Ergebnisse einer signierten und einem usigned Betrieb sind die gleichen:

signed int a = 5; 
signed int b = -6; // 0xFFFFFFFA 
signed int c; 
c = a + b; // results in -1 which is 0xFFFFFFFF 

Und:

unsigned int a = 5; 
unsigned int b = 0xFFFFFFFA; 
unsigned int c; 
c = a + b; // results in 0xFFFFFFFF 

Einige Ausnahmen Teilung und Vergleiche sind. Die meisten CPUs haben in diesem Fall unterschiedliche Assembler-Anweisungen für Operationen mit und ohne Vorzeichen. Die Beispiele hier sind x86-Assembler aber msp430 sollte ähnlich sein:

signed int a, b; 
if(a > b) { ... } 

Ergebnisse in:

mov eax, [a] 
cmp eax, [b] 
jle elsePart ; Note the "L" in "jle" 

Und:

unsigned int a, b; 
if(a > b) { ... } 

Ergebnisse in:

mov eax, [a] 
cmp eax, [b] 
jbe elsePart ; Note the "B" in "jbe" 
2

Die Maschine ist es egal oder wissen, was unterzeichnet ist oder u nsigned, wenn Sie es nicht so sagen.

Auf der Ebene, wo Entwickler Entwickler wohnen, ist die Maschine ein Ziegelstein und Sie sind der Leiter. Sie müssen genug wissen, um die Verträge des Maschinenbefehlssatzes und Dinge wie flags zu verstehen, um ein deterministisches Ergebnis zu gewährleisten.

Verwandte Themen