目录
指令系统基本概念
指令格式
操作数在很多时候表示的是运算数据存放的地址,所以也可以称为地址码。但是有一种情况是这个操作数就表示数据本身,也就是运算对象自己,而不是运算对象的存放处。因此,操作数就表示指令执行的对象。
指令中的操作数
(1)立即数操作数
立即数本身是参加操作的数据,可以是8位或16位,它没有运算地址的含义。又因为目标操作数一定表示操作结果的去向,即目标操作数一定要有地址的含义,所以立即数只能作为源操作数。
eg:
MOV AX,1234H:MOV的功能是实现数据传输,即将源操作数送到目标地址里面。这条指令的意思就是,把常数1234H送给目标寄存器AX。
MOV BL,22H:同上。
立即数可以是无符号或有符号数,给出的数据一定要符合字长的要求。
(2)寄存器操作数
参加运算的数存放在指令给出的寄存器中,可以是16位或8位。
eg:
- MOV AX, BX:将BX中的内容送到AX中。
- MOV DL, CH:将CH寄存器中的数据送到DL寄存器中。
(3)存储器操作数
参加运算的数存放在存储器的某一个或两个单元中。表现形式:[ ]
[ ] 里存放操作数在内存中的偏移地址。
指令的操作数出现 [ ] ,表示要寻址的数在内存中。
eg:
- MOV AL, [ 1200H ]:目标操作数AL是一个8位寄存器,意味着它的源操作数/存储器操作数是一个字节单元。把内存中偏移地址为1200H的单元的内容拿出来送给累加器AL。
- MOV AX, [ 1200H ]:因为目标操作数变成了AX,它是一个16位的寄存器,即两个字节单元。所以该条指令为,将1200H单元的内容拿出来送给了AL,将1201H单元的内容送给了AH,合起来就是AX等于1122H。
指令周期、机器周期、时钟周期
- 指令周期:CPU从内存取出一条指令并执行的时间。
- 机器周期:又叫CPU周期,CPU从内存取出一条指令的最短时间。
- 时钟周期:又叫节拍脉冲、震荡周期。
指令周期包含多个机器周期,机器周期包含多个时钟周期。
数据总线和地址总线
总线宽度:
总线带宽:单位时间内总线上可传送的数据量,总线带宽=位宽×工作频率。
总线位宽:能同时传送的数据位数。
地址总线的宽度:也可以理解为CPU寄存器位数,表明CPU的寻址能力;用2的n次方来计算;
数据总线的宽度:决定了一次可以传送多少个bit。
数据总线的位宽和地址总线是直接挂钩的,假如说数据总线的宽度是32位,每一次读取数据都会动用32根数据总线来读取,即一次可以读取4个字节,同时地址总线一次寻址范围也必须满足4字节,即每次寻址都需要2根地址总线。
C语言的内存对齐机制。待了解。
地址总线eg:
假设某个CPU有10根地址总线。一根线的状态只有两种:高电平1和低电平0。10根线就是2^10,数据大小的范围是0~1023内存单元。一个地址表示一个内存单元,一个内存单元对应一个字节。则它的寻址范围为1KB(1KB=1024B,B表示字节)。若CPU的地址总线的宽度为32,就是2^32,对应范围为4G。
数据总线eg:
某个CPU的数据总线为8根,那么它一次可传送一个8bit的二进制数(1个Byte),即该CPU一次性可传送的数据大小为1B;若数据总线为16根,则可以传送2B。
寻址能力
是CPU最多可以在内存中寻找到的地址数量,更多的CPU无法访问。内存的大小可以小于寻址能力,但不能大于它。地址总线的宽度决定了CPU寻址的上限(即寻址能力)。例如:2根地址线有四种组合,00,01,10,11。于是CPU就只能访问这四个地址。
寻址方式
立即寻址
立即寻址方式所提供的操作数紧跟在操作码后面,与操作码一起放在指令代码段中,不需要到其他地址单元中去取。立即数可以是8位,也可以是16位。这种寻址方式主要用于给寄存器或存储单元赋初值的场合。
寄存器寻址
寄存器寻址的特点是操作数在CPU内部的寄存器中,在指令中指定寄存器号。
由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采用寄存器寻址方式的指令执行速度较快。
直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址属于存储器寻址,用于说明操作数或操作数地址所在存储单元的地址。
直接寻址
直接寻址的操作数在存储器中,指令直接包含有操作数的有效地址。
寄存器间接寻址
寄存器间接寻址的操作数在存储器中,操作数有效地址在寄存器中。
- 由寄存器间接给出操作数的偏移地址;
- 存放偏移地址的寄存器称为间址寄存器(BX、BP、SI、DI);
- 操作数的段地址(数据处于哪个段)取决于选择哪个间址寄存器:BX、SI、DI--默认在数据段,BP--默认在堆栈段。
基址、变址寻址
eg:
执行下列指令:
MOV SI, 1100H
MOV BX, SI
MOV AX, [SI+BX]
解释:BX和SI相加等于2200H,因为基址寄存器选择的是BX,所以这个源操作数默认是在数据段,所以执行结果是将2200H和2201H两个单元的内容送给累加器AX。
小结:
寻址方式表示指令运算对象的来源和运算结果的去向。
注意点:
- 立即寻址仅针对源操作数
- 寄存器寻址表示指令运算的数据在寄存器中(常为通用寄存器)
- 存储器寻址表示指令运算的对象在内存中
数据在内存中的偏移地址在[]中,段地址可以默认或重设
- 存储器寻址和寄存器寻址均可用于源或目标操作数
深入了解寻址方式,才能理解指令的执行结果。
寻址方式练习
上述题目最后一句话的解释:
如果源操作数是存储器操作数的话,请给出这个源操作数的物理地址。因为寄存器不存在物理地址与逻辑地址这一说,寄存器的地址就是代号,就是固定的。这些物理地址、逻辑地址、偏移地址等等针对的全是存储器操作数。
解答:
第三个:两个寄存器加一个常量,所以是基址变址相对寻址。因为这里基址寄存器选择的是BX,所以默认在数据段。所以数据段的段地址是6000,也就知道数据段的段首地址是60000,加起来就得到这个指令的物理地址是608F0。
第四个:在汇编语言中,单引号表示字符。所以这里的大写字母B的ASK码是42H,所以这个指令的源操作数也是立即寻址方式。
第五个:寄存器间接寻址,只不过它通过了段重设,重设数据在里,附加段的段基地址在题目中给出是2000H。所以这条指令中源操作数的物理地址就是20800H。
第六个:基址寄存器选择的是BP,默认是在堆栈段,所以它的物理地址就是堆栈段寄存器左移四位加上BP的值,就可以得到是16200H。(???这里不懂)