深入理解计算机系统寄存器寻址讲解

本文深入解析寄存器寻址的各种模式,包括立即数、寄存器、绝对、间接、基址+偏移量、变址及比例变址寻址。通过实例,详细展示了如何计算操作数的有效地址。

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

介绍

我在网上找过相关材料,感觉讲解都不是很详细,所以我自己写一篇相关文章,为了自己记忆,也为了帮助别人解惑。

寄存器寻址有以下几种模式,我按照书上用表格列出来

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

大多数指令有一个活多个操作数(operand),指示出执行一个操作中要使用的源数据值,以及防止结果的墓地位置。寄存器寻址大体分为3类:

  1. 第一种类型是立即数(immediate),用来表示常数值。
  2. 第二种类型是寄存器(register),他表示某个寄存器的内容。
  3. 第三种操作数是内存引用,他会根据计算出来的地址(通常称为有效地址)访问某个内存位置。

表中底部语法Imm(rb,ri,s)Imm(r_b,r_i,s)Imm(rb,ri,s)表示的是最常用形式。这样的引用有四个部分组成:一个立即数便宜Imm,一个基址寄存器rbr_brb,一个变址寄存器rir_iri和一个比例因子s,这里s必须是1、2、4或者8。基址和变址寄存器都必须是64位寄存器。又掉地址被计算为M[Imm+R[rb]+R[ri]∗s]M[Imm+R[r_b]+R[r_i]*s]M[Imm+R[rb]+R[ri]s]

下面根据书中练习题3.1进行下详细讲解,题目如下:

地址
0x1000xFF
0x1040xAB
0x1080x13
0x10C0x11
寄存器
%rax0x100
%rcx0x1
%rdx0x3

填写下表,给出所示操作数的值:

操作数
%rax
0x104
$0x108
(%rax)
4(%rax)
9(%rax,%rdx)
260(%rcx,%rdx)
0xFC(,%rcx,4)
(%rax,%rcx,4)

然后根据前面的讲解,逐一计算一下上面的值

  • %rax为寄存器寻址,所以结果为0x100
  • 0x104为绝对寻址,所以结果为0xAB
  • $0x108为立即数寻址,所以结果为0x13
  • (%rax)为间接寻址,根据公式M[R[ra]]M[R[r_a]]M[R[ra]],先通过寄存器寻找出%rax的值为0x100,然后再去内存中寻找0x100的值0xFF
  • 4(%rax)为(基址 + 偏移量)寻址,根据公式M[Imm+R[rb]]M[Imm+R[r_b]]M[Imm+R[rb]],所以先找到%rax的值再加4,得到地址0x104,然后在根据这个值查找结果,结果为0xAB
  • 9(%rax,%rdx)为变址寻址,根据公式M[Imm+R[rb]+R[ri]]M[Imm+R[r_b]+R[r_i]]M[Imm+R[rb]+R[ri]],先查找%rax,和%rdx的寄存器的值,然后和9相加,地址为0x10C,根据上面的表查出结果0x11
  • 260(%rcx,%rdx),260转十六进制为104,所以地址为0x104+0x001+0x003=0x108,所以结果为0x13
  • 0xFC(,%rcx,4)为比例变址寻址,根据公式M[Imm+R[ri]∗s]M[Imm+R[r_i]*s]M[Imm+R[ri]s],0xFC+0x001*4=0x100,所以结果为0xFF
  • (%rax,%rcx,4)为比例变址寻址,根据公式M[R[rb]+R[ri]∗s]M[R[r_b]+R[r_i]*s]M[R[rb]+R[ri]s],0x100+0x001*4=0x10C,所以结果为0x11
操作数注释
%rax0x100寄存器
0x1040xAB绝对寻址
$0x1080x13立即数
(%rax)0xFF地址为0x100
4(%rax)0xAB地址为0x104
9(%rax,%rdx)0x11地址为0x10C
260(%rcx,%rdx)0x13地址为0x108
0xFC(,%rcx,4)0xFF地址为0x100
(%rax,%rcx,4)0x11地址为0x10C
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值