Assembly 臂装配中的双重条件
我对武装和为班级做作业很陌生。 我所困惑的是一个双重条件,比如,如果(x>0&&x<100)做点什么 我要做的是检查地址存储器中的信息是大写还是小写字符 我在这里找到了一个链接,但它不是用于ARM的,似乎对我没有帮助 我试过这样的方法:Assembly 臂装配中的双重条件,assembly,arm,Assembly,Arm,我对武装和为班级做作业很陌生。 我所困惑的是一个双重条件,比如,如果(x>0&&x0&&x0&&x0){if(x0){if(x
BGT r2,#0x60
BLTR2,#0x7B
但是在期望一个地址表达式时抛出了错误,所以我假设您不能将stright值与int值进行比较
已编辑,修复了我的情况,输入速度太快,并且放置了错误的GT LT箭头在使用BLT或BGT之前,您需要执行比较。此线程:似乎有您正在寻找的答案。在使用BLT或BGT之前,您需要执行比较。此线程:似乎有您正在寻找的答案。您不能在一条指令中进行比较和分支。您需要使用单独的比较和分支指令。(ARM确实有一个“比较并在零上分支”,但这在这里不适用。) 你想要的东西更像:
CMP r2, #100
BGT label_out
CMP r2, #0
BLT label_out
... do stuff
label_out: ; the branches come here if R2 < 0 || R2 > 100
cmpr2,#100
BGT标签输出
CMP r2,#0
BLT标签
... 做事
标签_out:;如果R2<0 | | R2>100,分支就会出现在这里
不能在一条指令中同时进行比较和分支。您需要使用单独的比较和分支指令。(ARM确实有一个“比较并在零上分支”,但这在这里不适用。)
你想要的东西更像:
CMP r2, #100
BGT label_out
CMP r2, #0
BLT label_out
... do stuff
label_out: ; the branches come here if R2 < 0 || R2 > 100
cmpr2,#100
BGT标签输出
CMP r2,#0
BLT标签
... 做事
标签_out:;如果R2<0 | | R2>100,分支就会出现在这里
我所困惑的是双重条件
您可以使用带有优化的编译器和反汇编程序来查看它是如何实现这一点的。使用GNU工具,这是gcc
和objdump-S
如果(x>0&&x<100)
您需要检查这两个条件并设置标志的汇编程序。假设值x在r0
中
sub r1, r0, #1 ; change zero test to minus.
cmp r1, #98 ; allow equal.
; condition 'ls' (lower and same) for true
movls r2, #42 ; set r2 to 42 if(x > 0 && x < 100)
; condition 'hi' (high unsigned) opposite flags
movhi r2, #24
这在汇编程序中转换为更直接的东西
cmp r0, #0
cmpgt r1,#0
movgt r0,#42 ; condition passed (here with signed conditions).
如果测试针对相同的条件(通常是相同的“C”运算符),则更直接,因为条件代码允许在这些情况下进行条件比较
我所困惑的是双重条件
您可以使用带有优化的编译器和反汇编程序来查看它是如何实现这一点的。使用GNU工具,这是gcc
和objdump-S
如果(x>0&&x<100)
您需要检查这两个条件并设置标志的汇编程序。假设值x在r0
中
sub r1, r0, #1 ; change zero test to minus.
cmp r1, #98 ; allow equal.
; condition 'ls' (lower and same) for true
movls r2, #42 ; set r2 to 42 if(x > 0 && x < 100)
; condition 'hi' (high unsigned) opposite flags
movhi r2, #24
这在汇编程序中转换为更直接的东西
cmp r0, #0
cmpgt r1,#0
movgt r0,#42 ; condition passed (here with signed conditions).
如果测试是针对相同的条件(通常是相同的“C”运算符),因为条件代码允许在这些情况下进行条件比较,则更直接。OK,因此如果您知道如何执行单个条件,您可以像
if(x>0){if(x<100){/*code here*/}
一、二之间没有差异,连续三个或十几个条件,它们都实现了与一个条件相同的条件。一次只做一个,不要担心做多个的技巧(当然,大于或等于类型的东西除外,这实际上是一个单一的条件)。更重要的问题是管理未签名和已签名,这是困难的(er)部分,更有可能出错。bgt
是一个分支,只接受一个PC相对偏移量或一个寄存器。您是指mov
(有条件地设置寄存器)还是想要分支?我的答案假设你的意思是mov
或其他一些非分支指令。好吧,如果你知道如何做一个条件,你可以像if(x>0){if(x<100){/*code here*/}}
一行中的一个、两个、三个或十几个条件没有区别,它们都实现了与一个条件相同的条件。一次只做一个,不要担心做多个的技巧(当然,大于或等于类型的东西除外,这实际上是一个单一的条件)。更重要的问题是管理未签名和已签名,这是困难的(er)部分,更有可能出错。bgt
是一个分支,只接受一个PC相对偏移量或一个寄存器。您是指mov
(有条件地设置寄存器)还是想要分支?我的回答假设你指的是mov
或其他一些非分支指令。如果我想让它只在其&&和非|的情况下标记出|,我应该使用什么?我在这里为另一个处理器写了一篇关于汇编语言条件分支的详细教程:结果是ARM汇编语言和这个处理器的汇编语言是非常相似。只需在大多数地方将CMPR
和CMPI
替换为CMP
,并交换参数顺序(即将#123、R2
更改为R2、#123
)。否则,这都是相同的基本原则。您可能想跳到这里的“If-Then”部分:对于复合和条件,如果其中一个条件测试为false,您想跳到else
。对于复合| |条件,如果其中一个条件测试为真,你想跳转到,然后跳转到。如果我想让它只在其&&而不是|的情况下将|标记出来,我该怎么做?|我在这里为另一个处理器写了一篇关于汇编语言中的条件分支的详细教程:事实证明ARM汇编语言和这个处理器的汇编语言非常有用类似的。只需在大多数地方将CMPR
和CMPI
替换为CMP
,并交换参数顺序(即将#123、R2
更改为R2、#123
)。否则,这都是相同的基本原则。你可能想跳到这里的“If-Then”部分:对于你的复合词&con