Por que o NASM no Linux altera os registros no assembly x86_64

Eu sou novo na programação de montagem x86_64. Eu estava escrevendo o programa "Hello World" simples na montagem x86_64. Abaixo está o meu código, que funciona perfeitamente bem.

global _start

section .data

    msg: db "Hello to the world of SLAE64", 0x0a
    mlen equ $-msg

section .text
    _start:
            mov rax, 1
            mov rdi, 1
            mov rsi, msg
            mov rdx, mlen
            syscall

            mov rax, 60
            mov rdi, 4
            syscall 

Agora, quando desmontei em gdb, ele mostra abaixo a saída:

(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000b0 <+0>:     mov    eax,0x1
   0x00000000004000b5 <+5>:     mov    edi,0x1
   0x00000000004000ba <+10>:    movabs rsi,0x6000d8
   0x00000000004000c4 <+20>:    mov    edx,0x1d
   0x00000000004000c9 <+25>:    syscall
   0x00000000004000cb <+27>:    mov    eax,0x3c
   0x00000000004000d0 <+32>:    mov    edi,0x4
   0x00000000004000d5 <+37>:    syscall
End of assembler dump.

Minha pergunta é por que o NASM se comporta dessa maneira? Eu sei que ele muda as instruções com base no opcode, mas não tenho certeza sobre o mesmo comportamento dos registros.

Além disso, esse comportamento afeta a funcionalidade do executável?

Estou usando o Ubuntu 16.04 (64 bits) instalado no VMware no processador i5.

Agradeço antecipadamente.

questionAnswers(2)

yourAnswerToTheQuestion