c - x86 测试指令不起作用?

标签 c assembly x86

我一直在用头撞墙来解决这个问题,这对我来说毫无意义......

为什么这个程序会进入死循环?!

我认为您可以使用 test 来比较两个值是否相等,如图所示 here ...为什么不起作用?

int main()
{
    __asm
    {
        mov EAX, 1;
        mov EDX, EAX;
        test EAX, EDX;
L:      jne L;
    }
}

最佳答案

您对 TEST 指令的预期不正确。

该指令用于进行位测试。您通常会使用它来“测试”是否在给定掩码的情况下设置了某些位。它将与 JZ(如果为零则跳转)或 JNZ(如果不为零则跳转)指令结合使用。

测试涉及对两个操作数执行按位与并设置适当的标志(丢弃结果)。如果掩码中的相应位均未设置,则 ZF(零标志)将为 1(所有位均为零)。如果您想测试是否设置了任何内容,可以使用 JNZ 指令。如果你想测试是否没有设置,你可以使用 JZ 指令。

JEJNE 不适用于此指令,因为它们对标志的解释不同。


您正在尝试对某些变量执行等式检查。您应该使用 CMP 指令。您通常会使用它来相互比较值。

比较有效地减去操作数并且只设置标志(丢弃结果)。当相等时,两个值的差为 0 (ZF = 1)。当不相等时,两个值的差不为零 (ZF = 0)。如果您想测试它们是否相等,您可以使用 JE(如果相等则跳转)指令。如果您想测试它们是否不相等,您可以使用 JNE(如果不相等则跳转)指令。


在这种情况下,由于您使用了 TEST,生成的标志将产生 ZF = 0(0x1 & 0x1 = 0x1,非零)。由于 ZF = 0JNE 指令将采用您在此处看到的分支。

tl;博士

如果要检查是否相等,则需要使用 CMP 指令比较值,而不是 TEST 它们。

int main()
{
    __asm
    {
        mov EAX, 1
        mov EDX, EAX
        cmp EAX, EDX
L:      jne L          ; no more infinite loop
    }
}

关于c - x86 测试指令不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182271/

相关文章:

c - C语言警告unsigned long转int

assembly - 将 i386 操作码解码为指令

c - assembly 局部变量和参数

c - 简单的操作系统内核编程

assembly - 现代处理器中是否始终存在 MMX 寄存器?

c++ - 如何在 Skylake 架构上最大化 sqrt-heavy-loop 的指令级并行性?

C 函数在几次迭代后停止

c - Makefile,添加位于父目录中的头文件(不允许在内部移动!)

c - 通过 20-30 GB 的多个日志文件搜索模式的最快方法是什么

assembly - 为什么汇编程序仅在与 crt1.o crti.o 和 crtn.o 链接时才起作用?