If statement ARMv7-M组件ITEE的使用 问题:
我试图让iteeq即'If-Then-Else-Equal'块在R6==0时工作,Then分支到END标签,但汇编程序在这一行中指出一个错误:BEQ-ENDIf statement ARMv7-M组件ITEE的使用 问题:,if-statement,assembly,arm,branch,lpc,If Statement,Assembly,Arm,Branch,Lpc,我试图让iteeq即'If-Then-Else-Equal'块在R6==0时工作,Then分支到END标签,但汇编程序在这一行中指出一个错误:BEQ-END 节目信息: 我正在做一个与优化相关的程序。我用梯度下降法收敛到梯度为0的点,找到使函数f(x)最小化的解x*。我用C语言来调用一个汇编函数,就是这个程序 这是我的程序,错误是: 这是我第一次将NXP LPC1769用于学校作业的汇编程序。一定要让我知道我错过了什么,或者我做错了什么。谢谢大家! 以下是我的整个计划: .syntax un
- 节目信息:
.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
问题是,<代码> BEQ结束<代码>位于信息块的中间。引述: 如果分支或任何修改PC的指令是块中的最后一条指令,则只允许在IT块中使用 这就是说,因为它是一个分支,“else”无论如何都是隐式的——如果你接受这个分支,你就不会因为在其他地方而执行下面的指令,如果你不接受它,你就别无选择,只能执行它们,所以它们根本不需要显式的有条件。事实上,您甚至不需要
IT
,因为B
本身就有一个正确的Thumb指令编码。但是你甚至不需要它,因为你正在做一个基于寄存器为零的短正向分支,并且有一个专门的仅拇指比较和分支指令来完成这个操作
换句话说,您最初的5行代码片段可以简单地表示为:
CBZ R6, END
SUB R0, R6
B optimize
问题是,<代码> BEQ结束<代码>位于信息块的中间。引述: 如果分支或任何修改PC的指令是块中的最后一条指令,则只允许在IT块中使用 这就是说,因为它是一个分支,“else”无论如何都是隐式的——如果你接受这个分支,你就不会因为在其他地方而执行下面的指令,如果你不接受它,你就别无选择,只能执行它们,所以它们根本不需要显式的有条件。事实上,您甚至不需要
IT
,因为B
本身就有一个正确的Thumb指令编码。但是你甚至不需要它,因为你正在做一个基于寄存器为零的短正向分支,并且有一个专门的仅拇指比较和分支指令来完成这个操作
换句话说,您最初的5行代码片段可以简单地表示为:
CBZ R6, END
SUB R0, R6
B optimize
错误消息准确地告诉了您问题所在:
error:branch必须是IT块中的最后一条指令--“beq END”
,除非它是armasm的“error:A1603E:IT块中的这条指令有不可预测的结果”,这一点不太清楚,或者可能是其他更没有帮助的汇编程序。无论哪种方式,在问题本身中包含特定的错误消息总是好的,不仅仅是因为许多人对一个不熟悉的错误所做的第一件事就是将它粘贴到搜索引擎中,以查看出现了什么。错误消息准确地告诉了您问题的所在:error:branch必须是它块中的最后一条指令--“beq END”
,除非它是,比如说,armasm的错误:A1603E:块内的此指令具有不可预测的结果“,这是相当不清楚的,或者可能是其他一些更没有帮助的汇编程序。无论哪种方式,在问题本身中包含特定的错误信息总是好的,尤其是因为许多人对一个不熟悉的错误所做的第一件事就是将它粘贴到搜索引擎中,以查看出现了什么。我以前从未见过CBZ
。这是一个漂亮的小指令。我以前从未见过CBZ
。这是一个漂亮的小指示。