【问题标题】:Does test work the same as cmp?test 和 cmp 一样吗?
【发布时间】:2014-04-06 08:55:39
【问题描述】:

我想知道是否可以像 cmp 一样使用测试指令。比方说:

cmp %eax,%ebx
jg some_random_place

如果 %ebx 大于 %eax,则跳转到 some_random_place,现在如果我这样做:

test %eax, %ebx
jg some_random_place

在什么条件下会跳转?

【问题讨论】:

    标签: x86 att


    【解决方案1】:

    不!

    cmp %eax,%ebx 指令类似于sub %eax,%ebx 指令,但cmp 指令执行后的寄存器保持不变,除了标志寄存器。

    test %eax,%ebx 指令类似于and %eax,%ebx 指令,但test 指令执行后的寄存器保持不变,除了标志寄存器。 受影响的标志是进位 = 0、零 = x、溢出 = 0 和符号 = x

    jg 指令应在零标志 = 0 且符号标志 = 溢出时执行跳转

    所以万一……

    test %eax, %ebx
    jg some_random_place
    

    ...如果and %eax,%ebx的结果为正而不是0,则应该执行跳转。

    【讨论】:

    • 谢谢!在提出问题后,我自己研究了标志部分,但我无法理解二进制文件如何引发溢出标志,但仍然没有。你介意向我解释最后一部分吗?除此之外,一个非常好的和明确的答案!
    • andtest 指令永远不会上升溢出标志,但正如我所写的,只有在指令执行后才会清除。
    • 哦,所以sign_flag=overflow可以翻译成sign_flag等于0,意思就是这个数是正数吧?现在我知道了!谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2017-11-29
    • 2021-04-14
    • 2020-06-04
    相关资源
    最近更新 更多