【问题标题】:Why number++ uses EAX while number-- uses ECX?为什么 number++ 使用 EAX 而 number-- 使用 ECX?
【发布时间】:2011-05-01 04:24:31
【问题描述】:
;disas for number++
mov eax, [number]
add eax,1
mov [number],eax
;disas for number--
mov ecx, [number]
sub ecx,1
mov [number],ecx

为什么number++ 使用EAXnumber-- 使用ECX

调度寄存器的约定是什么?

【问题讨论】:

  • 对于反汇编,您是在一个测试中(即同一个文件)同时进行了 ++ 和 --,还是进行了两个单独的测试?

标签: c assembly cpu-registers


【解决方案1】:

寄存器分配由编译器决定。通常,它主要取决于周围的代码,而不是您执行的操作。

【讨论】:

  • 程序集/二进制文件中没有指定寄存器分配吗?
  • @kern:当您编写汇编语言时,您大多可以使用您认为合适的寄存器。一些指令具有特定的源和/或目标寄存器(取决于您正在编程的指令集),但除此之外,这取决于您。
【解决方案2】:

这些操作没有约定。大多数寄存器都是通用的,可用于常见的算术运算。

编译器只是使用了一个恰好在代码中空闲的寄存器。

【讨论】:

    【解决方案3】:

    您缺少围绕这些提取的程序集,这可能是最重要的部分,否则您无法判断其他寄存器是否在使用中(或者调用约定是否起作用)。

    对于周围的部分,它更容易判断分配是部分任意的(图形着色)还是更均匀的线性扫描等。编译器标志也会影响这一点,因为你上面的两个例子都不能不使用寄存器。

    【讨论】:

      【解决方案4】:

      查看所有其他答案,说它依赖于编译器和代码,没有规则。

      unsigned int x;
      
      void one ( void )
      {
        x++;
      }
      void two ( void )
      {
       x--;
      }
      

      优化

      one:
          addl    $1, x(%rip)
          ret
      two:
          subl    $1, x(%rip)
          ret
      

      相同的编译器,相同的代码,相同的日期,没有优化,eax 用于两者

      one:
          pushq   %rbp
          movq    %rsp, %rbp
          movl    x(%rip), %eax
          addl    $1, %eax
          movl    %eax, x(%rip)
          leave
          ret
      two:
          pushq   %rbp
          movq    %rsp, %rbp
          movl    x(%rip), %eax
          subl    $1, %eax
          movl    %eax, x(%rip)
          leave
          ret
      

      【讨论】:

        猜你喜欢
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 2011-02-15
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        相关资源
        最近更新 更多