逻辑运算结果的地址是什么?

LmT*_*oon 2 c# assembly jit

我有用C#编写的简单程序:

static void Main(string[] args)
{
    int a = 0;
    for (int i = 0; i < 100; ++i)
        a = a + 1;
    Console.WriteLine(a);
}
Run Code Online (Sandbox Code Playgroud)

我是编程领域的新手,我的目的只是了解JIT创建的汇编代码.这是一段asm代码:

7:         int a = 0;
0000003c  xor         edx,edx 
0000003e  mov         dword ptr [ebp-40h],edx 
8:         for (int i = 0; i < 100; ++i)
00000041  xor         edx,edx 
00000043  mov         dword ptr [ebp-44h],edx 
Run Code Online (Sandbox Code Playgroud)

我无法理解代码:0000003c xor edx,edx.存储的操作结果在哪里?我在"英特尔®64和IA-32架构软件开发人员手册"中只找到了这样的引用:

逻辑指令AND,OR,XOR(异或)和NOT执行为其命名的标准布尔运算.AND,OR和XOR指令需要两个操作数; NOT指令在单个操作数上运行

编辑:据我所知,这个结果应该存储在edx(见下一个代码行).但对我来说这似乎很奇怪.我以为结果会被推到堆栈上

das*_*ght 7

逻辑运算指令将结果存储在第一个参数中 - 在您的情况下,它是edx.

请注意,对自身进行异或运算会产生0.因此,XOR a, a清除寄存器是一种常见的程序集习惯用法.


Bat*_*eba 5

xor edx,edx是清除edx寄存器的惯用方法.

(注意,a XOR a对于任何值都为零a.)