程序的机器级表示

本文介绍了32位到64位CPU的变化,特别是寄存器数量从8个增加到16个,每个寄存器能存储64位值。在生成小于8字节结果的指令时,有不同的规则:生成1字节或2字节结果会保留其余字节不变,而生成4字节结果则会将高位4字节清零。此外,还探讨了操作数指示符在这一过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3 程序的机器级表示

3.4 访问信息

32位之前仅有8个寄存器,而64位cpu包含一组16个存储64位值的寄存器(r8开始为64位新增寄存器)

6432168含义
%rax%eax%ax%a1返回值
%rbx%ebx%bx%b1被调用者保存
%rcx%ecx%cx%c1第4个参数
%rdx%edx%dx%d1第3个参数
%rsi%esi%si%si1第2个参数
%rdi%edi%di%di1第1个参数
%rdp%edp%dp%dp1被调用者保存
%rsp%esp%sp%sp1栈指针
%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被调用者保存

对于生成小于8字节结果的指令,寄存器对此有两种规则:

  1. 生成1字节、2字节的指令会保存剩下的字节不变
  2. 生成4字节的指令会把高位4个字节置为0

3.4.1 操作数指示符

类型格式操作数值名称
立即数$ImmImm立即数寻址
寄存器 r a r_a ra R [ r a ] R[r_a] R[ra]寄存器寻址
存储器Imm M [ I m m ] M[Imm] M[Imm](M表示从内存中寻址)绝对寻址
存储器 ( r a ) (r_a) (ra) M [ R [ r a ] ] M[R[r_a]] M[R[ra]]间接寻址
存储器 I m m ( r b ) Imm(r_b) Imm(rb) M [ I m m + R [ r b ] ] M[Imm+R[r_b]] M[Imm+R[rb]](基址+偏移量)寻址
存储器 ( r b , r i ) (r_b,r_i) (rb,ri) M [ R [ r b ] + R [ r i ] ] M[R[r_b]+R[r_i]] M[R[rb]+R[ri]]变址寻址
存储器 I m m ( r b , r i ) Imm(r_b,r_i) Imm(rb,ri) M [ I m m + R [ r b ] + R [ r i ] ] M[Imm+R[r_b]+R[r_i]] M[Imm+R[rb]+R[ri]]变址寻址
存储器 ( , r i , s ) (,r_i,s) (,ri,s) M [ R [ r i ] ∗ s ] M[R[r_i]*s] M[R[ri]s]比例变址寻址
存储器 I m m ( , r i , s ) Imm(,r_i,s) Imm(,ri,s) M [ I m m + R [ r i ] ∗ s ] M[Imm+R[r_i]*s] M[Imm+R[ri]s]比例变址寻址
存储器 ( r b , r i , s ) (r_b,r_i,s) (rb,ri,s) M [ R [ r b ] + R [ r i ] ∗ s ] M[R[r_b]+R[r_i]*s] M[R[rb]+R[ri]s]比例变址寻址
存储器 I m m ( r b , r i , s ) Imm(r_b,r_i,s) Imm(rb,ri,s) M [ I m m + R [ r b ] + R [ r i ] ∗ s ] M[Imm+R[r_b]+R[r_i]*s] M[Imm+R[rb]+R[ri]s]比例变址寻址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值