answer about assembly registers' sizes:
- 首先,在64位体系结构中,
eax
、ax
、ah
及其对应物的大小是多少?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?
我希望注意x86-64(x64)和Itanium处理器。
- 第二,在新的调用约定中,在函数调用中使用四个寄存器来保存前四个参数的正确方法是什么?
answer about assembly registers' sizes:
eax
、ax
、ah
及其对应物的大小是多少?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?我希望注意x86-64(x64)和Itanium处理器。
1条答案
按热度按时间w8rqjzmb1#
使用旧名称所有寄存器保持相同的大小,就像x86-16扩展到x86-32时一样。要访问64位整数寄存器,您可以使用带有R-prefix的新名称,例如 rax,rbx... *
寄存器名称不会改变,因此您只需像以前一样使用字节寄存器(al,bl,cl,dl,ah,bh,ch,dh*)来存储 ax,bx,cx,dx 的LSB和MSB。
还有8个新寄存器,称为 r8-r15。您可以通过添加后缀
b
(或l
if you're using AMD)来访问其LSB。例如 * r8 b,r9 b,r10 l,r11 l... * 您也可以使用 esi,edi,esp,ebp 的LSB,名称为 sil,dil,spl,bpl,带有新的REX前缀,但不能同时使用 ah,bh,ch或dh。同样,新寄存器的最低字或双字可以通过后缀
w
或d
访问。**更新:**英特尔刚刚推出了一个名为APX的new extension for x86-64,它增加了16个名为r16-r31的寄存器
因此,通用寄存器列表如下所示:
| 64-低32位|低16位|低8位| Lower 8 bits |
| --|--|--| ------------ |
| 埃克斯|斧头|阿尔| al |
| 埃布克斯|bx| BL| bl |
| 欧洲共同市场|cx| cl| cl |
| edx| dx| dl| dl |
| 埃西|si|银| sil |
| edi|迪|迪尔| dil |
| 欧洲银行|bp|英国石油公司| bpl |
| 尤指|SP| SPL| spl |
| r8d| R8W| r8b(r8l)| r8b (r8l) |
| r9d| r9w| r9b(r9l)| r9b (r9l) |
| r10d| r10w| r10b(r10l)| r10b (r10l) |
| r11d| r11w| r11b(r11l)| r11b (r11l) |
| r12d| r12w| r12b(r12l)| r12b (r12l) |
| r13d| r13w| r13b(r13l)| r13b (r13l) |
| r14d| r14w| r14b(r14l)| r14b (r14l) |
| r15d| r15w| r15b(r15l)| r15b (r15l) |
| r16d| r16w| r16b(r16l)| r16b (r16l) |
| r17d| r17w| r17b(r17l)| r17b (r17l) |
| ......这是什么?|......这是什么?|......这是什么?| ... |
| r31d| r31w| r31b(r31l)| r31b (r31l) |
当然,也有其他类型的寄存器,如控制,debug,flag,浮点,向量,段,测试...寄存器。有关详细信息,请查看https://wiki.osdev.org/CPU_Registers_x86。参见What are the names of the new X86_64 processors registers?
关于 * 调用约定 *,在每个特定系统上只有一个约定1。
1自MSVC 2013以来,Windows上还有一个名为
__vectorcall
的新扩展约定,因此“单一约定策略”不再适用。有关更多信息,请阅读x86-64和x86-64调用约定
在Plan 9中还有一个约定:
Golang follows the Plan 9 calling convention,但自go 1.17+以来,他们逐渐引入了register-based calling convention以获得更好的性能。调用约定将来可能会更改,编译器可以生成存根以自动调用旧约定中的汇编函数。目前the ABI specifies that
事实上,九号计划一直都是个怪人。例如,它在没有硬件零寄存器的RISC架构上强制寄存器为0。其上的x86寄存器名称在16、32和64位x86架构中也是一致的,操作数大小由助记符后缀指示。这意味着ax可以是16、32或64位寄存器,具体取决于指令后缀。如果你对此感到好奇,请阅读
OTOH Itanium是一个完全不同的架构,与x86-64没有任何关系。它是一个纯64位架构,因此所有普通寄存器都是64位,没有32位或更小的版本可用。里面有很多寄存器:
The Itanium processor, part 1: Warming up
阅读更多关于What is the difference between x64 and IA-64?