数据寻址有多种,需要在指令中明确指出采用哪一种寻址方式,可以专门设置一个寻址方式特征字段,或纳入地址码中。
形式地址 A A A: 指令字中的地址
有效地址 E A EA EA: 操作数的真实地址
有效地址由形式地址根据寻址方式来确定。
在大多数机器中,指令字长 = 存储字长 = 机器字长。
又称为立即数寻址,即指令中的形式地址部分不是一个操作数的地址,而是操作数本身,因此该指令的执行过程不需要寻址。
如指令 " M O V MOV MOV A X , 20 H AX, 20H AX,20H",将 20 H 20H 20H 放入 A X AX AX 寄存器中,其中立即数可正可负,负数需要用补码来表示。
特点
指令中的形式地址部分即为有效地址,即 E A = A EA = A EA=A。
例如指令 " M O V MOV MOV A X , [ 20 H ] AX, [20H] AX,[20H]",即是将 [20H] 地址中的数据传输到 AX 寄存器中。
特点
指令中不直接给出操作数地址,操作数地址通常隐含在操作码或某个(约定)寄存器中。
如 A D D ADD ADD 操作,即是默认另一个操作数在 A C C ACC ACC 中。将 A A A 地址中的数取出与 A C C ACC ACC 中的数进行加法运算。
指令中的形式地址不是操作数的地址,而是 “操作数地址的地址”。
其中在多次间址时,需要查看数据单元格中的第一位数据,如果为 1 1 1 则表示继续间址,如果为 0 0 0 则为真正地址。
特点
J M P JMP JMP @ A @A @A 指令,表示跳转到 A A A 单元中所指示的地址,为间接寻址。正因为这条间址指令,我们转入子程序时只需修改 A 单元中数据,即可实现从子程序再跳转回主程序的功能。
指令中的形式地址直接指出寄存器的编号,操作数存储于寄存器中,即 E A = R i EA=R_i EA=Ri,有效地址即为寄存器编号。
如 " M O V MOV MOV A X , B X AX, BX AX,BX" 指令,即是将 B X BX BX 寄存器中的数据送到 A X AX AX 中。
特点
指令中的形式地址为寄存器的编号,寄存器的内容是操作数的有效地址。
E A = ( R i ) EA = (R_i) EA=(Ri),有效地址在寄存器中。
如指令 " M O V MOV MOV A X , [ B X ] AX, [BX] AX,[BX]",就是根据 B X BX BX 寄存器中的地址,去主存中访问对应数据,并将数据存入 A X AX AX 寄存器中。
特点
有效地址在寄存器中,操作数在存储器中,执行阶段访存便于编制循环程序。
指令中的形式地址与基址寄存器内容之和为有效地址。
专用寄存器基地寻址
E A = ( B R ) + A EA=(BR)+A EA=(BR)+A,其中 B R BR BR 为基址寄存器
通用寄存器基址寻址
需要给出寄存器编号作为基址寄存器。
特点
指令中的形式地址与变址寄存器内容之和为有效地址。
E A = ( I X ) + A EA = (IX) + A EA=(IX)+A,与基地寻址非常相似。唯一的不同点在于基址寄存器中的值由操作系统或管理程序决定,而 IX 的内容由用户指定。
特点
有效地址为程序计数器 P C PC PC 的值与形式地址之和。
E A = ( P C ) + A EA = (PC) + A EA=(PC)+A, A A A 的位数决定操作数的寻址范围,可编写浮动程序(程序放哪都能执行)。
堆栈有两个操作,分别是 P U S H PUSH PUSH(压栈) 与 P O P POP POP(弹栈)。进栈与出栈的操作分别由 S P SP SP 指针的加减完成。