为什么这么小的装配程序如此之慢?

时间:2009-06-01 17:39:31

标签: assembly x86

我有以下汇编程序,显示字母'z'然后退出:

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

我用NASM组装它,结果文件只包含那些说明。 (10个字节)我在批处理文件中对此程序进行了1000次调用,然后对

进行了1000次调用
echo z

并且回声的速度提高了约10倍。有谁知道导致这个程序运行得如此缓慢的原因是什么?提前谢谢。

8 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

可能这与您的代码关系不大,而与底层操作系统有关。

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

另一方面,启动小型程序集程序涉及创建一个新进程以及所暗示的所有开销。

答案 2 :(得分:6)

我认为echo命令可能构建在shell中,因此在每次调用时都没有加载新程序的开销

答案 3 :(得分: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(未经测试)。

答案 4 :(得分:3)

你的程序需要启动1000次,可以内置echo,因此没有启动开销。

答案 5 :(得分:2)

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

你对程序集程序的每次执行都需要启动和停止应用程序,这个操作有一定的开销。

答案 6 :(得分:1)

尝试运行strace <your prog> - 您将看到执行此小程序的事件所需的shell,链接器等。

答案 7 :(得分:-1)

程序的调用可能需要从缓存外部加载程序(也许回显已经在缓存中?)和许多其他复杂性。此外,您正在调用userland代码,而echo命令可能具有更高的优先级等等。