2011-02-17 43 views
4

我在閱讀Paul Carter的pcasm書。它使用NASM,一個調用我的彙編代碼的C驅動程序應用程序,以及一個可以輕鬆完成彙編中的基本I/O的伴隨庫。我是否必須初始化從C調用的彙編代碼中的CPU寄存器?

這是我的函數,將在C叫的樣子:

segment .text 
    global _asm_main 
_asm_main: 
    enter 0,0    ; setup routine 
    pusha 

    mov bx, 0034h ; bx = 52 (stored in 16 bits) 
    mov cl, bl  ; cl = lower 8-bits of bx 
    mov eax, ecx 
    call print_int 

    popa 
    mov  eax, 0   ; return back to C 
    leave      
    ret 

print_int功能在eax打印值存儲爲一個整數。但這種打印出垃圾到stdout:

4200244 

如果我使用它之前初始化ECX寄存器0與mov ecx, 0000h,我會得到預期的輸出:

52 

總是需要初始化,如果是的話,是否有一種快速的方法將C或NASM的所有寄存器初始化爲0(或用戶定義的初始化程序)?

我使用XP32,MinGW 4.4.0和NASM 2.09.04。

回答

4

函數print_int輸出值eax。在您的代碼中,您只能通過以下分配鏈分配到eax(又名al)的四個字節中的最低位:bl - >cl - >al。剩餘的三個字節eax未被初始化。你的代碼在你的例程開始時會繼承這三個字節中發生的任何值。這就是你得到垃圾的原因。

您必須初始化您使用的所有寄存器和內存位置。

我的x86程序集有點生疏,但我確信沒有一條指令可以將所有通用寄存器設置爲零。如果你非常喜歡,你可以寫一個宏來爲你做這件事。

+0

我想ASM程序員/編譯器只初始化他們要使用的寄存器。我會立即初始化它們,因爲我現在對學習ASM非常感興趣,所以我想避免這些錯誤。我並不打算編寫任何大量的ASM代碼,但我想知道像C這樣的語言是如何在較低級別上工作的。謝謝。 – 2011-02-17 17:22:30

2

是的,這是必需的。

在裝配中沒有爲你完成任何工作。
你必須以你想要的方式初始化每一個寄存器。

相關問題