数据操作数是数据有关的操作数,即指令中操作的对象是数据、
数据操作数根据其存放的位置又可以分为:
立即数操作数,即指令重要操作的数据包含在指令中。
寄存器操作数,指令中要操作的数据存放在指定寄存器中。
存储器操作数:指令要操作的数据存储在指定的存储单元中。
IO操作数:即指令要操作的数据来自或者送到IO端口。
地址操作数:
地址操作数是程序转移地址相关的操作数。即指令中操作的对象不是数据,而是要转移的目标地址。
对于数据操作数,有的指令有两个操作数,一个称为源操作数,在操作过程中其值不改变,另一个称为目的操作数,操作后一般被操作结果替换。
对于地址操作数,指令只有一个目的操作数,他是一个供程序转移的目标地址。
寻址方式称为两大类:数据寻址和地址寻址。
数据寻址方式:寄存器寻址方式,存储器寻址方式,立即数寻址方式,和IO端口寻址方式。
立即数寻址:
立即数寻址所提供的操作数直接包含在指令中,紧跟在操作码之后,他作为指令的一部分,这种操作数称为立即数。
立即数寻址方式只能作为源操作数,主要用来给寄存器或者存储单元赋值。
寄存器寻址方式:
寄存器寻址方式的操作数存放在指令规定的寄存器中,寄存器的名称在指令中指出,对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP或者BP,对于8为操作数,寄存器可以使AL,AH,BH,BL,CH,CL,DH或者DL。
将DL存储内容送到CL mov CL DL
将BX内容送到AX。 mov AX BX
寄存器寻址,由于操作的数据在CPU寄存器中,所以不需要访问存储器,有较高的运行速度。
存储器寻址方式:存储器寻址方式的操作数存放在存储单元中,操作数在存储器中的物理地址由段地址左移4位与操作数在段内的偏移地址相加得到,段地址在实模式和保护模式下可从不同途径中取得。
有效地址可以由以下三种地址分量组成:
位移量:存放在指令中的一个8位或者16位的数,但是它不是立即数,而是一个地址。
基址:存放在基址寄存器BX或者BP中的内容。
变址:存放在变址寄存器或者DI中的内容。
直接寻址:直接寻址的操作数有效地址只包含位移量一种分量,即在指令的操作码后面直接给出有效地址,对这种寻址方式有:EA=位移量
mov AL [1064H]
直接寻址不是将例子中的不是将1064H床送给AL,而是将有效地址是1064H存储单元中内容传送到AL。
若果DS(段地址)=2000H,则该存储单元的物理地址
PA = 2000H×10H+1064H = 21064H
直接寻址的操作数一般在存储器的数据段中,即隐含的数据段寄存器是DS。但是8088//8086也允许段超越,此时需要在指令中特别标明,方法是有关操作数的前面写上操作数所在段的段寄存器,再加上冒号。
mov AL ES:[1064H]
在汇编语言中可以使用符号地址来表示位移量:
mov AL value
或者
mov AL [value]
此时value为存放所操作数地址单元的符号地址。
寄存器间接寻址方式。
寄存器间接寻址方式的操作数只包含基址寄存器BX的内容或者变址寄存器SI、DI的内容一种分量,因此操作数的有效地址在寄存器中,而操作数本身则在存储器中的数据段内,这与寄存器寻址方式的操作数就在寄存器中是不同的。
寄存器间接寻址方式的有效地址表示为:
EA(SI、DI、BX)
下面是执行以下指令的流程:
如果DS = 3000H,SI=2000H,BX=1000H,AL=64H,上述两条是指令执行情况,得到结果(AX)=4050H,(31000H)=64H
mov AX [SI]
mov [BX] AL
间接寻址方式也允许段超越。
mov ES:[DI],AX
寄存器相对寻址方式,操作数的有效地址EA是一个基址寄存器和变址寄存器的内容和指令中给定的8位或者16位位移量相加之和,所以有效地址有两种分量组成。可以做寄存器相对寻址的寄存器有寄存器BX,BP和变址寄存器SI,DI。
EA = {(SI),(DI)-----变址,(BX),(BP)--------基址}+disp_8/disp_16
上述位移量可以看成是一个存放寄存器中的基址的一个相对值,故称为寄存器相对寻址方式。在一般情况下,若指令中指定的寄存器是BX,SI,DI,则存放操作数的段寄存器默认为DS。若指令中指定的操作数是BP,则对应的段寄存器应为SS,同样寄存器相对寻址方式也允许段超越。
位移量可以是一个8位或者16位的立即数,也可以是符号地址,例如:
mov [SI+10H], AX
mov CX , [BX+COUNT]
基址变址寻址方式:操作数有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两中分量组成。
EA ={(SI),(DI)}+{(BX),(BP)}
在一般情况下,有基址寄存器决定操作数在那个段,若用BX的内容作为基址,则操作数在数据段中,若用BP作为基地址,则操作数在堆栈段中,但是机制变址寄存器也允许段超越:
mov [BX+DI],AX
mov AH,[BP][SI]
基址变址相对寻址的操作数有效地址是一个基址寄存器与一个变址寄存器内容和指令中指令的8位或者16位位移量之和,所以有效地址由3个分量组成。
EA = 变址(SI,DI)+基址(BX,BP)+位移量(disp_8/disp_16)
当基址寄存器为BX时,段寄存器应为DS,基址寄存器为BP时,段寄存器应为SS。同样也允许段超越。
IO端口寻址方式
端口直接寻址方式:这种寻址的端口地址使用8位立即数表示。
IN AL,21H
此指令表示从地址为21H的端口读取数据送到AL中,假设21H端口提供的数据为7FH,则将21H端口提供的数据7FH输入到8位寄存器AL中。
端口间接寻址方式:当IO端口地址大于FFH时,必须将端口地址存放在DX寄存器中。
mov DX,120H
out DX, AX
前一条指令将端口地址120H送到DX寄存器中,后一条指令将AX中的内容输出到地址由DX寄存器内容所指定的端口,所以第二句将AX的内容输出到120H端口中。
地址寻址方式:
程序的执行顺序是由CS和IP的内容决定的。
通常情况下,当BIU完成一次取指周期后,就自动改变IP的内容以指向下一条指令的地址,是程序按照预先存放的次序,有低地址向高地址执行 。如需改变程序执行顺序,可以可以修改IP和内容或者同时修改IP和CS的内容,从而将程序转移到指令所指定的转移地址。
地址寻址方式就是找到转移的地址,转移地址可以再段内,也可以跨段。
段内寻址方式:段内寻址方式也称为相对寻址方式,转移的地址是当前IP内容和指令规定的下一条指令到目标地址之间的8位或者16位相对位移量之和,相对位移量可正可负。
段内间接寻址方式:该寻址方式的程序转移地址存放在寄存器和存储单元中,寄存器可用各种数据寻址方式表示,指令的操作使用指定的寄存器或者存储器中的值取代当前IP的内容,以实现程序的段内地址转移。
段间直接寻址
这种寻址方式是指在指令中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP的内容。
段间间接寻址方式:这种寻址方式是指由指令中给出的存储器寻址方式求出转移地址的四个连续存储单元的地址。
指令的操作是将存储单元的前两个单元的内容送给IP,后两个单元送给CS,以实现另一个段的转移。