assembly - 关于汇编语言设置标志的逻辑问题
问题描述
例如,给定 C 中的代码
if a>b
c=a+b+10
else
c=b-a
我的汇编语言代码不使用分支:
ADR R0,a
ADR R1,b
ADR R2,c
LDR R0,[R0]
LDR R1,[R1]
CMP R0,R1
ADDGT R0,R0,R1
ADDGT R0,#10
STRGT R0,[R2]
SUBLE R1,R1,R0
STRLE R1,[R2]
假设,R0>R1,所以标志设置在 CMP 行
由于这些标志,ADDGT 和 STRGT 将运行。如果 ADDGT R0,R0,R1 的值会改变标志(可能导致 V=1)怎么办。我们没有在这里做'ADDGTS'所以下一个ADDGT可以运行但不会影响R0的实际值?
谢谢
解决方案
来自ARM®v7-M 体系结构参考手册(这些说明可一直追溯到 ARM 1)。
§A4.4.1除了将结果放入目标寄存器之外,这些指令还可以选择[使用'S'后缀]根据操作结果设置条件代码标志。如果一条指令未设置标志,则保留前一条指令中该标志的现有值。
这里选择了不设置条件码寄存器,所以两条条件路径是完全分开的,每条条件路径中的操作都不会影响条件寄存器的值。
条件代码寄存器与 ALU 的操作正交——它可能只在您想要进行 64 位加法或减法时才重要,在这种情况下,您可能会关心V
溢出或数组C
标志。
您的汇编代码似乎与伪代码一致。
推荐阅读
- c++ - 如何将视频从 sys1 逐帧流式传输到 sys2 上的 qt 应用程序并在 linux 上实时显示
- sql - SQL:尝试 SELECT COUNT 一列并同时显示另一列
- apache-spark - 如何将 Pyspark 连接到在 docker 上运行的 datastax Cassandra?
- oracle - APEX 20.1 根据页面项目更改弹出 LOV
- bash - Shell 脚本中的超时
- powershell - Powershell - 输出到文本框
- java - Hibernate Criteria 子查询限制
- css - 取消设置多个 CSS 背景图像之一时使用 URL 进行干燥
- vba - 在 Access 中使用文本框进行 VBA 搜索
- android - 在 Android 上使用 glEGLImageTargetTexture2DOES 替换 glReadPixels