5. 指令系统
5.1.基本概念
5.1.1.指令格式
操作数在很多时候表示的是运算数据存放的地址,所以也可以称为地址码。但是有一种情况是这个操作数就表示数据本身,也就是运算对象自己,而不是运算对象的存放处。因此,
操作数就表示指令执行的对象
。
5.1.2.指令中的操作数
(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。
5.2.寻址方式
1.直接寻址
2.寄存器间接寻址
(1)由寄存器间接给出操作数的偏移地址;
(2)存放偏移地址的寄存器称为间址寄存器(BX、BP、SI、DI);
(3)操作数的段地址(数据处于哪个段)取决于选择哪个间址寄存器:BX、SI、DI–默认在数据段,BP–默认在堆栈段。
4.基址、变址寻址
eg:执行下列指令:
MOV SI, 1100H
MOV BX, SI
MOV AX, [SI+BX]
解释:BX和SI相加等于2200H,因为基址寄存器选择的是BX,所以这个源操作数默认是在数据段,所以执行结果是将2200H和2201H两个单元的内容送给累加器AX。
5.寻址方式练习
上述题目最后一句话的解释:如果源操作数是存储器操作数的话,请给出这个源操作数的物理地址。因为寄存器不存在物理地址与逻辑地址这一说,寄存器的地址就是代号,就是固定的。这些物理地址、逻辑地址、偏移地址等等针对的全是存储器操作数。
解答:
第三个:两个寄存器加一个常量,所以是基址变址相对寻址。因为这里基址寄存器选择的是BX,所以默认在数据段。所以数据段的段地址是6000,也就知道数据段的段首地址是60000,加起来就得到这个指令的物理地址是608F0。
第四个:在汇编语言中,单引号表示字符。所以这里的大写字母B的ASK码是42H,所以这个指令的源操作数也是立即寻址方式。
第五个:寄存器间接寻址,只不过它通过了段重设,重设数据在里,附加段的段基地址在题目中给出是2000H。所以这条指令中源操作数的物理地址就是20800H。
第六条:基址寄存器选择的是BP,默认是在堆栈段,所以它的物理地址就是堆栈段寄存器左移四位加上BP的值,就可以得到是16200H。(???这里不懂)