有多少x86指令组成一个for循环迭代?



我的任务是生成一个基准程序,该程序使用c语言估计x86系统的MIPS。我的方法是运行一个空的for循环进行大量迭代。然后,我将测量它的执行时间以确定MIPS。但是,我需要知道在单个for循环迭代中找到的指令数。

#include <stdio.h>
#include <sys/time.h>
int main(int argc, char *argv[])
{
size_t max_iterations = 1000000000;
// grab start time

for(int i = 0; i < max_iterations; i++)
{
// empty
}
// grab end time and calculate MIPS

printf("MIPS = %fn", max_iterations * instruction_per_cycle / 1000000.0 / elapsed_sec);
return 0;
}

我不熟悉x86指令集,但是,对于我提供的for循环,似乎以下项可能是指令:

  1. 从内存加载值i到寄存器
  2. load value max_iterations from memory to register
  3. 执行i和max_iterations之间的比较
  4. 增加我
  5. 将i的新值写入内存
  6. 进入循环假设
  7. 跳转回循环语句的起点

查看反汇编所做的事情,这可能会帮助您获得所需的内容…

我写了一个简单的函数,在它的主体中有一个普通的for循环,并保存到文件for.c

void loop()
{

for(int i = 0; i < 10; i++)
{
// empty
}
}

然后我跑了

gcc -S for.c

则是要求gcc发出汇编代码,生成的汇编代码在for.s中生成。之后,我运行as(GNU汇编器),要求它使用以下命令

生成目标文件for.o
as -o for.o for.s

,它生成目标文件for.o,并且我要求实用程序objdump向我展示使用以下命令反汇编目标文件…

objdump -d for.o

显示如下输出:

for.o:     file format elf64-x86-64

Disassembly of section .text:
0000000000000000 <loop>:
0:   55                      push   %rbp
1:   48 89 e5                mov    %rsp,%rbp
4:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
b:   eb 04                   jmp    11 <loop+0x11>
d:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
11:   83 7d fc 09             cmpl   $0x9,-0x4(%rbp)
15:   7e f6                   jle    d <loop+0xd>
17:   90                      nop
18:   5d                      pop    %rbp
19:   c3                      retq

但是当我在函数内编写循环时,这也有与堆栈相关的指令。一般来说,只有forfor的循环指令比我们现在在反汇编中看到的要少。

x86_64架构,我将在那里运行所有这些,并使用gcc进行编译。所以,请注意你正在使用的工具。

可能有其他方法可以达到同样的目的,但现在我可以建议用这种方法,如果它对你有帮助的话。

最新更新