【问题标题】:What's the difference between the CMP and TST instructions in ARM?ARM中的CMP和TST指令有什么区别?
【发布时间】:2019-01-10 15:13:20
【问题描述】:

我无法理解 ARM 中这两条指令之间的区别。据我了解,

CMP R1, R2

将执行操作 R1-R2,但不存储结果。然后它会在状态寄存器中设置标志,例如 N(负数,如果 R1

我不明白 TST 的不同之处。在我的笔记中,它说 TST 不会改变其操作数的值。但我认为 CMP 也没有。这两个指令有何不同?

怎么样

CMP R1, R2

不同于

TST R1, R2

?提前感谢您的帮助!

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    TST R1, R2 计算R1R2 的按位与,然后丢弃结果,而CMP R1, R2 将两者相减。 TST 主要在 ARM 上用于找出给定位是否在数字中设置。例如,要检查 R1 是否为奇数,您可以这样做:

    TST R1, #1    @ is R1 odd?
    

    如果R1 是奇数,这会将 Z 标志设置为 0。

    【讨论】:

    • 有道理,谢谢。 TST 如何计算按位与并使用其结果?例如,如果 R1 持有#100,TST R1,#1 会做什么?它会在 R1 的最低有效位上与 #1 执行 AND 并忽略其余部分吗?
    • @user43712 它执行与AND 相同的计算,即第一个参数中的每个位与第二个参数中的相应位进行“与”运算。立即数转换为 32 位整数,就像所有其他指令一样。 #1#0x00000001 相同,如果这对您有帮助的话。
    • 基于 AND 的比较不是 arm 独有的,也不是仅对 arm 有用。你声明的“on ARM”部分没有意义......
    • 啊,谢谢,是的,这一切都清楚了。最后一个相关问题 - 如果我们得到的只是一个与 TST 结果的最长操作数长度相同的数字,那么如何设置标志?您在奇数测试中提到,如果 R1 的最低有效位等于 1,则设置 Z 标志。标志是如何设置的?
    • 我会尽我所能来围绕任何人的答案。听到多人解释它可能对我和未来有相同问题的读者非常有用。我鼓励任何人回答,即使它有点超出我的理解范围。再次感谢大家的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-03-07
    • 2016-04-09
    相关资源
    最近更新 更多