寄存器名称与数据类型

本文详细介绍了x86-64结构CPU的16个通用目的寄存器,包括其历史演变和不同位宽的使用方式。寄存器名称与用途有明确的约定,部分寄存器遵循调用者保存或被调用者保存规则。同时,文章还阐述了64位系统中的数据类型,如字、字节、长字和q字。最后,讨论了CPU的寻址方式,包括直接寻址和间接寻址,并举例说明了内存引用的操作数格式。

寄存器

  • x86-64结构的CPU包含一组16个存储64位值的通用目的寄存器;历史上最开始的寄存器只有8个8位的寄存器,后来经历了16位, 32位直至现在的64位,寄存器也由8个扩展到16个。
  • 程序可以依据每个寄存器的名称使用其中的8位,或16位,或32位,或64位;使用每个寄存器有约定的使用目的。

下面以表格的形式给出寄存器的名称与用法

63311570
%rax%eax%ax%al返回值
%rbx%ebx%bx%bl被调用者保存
%rcx%ecx%cx%cl第4个参数
%rdx%edx%dx%dl第3个参数
%rsi%esi%si%sil第2个参数
%rdi%edi%di%dil第1个参数
%rbp%ebp%bp%bpl被调用者保存
%rsp%esp%sp%spl栈指针
%r8%r8d%r8w%r8b第5个参数
%r9%r9d%r9w%r9b第6个参数
%r10%r10d%r10w%r10b调用者保存
%r11%r11d%r11w%r11b调用者保存
%r12%r12d%r12w%r12b被调用者保存
%r13%r13d%r13w%r13b被调用者保存
%r14%r14d%r14w%r14b被调用者保存
%r15%r15d%r15w%r15b被调用者保存

注:%rip是程序计数器,与这16个不同。

  • 调用者保存是指当P函数调用Q函数时,该寄存器中的内容由调用者P负责保存,Q可以直接使用该寄存器。
  • 被调用者保存是指当P函数调用Q函数时,该寄存器中的内容由被调用者Q负责保存,Q在使用这些寄存器前应当先把这些寄存器内的值存入栈中,Q返回之前应当将对应的值从栈中恢复到寄存器上。

数据类型

以下是64位结构上对应的数据类型。Intel用术语“字word”表示16位的数据类型;byte表示字节,long word表示32位,q表示64位

C声明Intel数据类型汇编代码后缀大小(字节)
char字节b1
shortw2
int双字l4
long四字q8
char *四字q8
float单精度s4
double双精度l8

cpu寻址

cpu操作数据就需要知道数据的地址,通过寻址来实现。寻址分为直接寻址和间接寻址。以下做一些解释。

操作数:
- 立即数 $标准C表示法表示的整数
- 寄存器 R[ra]
- 内存引用 Mb[Addr]
Imm(rb, ri, s): 有效地址 Imm+R[rb]+R[ri]*s; 注意两个rb,ri都必须是64位寄存器,比例因子s必须是1, 2, 4或8

类型格式操作数值名称
立即数$ImmImm立即数寻址
寄存器raR[ra]寄存器寻址
存储器ImmM[Imm]绝对寻址
存储器(ra)M[R[ra]间接寻址
存储器Imm(rb)M[Imm+R[rb]](基地址+偏移量)寻址
存储器(rb, ri)M[R[rb]+R[ri]]变址寻址
存储器Imm(rb, ri)M[Imm+R[rb]+R[ri]]变址寻址
存储器(, ri, s)M[R[ri]*s]比例变址寻址
存储器Imm(, ri, s)M[Imm+R[ri]*s]比例变址寻址
存储器(rb, ri, s)M[R[rb]+R[ri]*s]比例变址寻址
存储器Imm(rb, ri, s)M[Imm+R[rb]+R[ri]*s]比例变址寻址

任何操作都不能直接进行内存到内存数据修改,要实现内存到内存的数据操作只能先将数据修改到寄存器,然后再通过寄存器修改到内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值