Nel montaggio di questo codice con nasm
:È possibile utilizzare sempre "mov eax, 0x1" anziché "mov rax, 0x1"?
BITS 64
mov eax, 0x1
mov rax, 0x1
ottengo questo output:
b8 01 00 00 00 b8 01 00 00 00
che è il codice operativo per mov eax, 0x1
ripetuta due volte.
Ciò significa che mov rax, 0x1
può sempre essere sostituito da mov eax, 0x1
o è solo in questo caso?
Se questo è corretto non sarebbe meglio usare rispetto:
xor rax, rax
inc rax
come che diventa 6 byte quando assemblato mentre mov eax, 0x1
è a soli 5 byte?
Relevant: http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers –
In realtà, poiché il primo frammento è corretto, il secondo frammento richiederebbe solo 4 byte (non sono richiesti prefissi REX). – harold
'xor eax, eax' /' inc eax' è 4B, leggermente più piccolo di 'mov eax, 1'. Ma non usarlo a meno che tu non stia ottimizzando pesantemente le dimensioni del codice. Spendere 1 byte per salvare un'istruzione (e un dominio ufo fuso) vale la pena per le moderne CPU. –