2010-03-24 95 views
3

我正在程序中編寫程序,它不工作,所以我想在x86函數中輸出變量以確保這些值是我期望的值。有沒有簡單的方法來做到這一點,還是非常複雜?在x86中輸出變量值asm

如果它變得更簡單,彙編函數正在C函數中使用,並且正在使用gcc進行編譯。

+0

對不起,x86程序集。 – Joseph 2010-03-24 04:30:55

回答

7

看來你的問題是「如何在x86彙編器中打印出變量值」的問題。 x86本身不知道該怎麼做,因爲它完全取決於你使用的輸出設備(以及操作系統提供的與該輸出設備接口的具體細節)。

這樣做的一種方法是使用操作系統系統調用,正如您在另一個答案中提到的那樣。如果你是在x86的Linux,那麼你可以使用sys_write SYS調用寫一個字符串到標準輸出,就像這樣(GNU彙編語法):

STR: 
    .string "message from assembler\n" 

.globl asmfunc 
    .type asmfunc, @function 

asmfunc: 
    movl $4, %eax # sys_write 
    movl $1, %ebx # stdout 
    leal STR, %ecx # 
    movl $23, %edx # length 
    int $0x80  # syscall 

    ret 

但是,如果你要打印的數值,然後最靈活的方法是使用C標準庫中的printf()函數(你提到你從C調用你的彙編器rountines,所以你可能會鏈接到標準庫)。這是一個例子:

int_format: 
    .string "%d\n" 

.globl asmfunc2 
    .type asmfunc2, @function 

asmfunc2: 
    movl $123456, %eax 

    # print content of %eax as decimal integer 
    pusha   # save all registers 
    pushl %eax 
    pushl $int_format 
    call printf 
    add $8, %esp # remove arguments from stack 
    popa   # restore saved registers 

    ret 

有兩點需要注意:

  • 您需要保存和恢復寄存器,因爲他們可以通過電話打一頓;和
  • 當您調用一個函數時,參數按從右到左的順序推入。
+0

這正是我所期待的,非常感謝您的幫助。 – Joseph 2010-03-24 04:43:18