2016-08-31 5 views
0
  • Problem:

Ich versuche, die ITEE EQ dh '-If-Then Else-Else Equal' Block, wenn R6 an die Arbeit zu machen == 0, mit THEN in das END Etikett Verzweigungen, aber der Assembler ein Fehler auf der Leitung rief: BEQ ENDARMv7-M Montage ITEE Verwendung

  • Programminfo:

Ich mache ein Programm, das in pertinence mit Optimierung ist. Ich benutze eine Gradientenabsenkung, um zu dem Punkt zu konvergieren, wo der Gradient 0 ist, um die Lösung x * zu finden, die eine Funktion f (x) minimiert. Ich benutze C-Sprache, um eine Assembly-Funktion aufzurufen, die dieses Programm hier ist.

Hier ist mein Programm, in dem die Fehler ist:

 CMP R6, #0   @ Compare f'(x) with 0 
     ITEE EQ    @ If R6 == 0, Then-Else-Else 
     BEQ END    @ Calls END label if equal 
     SUBNE R0, R6  @ Change R0(x) in the opp direction of gradient to get lower value of f(x) if not equal 
     BNE optimize  @ Branch to optimize if not equal 

Dies ist mein erstes Montageprogramm die NXP LPC1769 für eine Schule Zuordnung verwenden. Lass mich wissen, was ich vermisse oder was ich falsch gemacht habe. Vielen Dank!

Hier ist mein ganzes Programm:

.syntax unified 
.cpu cortex-m3 
.thumb 
.align 2 
.global optimize 
.thumb_func 

optimize: 
@ Write optimization function in assembly language here 

     MOV R5, INLAMBDA @ R5 holds value of inverse lambda(10) ie to eliminate floating point 
     LDR R6, #2   @ Load R6 with value '2' ie constant of f'(x) 
     MUL R6, R1, R6  @ Multiply R6(2) with R1(a) & store to R6(results) 
     MLA R6, R6, R0, R2 @ Multiply R6(results) with R0(x) & sum with R2(b) to get f'(x). Store & update results to R6 
     SDIV R6, R5   @ Divide R6(results) by R5(1/lambda) to get f'(x) * lambda 

     CMP R6, #0   @ Compare f'(x) with 0 
     ITEE EQ    @ If R6 == 0, Then-Else-Else 
     BEQ END    @ Calls END label if equal 
     SUBNE R0, R6  @ Change R0(x) in the opp direction of gradient to get lower value of f(x) if not equal 
     BNE optimize  @ Branch to optimize if not equal 

@ End label 
END: 

BX LR 

@ Define constant values 
CONST: .word 123 
INLAMBDA: .word 10  @ Inverse lambda 1/lambda(0.1) is 10 
+0

Nachricht genau gesagt, der Fehler, was das Problem ist:

Mit anderen Worten: Ihre erste 5-Zeilen-Snippet kann einfach ausgedrückt werden als 'Fehler: Zweig letzte Befehl sein muss, in der IT-Block - 'beq END'' –

+0

Es sei denn, es war der Fehler von armasm: "A1603E: Diese Anweisung im IT-Block hat UNPRÄZISIERBARE Ergebnisse", was eher weniger klar ist, oder vielleicht ein anderer, noch weniger hilfreicher Assembler. In jedem Fall ist es immer gut, die Fehlermeldung _specific_ in die Frage selbst einzufügen, nicht zuletzt, weil das erste, was viele Leute mit einem unbekannten Fehler machen, es in eine Suchmaschine einfügen, um zu sehen, was auftaucht. – Notlikethat

Antwort

2

Das Problem ist, dass BEQ END im Mitte des IT-Block ist. Zu zitieren some documentation for IT:

A branch or any instruction that modifies the PC is only permitted in an IT block if it is the last instruction in the block.

Das heißt, weil es ein Zweig ist, ist die „else“ implizit sowieso - wenn Sie den Zweig nehmen, werden Sie nicht die folgenden Anweisungen wegen werden die Ausführung anderer Stelle des Seins, und wenn du es nicht nimmst, hast du keine andere Wahl als sie auszuführen, also müssen sie nicht explizit konditional sein. In der Tat, Sie brauchen nicht einmal die IT entweder, da B<cond> eine richtige Thumb-Anweisung Codierung in seinem eigenen Recht hat. Aber dann brauchen Sie auch nicht , dass, weil Sie einen kurzen Forward-Zweig basierend auf einem Register zu tun, die Null ist, und es gibt eine spezielle Nur-Daumen-Vergleich-und-Zweig-Anweisung für genau das tun!

CBZ R6, END 
SUB R0, R6 
B optimize 
+0

Ich habe 'CBZ' noch nie zuvor gesehen. Das ist eine nette kleine Anweisung. – rjp