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.