2011-11-20 87 views

回答

5

當然,你可以使用任何正常的C函數。下面是一個使用printf打印一些輸出NASM例如:

; 
; assemble and link with: 
; nasm -f elf test.asm && gcc -m32 -o test test.o 
; 
section .text 

extern printf ; If you need other functions, list them in a similar way 

global main 

main: 

    mov eax, 0x21 ; The '!' character 
    push eax 
    push message 
    call printf 
    add esp, 8  ; Restore stack - 4 bytes for eax, and 4 bytes for 'message' 
    ret 

message db 'The character is: %c', 10, 0 

如果你只想打印單個字符,你可以使用putchar

push eax 
call putchar 

如果你想打印出來一個數字,你可以這樣做:

mov ebx, 8 
push ebx 
push message 
call printf 
...  
message db 'The number is: %d', 10, 0 
+0

謝謝。但是,如果註冊ebx的值爲8,我想打印字符「8」。如果我嘗試推ebx作爲參數,它不起作用,所以有沒有辦法解決這個問題?歡呼 – user973758

+0

,這將相當於'printf(「%d」,8);'我加了這個答案 – Martin

1

調用putchar(3)是最簡單的方法。只需將字符的值移入rdi寄存器(對於x86-64,或將edi用於x86),並調用putchar

E.g. (對於x86-64):

asm("movl $120, %rdi\n\t" 
    "call putchar\n\t"); 

將打印一個x到標準輸出。

+0

錯誤的ABI! (x86-64 OS X,猜測給定了寄存器 - 雖然我認爲你希望'%rdi'不是'%edi'-和庫函數的前導'_') –

+0

你是對的=)我編輯了上面的帖子。 –

+0

您在代碼中更改了它,但您的描述仍然會顯示「edi寄存器」。 – porglezomp

相關問題