介绍
我在网上找过相关材料,感觉讲解都不是很详细,所以我自己写一篇相关文章,为了自己记忆,也为了帮助别人解惑。
寄存器寻址有以下几种模式,我按照书上用表格列出来
类型 | 格式 | 操作数值 | 名称 |
---|---|---|---|
立即数 | $ 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类:
- 第一种类型是立即数(immediate),用来表示常数值。
- 第二种类型是寄存器(register),他表示某个寄存器的内容。
- 第三种操作数是内存引用,他会根据计算出来的地址(通常称为有效地址)访问某个内存位置。
表中底部语法 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进行下详细讲解,题目如下:
地址 | 值 |
---|---|
0x100 | 0xFF |
0x104 | 0xAB |
0x108 | 0x13 |
0x10C | 0x11 |
寄存器 | 值 |
---|---|
%rax | 0x100 |
%rcx | 0x1 |
%rdx | 0x3 |
填写下表,给出所示操作数的值:
操作数 | 值 |
---|---|
%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
操作数 | 值 | 注释 |
---|---|---|
%rax | 0x100 | 寄存器 |
0x104 | 0xAB | 绝对寻址 |
$0x108 | 0x13 | 立即数 |
(%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 |