Where can I find the names of the new registers for assembly on this architecture?
I am referring to registers in X86 like EAX, ESP, EBX, etc. But I'd like them in 64bit.
I don't think they are the same as when I disassemble my C code, I get r's instead of e's.
The x64 processor also provides several sets of floating-point registers: Eight 80-bit x87 registers. Eight 64-bit MMX registers.
The main tools to write programs in x86 assembly are the processor registers. The registers are like variables built in the processor. Using registers instead of memory to store values makes the process faster and cleaner.
The MSDN documentation includes information about the x64 registers.
x64 extends x64's 8 general-purpose registers to be 64-bit, and adds 8 new 64-bit registers. The 64-bit registers have names beginning with "r", so for example the 64-bit extension of eax is called rax. The new registers are named r8 through r15.
The lower 32 bits, 16 bits, and 8 bits of each register are directly addressable in operands. This includes registers, like esi, whose lower 8 bits were not previously addressable. The following table specifies the assembly-language names for the lower portions of 64-bit registers.
64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits ============================================================== rax | eax | ax | al rbx | ebx | bx | bl rcx | ecx | cx | cl rdx | edx | dx | dl rsi | esi | si | sil rdi | edi | di | dil rbp | ebp | bp | bpl rsp | esp | sp | spl r8 | r8d | r8w | r8b r9 | r9d | r9w | r9b r10 | r10d | r10w | r10b r11 | r11d | r11w | r11b r12 | r12d | r12w | r12b r13 | r13d | r13w | r13b r14 | r14d | r14w | r14b r15 | r15d | r15w | r15b
The old 32-bit registers have been extended to 64 bits, the r registers (rax, rbx, rsp and so on).
In addition, there's some extra general purpose registers r8 through r15 which can also be accessed as (for example) r8d, r8w and r8b (the lower 32-bit double-word, 16-bit word and 8-bit byte respectively). The b suffix is the original AMD nomenclature but you'll sometimes see it written as l (lower case L) for "low byte".
I tend to prefer the b suffix myself (even though the current low-byte registers are al, bl, and so on) since it matches the d/w = double/word names and l could potentially be mistaken for long. Or, worse, the digit 1, leading you to question what the heck register number 81 is :-)
The high bytes of the old 16-bit registers are still accessible, under many circumstances, as ah, bh, and so on (though this appears to not be the case for the new r8 through r15 registers). There are some new instruction encodings, specifically those using the REX prefix, that can not access those original high bytes, but others are still free to use them.
In addition, there's some new SSE registers, xmm8 though xmm15.
The eip and eflags registers have also been extended to rip and rflags(though the high 32 bits of rflags are, for now, still unused).
See the wikipedia page and MSDN for more details.
Whether these are supported in the asm keyword for a particular C compiler, I couldn't say. What little assembly I do (and it's becoming about one day a year) is done in assembly rather than C.
Related:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With