How to print a character in Linux x86 NASM?

assembly, linux, nasm, system-calls, x86

Solution

`ecx` should contain a pointer to the start of your char buffer. So you have to have your buffer in memory. You can do the following:

; Print 'A' character 
mov   eax, 4      ; __NR_write from asm/unistd_32.h (32-bit int 0x80 ABI)
mov   ebx, 1      ; stdout fileno

push  'A'
mov   ecx, esp    ; esp now points to your char
mov   edx, 1      ; edx should contain how many characters to print
int   80h         ; sys_write(1, "A", 1)

; return value in EAX = 1 (byte written), or error (-errno)

add   esp, 4      ; restore esp if necessary

You can `mov byte [esp], 'A'` or whatever other address if it's OK to overwrite whatever is on the stack.

Or you can have a character array in `section .rodata` instead of storing on the fly.

Making a `write()` system call with the `const void *buf` arg being some small number (like `'A'`) will make it return `-EFAULT` without printing anything. The kernel has to check the pointer anyway, and system calls return an error instead of raising SIGSEGV on bad pointers.

Use `strace ./my_program` to trace the system calls you actually made, including decoding the return values.

Problem

I'm trying to print a single character or a number using NASM, targeting an x86 GNU/Linux architecture. Here's the code I'm using: ``` section .text global _start _start: ; Linux printing preparation mov eax,4 mov ebx,1 ; Print 'A' character mov ecx,'A' ; ecx should contain the value to print mov edx,1 ; edx should contain how many characters to print int 80h ; System exit mov eax,1 mov ebx,0 int 80h ``` Running this code, however, prints nothing. What am I doing wrong?

Original source

Related problems