Linux X86-64 assembly and printf

assembly, binary-data, linux, x86-64

Solution

Linux (and Windows) x86-64 calling convention has the first few arguments not on the stack, but in registers instead

See http://www.x86-64.org/documentation/abi.pdf (page 20)

Specifically:

- If the class is MEMORY, pass the argument on the stack.

- If the class is INTEGER, the next available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9 is used.

- If the class is SSE, the next available vector register is used, the registers are taken in the order from %xmm0 to %xmm7.

- If the class is SSEUP, the eightbyte is passed in the next available eightbyte chunk of the last used vector register.

- If the class is X87, X87UP or COMPLEX_X87, it is passed in memory.

The `INTEGER` class is anything that will fit in a general purpose register, so that's what you would use for string pointers as well.

Problem

I am reading some linux assembly manuals and found idea about using printf() function. I need it to output register values for debugging reasons in binary form to terminal, but now I am tried simply to test that function with text. I am stuck, because of segfault when I am using pushq instead of pushl. How can I change this program to output strings and binary form of registers? ``` .data input_prompt: .string "Hello, world!" printf_format: .string "%5d " printf_newline: .string "\n" size: .long 0 .text .globl main main: pushq $input_prompt call printf movl $0, %eax ret ``` It was compiled by GCC as: ``` gcc tmp.S -o tmp ```

Original source

Related problems