2013-05-04 92 views
1

我對彙編編程非常陌生,我在C中編寫了一個函數,需要在彙編中調用另一個函數。看起來寄存器想要返回四個字符(字節)而不是一個,這正是我想要的。彙編程序和C編程linux -m32(從彙編程序中的寄存器中的字符字節)

忽略跳轉後的代碼,因爲我只跳過這部分代碼,直到我正確地工作。

這實際上應該是我自己的簡化版本sprintf的一部分在C 我刪除了一些我的代碼只是爲了讓事情工作。它應該返回第一個參數%。所以,當我稱之爲C本彙編功能,我可以寫(在這個例子中或%cprintf("%s", res);和它打印%

.globl printpercent 

# Name:  printpercent 
# Synopsis: A simplified sprintf 
# C-signature: int printpercent(unsigned char *res, unsigned char *format, ...); 
# Registers: %eax: first argument 
#    %ebx: second argument 

printpercent:      # sprinter 
    pushl  %ebp  # start of 
    movl  %esp, %ebp # function 

    movl  8(%ebp), %eax # first argument 
    movl  12(%ebp), %ebx # second argument 

loop: 
    movb  $37, %bl  # lowest bits to % 
    movb  %bl, %al 
    jmp   exit 
    movb  (%ebx), %dl  # 
    cmp   $0, %dl   # Check if 0 

    je    exit  # if 0 -> exit 

    cmp  $37, %dl   # Check '%' 


    movb  %dl, (%eax)  # if it doesnt equal any above/or default 
           # add to register %eax 

    jmp  loop    # jump back to the start of the loop 


exit: 
    popl  %ebp   # popping standard end of function 
           # 0-byte ? 
    ret       # return 

回答

1

你的函數返回值INT所以當然編譯將alayws採取全寄存器作爲返回值。在你的環境中所有int == 4字節之後。您必須清除EAX,確保其中沒有隨機值。

+0

感謝,我想我現在解決它:) – 2013-05-05 14:33:14

1

您可以輕鬆地通過使用XOR清除寄存器,使寄存器使用前再次清零:

xor %eax, %eax