¿Por qué el hecho de pasar de AT&T a la sintaxis de Intel hace que este tutorial sea seguro utilizando GAS?

Estoy trabajando a través de algunos de los tutoriales enhttp://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html Para familiarizarme con x86 / x64. Este código tutorial se compila y ejecuta sin ningún problema usando el código provisto, que usa la sintaxis de AT&T:

.global main
.text
main:                               # This is called by C library's startup code
    mov     $message, %rdi          # First integer (or pointer) parameter in %edi
    call    puts                    # puts("Hello, World")
    ret                             # Return to C library code
message:
    .asciz "Hello, World"           # asciz puts a 0x00 byte at the end

Sin embargo, cuando convierto este código a la sintaxis de Intel, aparece un error "Error de segmentación".

.intel_syntax noprefix
.global main
.text
main:                               # This is called by C library's startup code
    mov     rdi, message            # First integer (or pointer) parameter in %edi
    call    puts                    # puts("Hello, World")
    ret                             # Return to C library code
message:
    .asciz "Hello, World"           # asciz puts a 0x00 byte at the end

No estoy familiarizado con x86, así que tal vez me esté perdiendo algo. ¿Algunas ideas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta