本节内容
数据寻址2
(偏移寻址)
研/CSKAOYAN
指令寻址 . 数据寻址
寻址方式
指令寻址 下一条 欲执行 指令 的 指令
地址
始终由程序计
顺序寻址
数器PC给出
跳跃寻址
数据寻址 确定 本条指令 的 地址码指明的真实
地址 以某个地址作为起点
形式地址视为“偏移量”
0 起始 100
PC
100
1 101 101
102 1022
103 1033
104 1044
105 1055
106 1066
7 107 107
108 1088
LDA 1000LDA 1000 LDA 1000
ADD 1001ADD 1001 ADD 1001
DEC 1200DEC 1200 DEC 1200
JMP 3JMP 7 JMP 7
LDA 2000LDA 2000 LDA 2000
SUB 2001SUB 2001 SUB 2001
INCINC INC
LDA 1100LDA 1100 LDA 1100
…… …
研/CSKAOYAN
知识总览
一地址指令 操作码(OP)
求出操作数的真实地址,
称为有效地址(EA)。
都属于“偏移寻址” 0000 寻址方式位
0001
0010
0011
1001 0100
1
寻址特征 形式地址
(A)
0101
研/CSKAOYAN
偏移寻址
EA=(BR)+A 区别在于偏移的“起点”
不一样
EA=(IX)+A
EA=(PC)+A
基址寻址:以程序的起始存放地址作为“起点”
变址寻址:程序员自己决定从哪里作为“起点”
相对寻址:以程序计数器PC所指地址作为“起点”
研/CSKAOYAN
基址寻址
注:BR——base address
registerEA——effective
address
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,
而形成操作数的有效地址,即EA=(BR)+A。
在指令中指明,
要将哪个通用
寄存器作为基
址寄存器使用
专门的基
址寄存器
EA
要用几个bit
Tips:可对比操作系统第三章第一节学习,
OS课中的“重定位寄存器”就是“基址寄
存器”
指明寄存器?
根据通用寄存
器总数判断
研/CSKAOYAN
基址寻址的作用
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,
而形成操作数的有效地址,即EA=(BR)+A。
低地址
0
程序从地址0 形式地址A=5
变量a
开始存放
8
PC
的实际
存放地
址为5
高地址 主存
主存
地址
指令 注释
操作码 地址码
0 000001 0000000101 取数a至ACC
1 000100 0000000110 乘b得ab ,存于ACC中
2 000011 000000011
1
加c得ab+c ,存于ACC中
3 000010 0000001000 将ab+c ,存于主存单元
4 000110 0000000000 停机
5 0000000000000010 原始数据a=2
6 0000000000000011 原始数据b=3
7 0000000000000001 原始数据c=1
8 0000000000000000 原始数据y=0
研/CSKAOYAN
拓展:程序运行前,CPU将BR的值修改为
该程序的起始地址(存在操作系统PCB中)基址寻址的作用
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,
而形成操作数的有效地址,即EA=(BR)+A。
BR
优点:便于程序“浮动”,方便实现多道程序并发运行
形式地址A=5
低地址 程序从地址 采用基址
寻址无需100开始存放
PC
100
108
修改指令
中的地址
码
变量a的
实际存
放地址
为105
高地址 主存
对应十
进制100 研/CSKAOYAN0000000001100100
主存
地址
指令 注释
操作码 地址码
0 000001 0000000101 取数a至ACC
1 000100 0000000110 乘b得ab ,存于ACC中
2 000011 000000011
1
加c得ab+c ,存于ACC中
3 000010 0000001000 将ab+c ,存于主存单元
4 000110 0000000000 停机
5 0000000000000010 原始数据a=2
6 0000000000000011 原始数据b=3
7 0000000000000001 原始数据c=1
8 0000000000000000 原始数据y=0
基址寻址
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,
而形成操作数的有效地址,即EA=(BR)+A。
EA
注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行
过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
当采用通用寄存器作为基址寄存器时,可
由用户决定哪个寄存器作为基址寄存器,
但其内容仍由操作系统确定。优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自
己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序
(整个程序在内存里边的浮动)。
研/CSKAOYAN
变址寻址
注:IX— index register
变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,
即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器
。
EA EA
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变
(IX作为偏移量),形式地址A不变(作为基地址) 。
基址寻址中,BR保
持不变作为基地址,
A作为偏移量
研/CSKAOYAN
变址寻址的作用
注:此处未添加“寻址特征”位,但
实际上每条指令都会指明寻址方式。
此处讲解仅用口头描述
立即寻址
主存 指令
注释地址 操作码 地址码
0 取数到ACC #0(立即数) 立即数 0 à ACC
1 ACC加法 12(a[0]地址) (ACC)+a[0] à ACC
2 ACC加法 13(a[1]地址) (ACC)+a[1] à ACC
ACC
直接寻址
… ACC加法 14 (ACC)+a[2] à ACC
9 … … ……
10 ACC加法 21 (ACC)+a[9] à ACC
是时候召唤
11 从ACC存数 22 (ACC)à sum变量
12 随便什么值 a[0]
“变址寻址” 13 随便什么值 a[1]
了! …… …
21 随便什么值 a[9]
22 初始为0 sum变量
for(inti=0; i<10; i++){
sum += a[i];
} 0
研/CSKAOYAN
变址寻址的作用
立即寻址
主存 指令 注释
留地址 操作码 地址码
0 取数到ACC #0 立即数 0 à ACC
1 取数到IX #0 立即数 0 à IX
变址寻址 2 ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC
3 IX加法 #1 (IX)+1à IX
AC
C
立即寻址 个
4 IX比较 #10 比较10-(IX) 坑
5 条件跳转 2 若结果>0 则PC跳转到2
直接寻址
6 从ACC存数 17 (ACC)à sum变量
IX 7 随便什么值 a[0]
8 随便什么值 a[1]
在数组处理过程中,可设定A为数组的 9 随便什么值 a[2]
… … …首地址,不断改变变址寄存器IX的内
容,便可很容数组中任一数据 16 随便什么值 a[9]
的地址,特别适合编制循环程序。 17 初始为0 sum变量
for(inti=0; i<10; i++){
sum += a[i];
}
01291
0
0
变址寻址
变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,
即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器
。
EA
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变
(作为偏移量),形式地址A不变(作为基地址)。
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便
可很容数组中任一数据的地址,特别适合编制循环程序。
研/CSKAOYAN
基址寻址:EA=(BR)+A 基址&变址复合寻址
注:实际应用中往往需要多种寻址
方式复合使用(可理解为复合函数)
变址寻址:EA=(IX)+A
先基址后变址寻址:
EA=(IX)+(BR)+A
主存 指令
注释地址 操作码 地址码
低地址
0 取数到ACC #0 立即数 0 à ACC
1 取数到IX #0 立即数 0 à IX
100
基址、变址
2 ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC
3 IX加法 #1 (IX)+1à IX
4 IX比较 #10 比较10-(IX)寻址的复合
5 条件跳转 2 若结果>0 则PC跳转到2
108
6 从ACC存数 17 (ACC)à sum变量
7 随便什么值 a[0]
8 随便什么值 a[1]
… … …
高地址 主存
16 随便什么值 a[9]
BR IX 17 初始为0 sum变量
访问目标 9 随便什么值 a[2]
100
2
相对寻址
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,
即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示
。
注:的小错误——“A是相对于当前指令地址的位移量”�
取出当前指令
后,PC+”1” 指
向下一条指令
当前指令存放地址=1000
若当前指令字长=2B,则PC+2
若当前指令字长=4B,则PC+4
因此取出当前指令后PC可能为 1002or1004
研/CSKAOYAN
相对寻址的作用
for循环主体
主存 指令 注释
地址 操作码 地址码
0 取数到ACC #0 立即数 0 à ACC
1 取数到IX #0 立即数 0 à IX
问题:随着代码越写越多, 2 ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC
3 IX加法 #1 (IX)+1à IX你想挪动for循环的位置
4 IX比较 #10 比较10-(IX)
注:站在 直接寻址 5 条件跳转 2 若结果>0 则PC跳转到2
汇编语言 6 从ACC存数 17 (ACC)à sum变量
程序员的
7 随便什么值 a[0]角度思考
8 随便什么值 a[1]
9 随便什么值 a[2]
… … …
16 随便什么值 a[9]
17 初始为0 sum变量
for(inti=0; i<10; i++){
sum += a[i];
}
相对寻址的作用
主存
操作码
指令
注释地址 地址码
0 取数到ACC #0 立即数 0 à ACC
1 取数到IX #0 立即数 0 à IX
问题:随着代码越写越多,
2 … … 其他代码
你想挪动for循环的位置 3 … … 其他代码
注:站在
4 … … 其他代码
5 … … 其他代码
汇编语言
其他代码… … …
程序员的
M ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC角度思考
for循环主体
M+1 IX加法 #1 (IX)+1à IX
M+2 IX比较 #10 比较10-(IX)
采用直接寻址
M+3 条件跳转 2 若结果>0 则PC跳转到2会出现错误
PC M+4 … …
… … …
for(inti=0; i<10; i++){
sum += a[i];
}
M+4
研
/CSK
AOYA
N
拓展:ACC加法指令的地址码, 相对寻址的作用
可采用“分段”方式解决,即
用相对寻址
PC M+4 … …
… … …
注释
程序段、数据段分开。
主存 指令
地址 操作码 地址码
0 取数到ACC #0 立即数 0 à ACC
1 取数到IX #0 立即数 0 à IX
问题:随着代码越写越多,
2 … … 其他代码
你想挪动for循环的位置
3 … … 其他代码
相对寻址:EA=(PC)+A,其中
4 … … 其他代码
5 … … 其他代码
A是相对于PC所指地址的位
移量,可正可负,补码表示
… … … 其他代码
优点:这段代码在程序内浮
动时不用更改跳转指令的地
址码
for循环
主体
M ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC
M+1 IX加法 #1 (IX)+1à IX
M+2 IX比较 #10 比较10-(IX)
M+3 条件跳转 -4(补码表示) 若结果>0 则PC跳转到M
for(inti=0; i<10; i++){
sum += a[i];
}
M+4
研
/CSK
AOYA
N
相对寻址
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,
即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示
。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是
相差一个固定值,因此便于程序浮动(一段代码在程序的浮动)。
相对寻址广泛应用于转移指令。
研/CSKAOYAN
本节回顾
寻址方式 有效地址 访 存 次 数(指令执行期
间)
隐含寻址 程序指定 0
立即寻址 A即是操作数 0
直接寻址 EA=A 1
一次间接寻址 EA=(A) 2
寄存器寻址 EA=Ri 0
寄存器间接一次寻址 EA=(Ri) 1
转移指令 相对寻址 EA=(PC)+A 1
多道程序 基址寻址 EA=(BR)+A 1
循环程序 变址寻址 数组问题 EA=(IX)+A 1
偏移寻址
注意:取出当前指令后, PC会指向下一条指令,相对寻址是相对于下一条指令的偏移
研/CSKAOYAN
高级语言视角: 硬件如何实现数的“比较” 注:无条件转移指令 jmp2,就
不会管PSW的各种标志位
if(a>b){
}else{ … 汇编语言中,条件跳转指令有 主存 操作码 指令地址码 注释
… 地址很多种,如 je2 表示当比较结
} 果为 a=b 时跳转到2 0 取数到ACC #0 立即数 0 à ACC
jg2 表示当比较结果为a>b时跳
1 取数到IX #0 立即数 0 à IX转到2
硬件视角: 2 ACC加法 7(数组始址) (ACC)+(7+(IX))à ACC
• 通过”cmp指令”比较 a 和
b(如
有的机器把 3 IX加法 #1 (IX)+1à IX
cmpa,b),实质上是用 a-b 4 IX比较 #10 比较10-(IX)
• 相减的结果信息会记录在程序 PSW称为“标
5 条件跳转 2 若结果>0 则PC跳转到2状态字寄存器中(PSW) 志寄存器”
• 根据PSW的某几个标志位进行 6 从ACC存数 17 (ACC)à sum变量
条件判断,来决定是否转移 7 随便什么值 a[0]
PSW中有几个比特位记录上次运算的结果 8 随便什么值 a[1]
9 随便什么值 a[2]
• 进位/借位标志 CF:最高位有进位/借位时CF=1
• 零标志 ZF:运算结果为0则 ZF=1,否则
ZF=0
… … …
• 符号标志 SF:运算结果为负,SF=1,否则为0 16 随便什么值 a[9]
• 溢出标志 OF:运算结果有溢出OF=1否则为0
17 初始为0 sum变量
研/CSKAOYAN