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