【问题标题】:What is address of logical operation's result?逻辑运算结果的地址是什么?
【发布时间】:2017-05-23 12:33:06
【问题描述】:

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

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

我是此类编程领域的新手,我的目的只是了解 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 

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

逻辑指令 AND、OR、XOR(异或)和 NOT 执行标准布尔运算 他们被命名。 AND、OR 和 XOR 指令需要两个操作数; NOT 指令在一个 单操作数

编辑:据我了解,此结果应存储在edx(请参阅下一个代码行)。但这对我来说似乎很奇怪。我以为结果会被压入堆栈

【问题讨论】:

  • 它存储在edx。这相当于将edx 加载为零,但在英特尔架构上更快。
  • 如果你想把东西压入堆栈,你必须使用push将它们压入堆栈。

标签: c# assembly jit


【解决方案1】:

xor edx,edx 是清除edx 寄存器的惯用方式。

(请注意,a XOR a 对于a 的任何值都为零。)

【讨论】:

    【解决方案2】:

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

    请注意,将值与自身进行异或运算会产生 0。因此,XOR a, a 是清除寄存器的常用汇编习惯用法。

    【讨论】:

    • 赞成。我的回答中缺少您重要的第一句话。
    • 这是有用的信息。好像我错过了手册
    • 我相信使用了xor,因为它比mov 快​​。
    • @slugster 是的,它比mov 快,因为它不需要额外的周期来从代码存储器中读取零。
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2010-10-29
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多