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

介绍

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

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

类型格式操作数值名称
立即数$ I m m Imm Imm I m m Imm Imm立即数寻址
寄存器 r a r_a ra R [ r a ] R[r_a] R[ra]寄存器寻址
存储器 I m m Imm Imm M [ I m m ] M[Imm] M[Imm]绝对寻址
存储器 ( 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]比例变址寻址

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

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

表中底部语法 I m m ( r b , r i , s ) Imm(r_b,r_i,s) Imm(rb,ri,s)表示的是最常用形式。这样的引用有四个部分组成:一个立即数便宜Imm,一个基址寄存器 r b r_b rb,一个变址寄存器 r i r_i ri和一个比例因子s,这里s必须是1、2、4或者8。基址和变址寄存器都必须是64位寄存器。又掉地址被计算为 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]

下面根据书中练习题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 [ r a ] ] M[R[r_a]] M[R[ra]],先通过寄存器寻找出%rax的值为0x100,然后再去内存中寻找0x100的值0xFF
  • 4(%rax)为(基址 + 偏移量)寻址,根据公式 M [ I m m + R [ r b ] ] M[Imm+R[r_b]] M[Imm+R[rb]],所以先找到%rax的值再加4,得到地址0x104,然后在根据这个值查找结果,结果为0xAB
  • 9(%rax,%rdx)为变址寻址,根据公式 M [ I m m + R [ r b ] + R [ r i ] ] 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 [ I m m + R [ r i ] ∗ s ] M[Imm+R[r_i]*s] M[Imm+R[ri]s],0xFC+0x001*4=0x100,所以结果为0xFF
  • (%rax,%rcx,4)为比例变址寻址,根据公式 M [ R [ r b ] + R [ r i ] ∗ 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
  • 21
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值