2009-06-01 70 views
2

我有显示字母“Z”,然后退出以下汇编程序:为什么这么小的程序集很慢?

mov dl, 'z' 
mov ah, 2h 
int 21h 
mov ah, 4Ch 
int 21h 

我与NASM组装它和产生的文件只包含那些指令。 (10个字节)我把1000调用该程序在一个批处理文件,然后1000调用

echo z 

和回声运行约快10倍。有谁知道什么会导致这个程序运行如此缓慢?提前致谢。

回答

14

“echo”是内置在命令解释器中的命令;不需要加载代码来执行该命令。您的程序很小,需要读入内存并在每次调用时进行初始化。在它达到那一点之前,命令解释程序将搜索PATH来查找程序,这需要很长时间。

3

其中您的程序需要启动1000次,回声可能内置在因此没有启动开销。

2

Echo是在命令行批处理脚本的上下文中运行的命令。没有外部进程正在执行,所以执行起来非常快。

每次执行汇编程序都需要启动和停止应用程序,该操作有一定的开销。

6

我想echo命令可能建设成壳,所以没有在每次调用加载一个新的程序的开销

8

很有可能在有少做你的代码,并更多地与底层操作系统。

Echo是立即由命令解释器识别的命令。因此,调用回声不会启动一个新的过程;回声发生在命令解释器的范围内。

另一方面,启动您的小型装配程序涉及创建一个新流程和所有意味着的开销。

-1

程序的调用可能需要程序从缓存外部加载(可能echo已经在缓存中?)以及其他一些复杂的内容。此外,您正在调用用户级代码,而echo命令可能具有更多优先级等。

+0

我不认为内置命令和用户程序的优先级有任何区别。 – 2009-06-01 17:53:43

1

尝试运行strace <your prog> - 您将看到执行事件这个小程序需要执行什么shell,链接器等。

4

您的程序使用DOS API。在现代操作系统上,它必须在虚拟机上运行,​​例如, NTVDM或DOSbox。这可能是导致速度变慢的主要原因。

您可以创建一个本地可执行与此代码,这应该是更快:

bits 32 
global main 

extern putchar 


section .text 
main: 
     push 'z' 
     call putchar 
     pop ecx 

     xor eax, eax 
     ret 

在Unix上,你可以编译和使用这些命令执行:

nasm file.asm -f elf 
gcc file.o -o file 
./file 

在Windows上,取代-f elf-f win32。如果您使用Visual Studio的编译器和链接器,请在VS的命令提示符下尝试使用cl file.o(未经测试)。