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