If statement 如果程序集中有else或语句?

If statement 如果程序集中有else或语句?,if-statement,assembly,arm,cortex-m,If Statement,Assembly,Arm,Cortex M,对在汇编中使用分支命令感到困惑,大多数只是BNE和BEQ。 因此,我必须为伪代码编写一个汇编代码: X = 5, Y = 10, Z = 15 if X != 4 && Y == 10 || Z = 20 A = X + Y - 2 else R = Z - 5 + X 我在Keil uVision5中为手臂皮质M0 Plus编码(如果这是需要的信息,没有任何线索),在它的低位寄存器中,这是这个特定板的R0-R7 我知道如何编写if-else语句本身,但我主要是问如

对在汇编中使用分支命令感到困惑,大多数只是
BNE
BEQ
。 因此,我必须为伪代码编写一个汇编代码:

X = 5, Y = 10, Z = 15

if X != 4 && Y == 10 || Z = 20 

A = X + Y - 2

else   R = Z - 5 + X
我在Keil uVision5中为手臂皮质M0 Plus编码(如果这是需要的信息,没有任何线索),在它的低位寄存器中,这是这个特定板的R0-R7

我知道如何编写
if-else
语句本身,但我主要是问如何处理
部分代码。明显的
X=4
为真,
Y==10
为真,然后检查
Z=20是否为假,我也会检查
X=4
首先,使用
BNE
标签跳转以检查Y,使用
BEQ
检查Z,这是错误的,但由于等式已经为真,我将跳转到
a=X+Y-2
BNE
endif语句

然后在前面没有标签的情况下,如果第一个BNE标签是假的,我会写else语句让汇编程序去做

A EQU 0x2000000
R EQU 0x2000004
X EQU 0x2000008
Y EQU 0x200000C
Z EQU 0x2000010

 LDR R7, =X
 LDR R0, [R7]
 ADD R0, #5  ; X = 5 in R0
 CMP R0, #4  ; Compare X != 4
 BNE jumpToY

jumpToY
 LDR R7, =Y
 LDR R1, [R7]   ; Y = 10 in R1
 CMP R1, #10    ; Compare Y == 10
 BEQ jumpToZ

jumpToZ
 etc...

想想你是如何评估你头脑中的逻辑条件的。如果你想要A或B,你得到A,那么你不需要考虑B。如果你想要A和B,而你没有A,那么计算B是没有意义的

有些纯粹主义者认为,你应该评估这两个条件,然后对结果进行逻辑比较: 算出 计算B 和/或将结果放在一起

幸运的是,工程方法成功了:

对于A和B(假设BEQ为“真”):

对于A或B(同样,假设BEQ为“真”):


想想你是如何评估你头脑中的逻辑条件的。如果你想要A或B,你得到A,那么你不需要考虑B。如果你想要A和B,而你没有A,那么计算B是没有意义的

有些纯粹主义者认为,你应该评估这两个条件,然后对结果进行逻辑比较: 算出 计算B 和/或将结果放在一起

幸运的是,工程方法成功了:

对于A和B(假设BEQ为“真”):

对于A或B(同样,假设BEQ为“真”):


想想你是如何评估你头脑中的逻辑条件的。如果你想要A或B,你得到A,那么你不需要考虑B。如果你想要A和B,而你没有A,那么计算B是没有意义的

有些纯粹主义者认为,你应该评估这两个条件,然后对结果进行逻辑比较: 算出 计算B 和/或将结果放在一起

幸运的是,工程方法成功了:

对于A和B(假设BEQ为“真”):

对于A或B(同样,假设BEQ为“真”):


想想你是如何评估你头脑中的逻辑条件的。如果你想要A或B,你得到A,那么你不需要考虑B。如果你想要A和B,而你没有A,那么计算B是没有意义的

有些纯粹主义者认为,你应该评估这两个条件,然后对结果进行逻辑比较: 算出 计算B 和/或将结果放在一起

幸运的是,工程方法成功了:

对于A和B(假设BEQ为“真”):

对于A或B(同样,假设BEQ为“真”):

在这里,您可以看到防止额外跳转的条件说明。我们首先检查And的前两种情况,然后默认为Or情况。请注意,我们还必须跳转到else代码之外,以防止两者都执行。还要注意的是,我们通过else的例子,也是为了防止额外的跳转

 ; These could be loaded with a singl LDM instruction instead.
 LDR R7, =X
 LDR R0, [R7]
 LDR R7, =Y
 LDR R0, [R7]
 LDR R7, =Z
 LDR R2, [R7]

 CMP R0,#5
 CMPEQ R1,#10
 BEQ FirstCase

 CMP R2,#5
 BEQ FirstCase
 ;... Fall Through

ElseCase:
   ...
   j RestOfCode
FirstCase:
   ...

RestOfCode:
请注意,我是在盲人中编写的,这对于任何语言来说都是一件危险的事情,甚至更危险。它应该演示如何处理您希望看到的和/或案例

您还可以将代码放入C编译器中,并检查输出,因为它也会显示您的工作代码

在这里,您可以看到防止额外跳转的条件说明。我们首先检查And的前两种情况,然后默认为Or情况。请注意,我们还必须跳转到else代码之外,以防止两者都执行。还要注意的是,我们通过else的例子,也是为了防止额外的跳转

 ; These could be loaded with a singl LDM instruction instead.
 LDR R7, =X
 LDR R0, [R7]
 LDR R7, =Y
 LDR R0, [R7]
 LDR R7, =Z
 LDR R2, [R7]

 CMP R0,#5
 CMPEQ R1,#10
 BEQ FirstCase

 CMP R2,#5
 BEQ FirstCase
 ;... Fall Through

ElseCase:
   ...
   j RestOfCode
FirstCase:
   ...

RestOfCode:
请注意,我是在盲人中编写的,这对于任何语言来说都是一件危险的事情,甚至更危险。它应该演示如何处理您希望看到的和/或案例

您还可以将代码放入C编译器中,并检查输出,因为它也会显示您的工作代码

在这里,您可以看到防止额外跳转的条件说明。我们首先检查And的前两种情况,然后默认为Or情况。请注意,我们还必须跳转到else代码之外,以防止两者都执行。还要注意的是,我们通过else的例子,也是为了防止额外的跳转

 ; These could be loaded with a singl LDM instruction instead.
 LDR R7, =X
 LDR R0, [R7]
 LDR R7, =Y
 LDR R0, [R7]
 LDR R7, =Z
 LDR R2, [R7]

 CMP R0,#5
 CMPEQ R1,#10
 BEQ FirstCase

 CMP R2,#5
 BEQ FirstCase
 ;... Fall Through

ElseCase:
   ...
   j RestOfCode
FirstCase:
   ...

RestOfCode:
请注意,我是在盲人中编写的,这对于任何语言来说都是一件危险的事情,甚至更危险。它应该演示如何处理您希望看到的和/或案例

您还可以将代码放入C编译器中,并检查输出,因为它也会显示您的工作代码

在这里,您可以看到防止额外跳转的条件说明。我们首先检查And的前两种情况,然后默认为Or情况。请注意,我们还必须跳转到else代码之外,以防止两者都执行。还要注意的是,我们通过else的例子,也是为了防止额外的跳转

 ; These could be loaded with a singl LDM instruction instead.
 LDR R7, =X
 LDR R0, [R7]
 LDR R7, =Y
 LDR R0, [R7]
 LDR R7, =Z
 LDR R2, [R7]

 CMP R0,#5
 CMPEQ R1,#10
 BEQ FirstCase

 CMP R2,#5
 BEQ FirstCase
 ;... Fall Through

ElseCase:
   ...
   j RestOfCode
FirstCase:
   ...

RestOfCode:
请注意,我是在盲人中编写的,这对于任何语言来说都是一件危险的事情,甚至更危险。它应该演示如何处理您希望看到的和/或案例


您还可以将代码放入C编译器并检查输出,因为它也会显示工作代码。

对于使用由一条指令设置的标志,然后是分支或条件指令跳转的处理器,asm通常是如何工作的。在分支/跳转on条件设置之前的某个时间点
if(x!=4) goto label0;
label2:
if(z==20) goto label1;
R = Z - 5 + X;
goto done;
label0:
if(y!=10) goto label2:
...
done:
ldr r0,=X
ldr r0,[r0]
cmp r0,#4
bne label0

ldr r2,=Z
ldr r2,[r2]
cmp r2,#20
beq label1

sub r2,#5
add r0,r2
ldr r2,=X
str r0,[r2]
b done

label0:
ldr r1,=Y
ldr r1,[r1]
cmp r1,#10
bne label2:

...

done:
 LDR R7, =X
 LDR R0, [R7]
 ADD R0, #5  ; X = 5 in R0
ldr r1,=X
mov r0,#5
str r0,[r1]
ldr r1,=Y
mov r0,#10
str r0,[r1]
ldr r1,=Z
mov r0,#15
str r0,[r1]
LDR R7, =X
LDR R0, [R7]
CMP R0, #4  ; Compare X != 4