我對使用程序集將字符打印到屏幕有點困惑。該架構是x86(linux)。是否可以調用其中一個C函數或者是否有更簡單的方法?我想輸出的字符存儲在一個寄存器中。在程序集x86中將字符打印到標準輸出中
謝謝!
我對使用程序集將字符打印到屏幕有點困惑。該架構是x86(linux)。是否可以調用其中一個C函數或者是否有更簡單的方法?我想輸出的字符存儲在一個寄存器中。在程序集x86中將字符打印到標準輸出中
謝謝!
當然,你可以使用任何正常的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
調用putchar(3)
是最簡單的方法。只需將字符的值移入rdi
寄存器(對於x86-64,或將edi
用於x86),並調用putchar
。
E.g. (對於x86-64):
asm("movl $120, %rdi\n\t"
"call putchar\n\t");
將打印一個x
到標準輸出。
錯誤的ABI! (x86-64 OS X,猜測給定了寄存器 - 雖然我認爲你希望'%rdi'不是'%edi'-和庫函數的前導'_') –
你是對的=)我編輯了上面的帖子。 –
您在代碼中更改了它,但您的描述仍然會顯示「edi寄存器」。 – porglezomp
謝謝。但是,如果註冊ebx的值爲8,我想打印字符「8」。如果我嘗試推ebx作爲參數,它不起作用,所以有沒有辦法解決這個問題?歡呼 – user973758
,這將相當於'printf(「%d」,8);'我加了這個答案 – Martin