2009-06-01 157 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(未經測試)。