2017-02-15 9 views
0

Ich verwende RH850 Controler und Compiler greenHills in C-Sprache. Im Bereich prüfen wie folgt:Überprüfen Sie, ob der Wert in Diapason Disassembly ist

if ((x>=2) && (x<=5)) 
    y=1 

Es ist mit Osize-Option kompiliert. Wenn es kompiliert wird, schien es wie folgt aus:

zxb r7 
addi -2,r7,r1 
cmp 3,r1 
bnh .L1295 

.L1295 das Etikett von y=1 ist (Diese y=1 für andere Änderungen verwendet wird, auch auf einigen anderen Bedingungen). Beide Anweisungen betrafen die gleichen Flags.

Der Check (x>=2) wird mit diesem Code realisiert: addi -2,r7,r1. Aber Flag Ergebnis dieser Anweisung, wird von nächsten gereinigt und es ist falsch. Zumindest glaube ich das.

Offensichtlich liege ich falsch. Kann jemand dieses Disassembler-Fragment erklären?

+0

Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der in der Frage selbst reproduziert werden muss. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. – Olaf

Antwort

2

Es wird die Umwandlung der wie folgt überprüfen:

x >= 2 && x <= 5 
= (x - 2) >= (2 - 2) && (x - 2) <= (5 - 2) 
= (x - 2) >= 0 && (x - 2) <= 3 

Der Code r1 vergleicht, die x - 2 ist, zu 3 und "Zweige, wenn nicht höher" bedeutet r1 in 0, 1, 2, or 3 (oder x in 2, 3, 4, or 5) wird verzweigen Set y = 1.

+0

Meine Frage ist nicht die Logik. Es ist für Fahnen. Ich dachte, dass "addi" einige Flags setzen würde, aber "cmp" wird sie wieder ändern. Und ich denke, dass die Flaggen von "addi" verloren gehen. –

+0

Sie sind verloren, aber Sie brauchen nur die Ergebnisse von 'cmp'. –

Verwandte Themen