请问直接寻址和寄存器间接寻址有什么关系呢

2025-02-10 15:07:49
推荐回答(3个)
回答(1):

所谓直接寻址,是指数据包发送时,需要指定数据包的目的地址值。这里的目的地址值分为2种:

1)64-bit地址,又称为MAC地址或IEEE地址。
每个ZigBee节点都应该有全球唯一的64位IEEE地址。这个地址需要向IEEE组织申请才能使用。通信时,将待发送的数据包的目的地址设为此64位IEEE地址,从而实现数据包的正确投递。

2)16-bit地址,即网络地址,或称为短地址。当一个ZigBee网络形成后,ZigBee网络内的每个节点,都会分配到一个16位的网络地址。通信时,将待发送的数据包的目的地址设为此16位网络地址。

而间接寻址,是使用本地绑定表(local binding table)的方式。协调器或者数据包发送方会保存这个绑定表,而这个绑定表能保存多个目的地。当需要传输数据包时,通过查询绑定表进行投递。

计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集提供给用户使用,一台计算机所具有的全部指令就称为该计算机的指令系统,不同的微处理器对应的指令系统也不全相同。
计算机中的指令由操作码字段和操作数字段两部分组成,操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数。指令的操作码字段在机器中的表示比较简单,只需对每一种操作指定确定的二进制代码就可以了;指令的操作数字段的表示比较复杂,操作数可以存放在指令本身(立即数)、寄存器中、存储器中和外设端口中,根据存放的位置不同,分为三类操作数:立即数操作数、寄存器操作数、存储器操作数。所谓寻址方式就是寻找操作数和操作数地址的方式。
操作数字段可以有一个或两个,通常称为一地址或二地址指令。大多数运算型指令都是双操作数指令,指令中的两个操作数分别称为源操作数和目的操作数。
下面的例子都是以16位机来讲解的。对于32位寄存器的使用可查看其他资料。

1.立即数寻址
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。立即数可以是8位和16位的。如果是16位数,则高位字节存放在教高地址单元中,低位字节放在教低地址单元中。
立即数寻址方式常用于给寄存器赋值,并且只能作为源操作数。

MOV AL,25 ;将25送入寄存器AL,即(AL)=19H
MOV AX,2076H ;将十六进制2076送入AX,即(AH)=20H,(AL)=76H
MOV BL,'A' ;将41H送BL寄存器
MOV DL,100B ;将二进制100送入DL,即(DL)=4

立即数后跟字符'H'表示为十六进制数,'B'表示为二进制数,'D'或省略表示十进制数。每行只能书写一条执行命令,分号后内容为注释部分。

2.寄存器直接寻址
操作数存放在寄存器中,用指令指定寄存器号,这种操作数称为寄存器操作数。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP;对于8位操作数,寄存器还可以是AL、AH、BL、BH、CL、CH、DL和DH。

MOV BX,AX ;将寄存器AX的内容送入BX
MOV DH,CL ;将寄存器CL的内容送入DH

3.存储器直接寻址
存储器直接寻址方式下,有效地址EA(存储器操作数在存储器中的偏移地址,也称为偏移量)直接包含在指令中,它存放在代码段中指令操作数之后,但操作数一般在数据段中,所以必须先求出操作数的物理地址(DS)*16+EA,然后再访问存储器才能取得操作数。

MOV AX,[1000H]
若DS=3000H,则把3000H*16+1000H=31000H里的内容送入AX,假设:

________
| 50 |---31000H 则把50H送入AL,63H送入AH,最终(AX)=6350H。
|--------|
|___63___|---31001H

如果要访问的操作数不在数据段中,则必须指定段名。

MOV BX,ES:[1200H] ;把附加段ES里,偏移量为1200H单元里的内容送入BX。

4.寄存器间接寻址
操作数的有效地址EA在寄存器中,可以用来指定存储器操作数有效地址的寄存器只有基址寄存器BX、BP和变址寄存器SI、DI。如果指定的寄存器是BX、SI或DI,则操作数默认在数据段中;若指定为BP,则默认在堆栈段中。如果要访问的存储器操作数不在默认的段中,则应指定段前缀。操作数物理地址如下:
物理地址=16*(DS)+(SI/DI/BX)
or 物理地址=16*(SS)+(BP)

MOV AX,[BX]
若(AX)=1234H,(DS)=3000H,(BX)=1000H,(31000)=5678H
则执行结果应该是(AX)=5678H

MOV AH,[BX]
若(AX)=1234H,(DS)=3000H,(BX)=1000H,(31000)=5678H
则执行结果应该是(AH)=78H,(AL)=34H不变。

5.寄存器相对寻址
操作数的有效地址是指定寄存器的内容加上指令中的8位或16位偏移量。
物理地址=16*(DS)+(SI/DI/BX)+偏移量
or 物理地址=16*(SS)+(BP)+偏移量

如:MOV AX,8[SI] (或写成 MOV AX,[SI+8])
MOV BX,ES:[SI+4]

6.基址变址寻址
在这种寻址方式中,操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
物理地址=16*(DS)+(BX)+(SI)或(DI)
or 物理地址=16*(SS)+(BP)+(SI)或(DI)

如:MOV AX,[BX][SI] (或写成 MOV AX,[BX+SI])
MOV AX,ES:[BX][SI]

7.相对基址变址寻址
在这种寻址方式中,操作数的有效地址是一个基址寄存器内容和一个变址寄存器的内容和8位或16位偏移量相加之和。同样,当基址寄存器为BX时,默认DS作为段寄存器;当基址寄存器为BP时,则默认SS作为段寄存器。
如:MOV AX,[BP+DI+8]
MOV AX,1000[BX][SI]

回答(2):

直接是直接找到的是你要的数据,间接是先找到你数据所在位置,也就是说指针,然后指向你要的数据。仅此而已。

回答(3):

不知道不要害人。
直接寻址,告诉你的是地址,也就是地址是直接告诉你的,所以你需要的操作数是在 存储器中,存放的地址就是指令告诉你的地址。
寄存器间接寻址,寄存器中存放的是地址,也就是说地址不是直接告诉你,而是存放在寄存器中,所以说操作数也是在存储器中,地址就是寄存器中的数。
比如 mov ah,[1000h] 这个源操作数是直接寻址,就是将数据段中有效地址为1000h中的数据传给ah。
而 mov ah,[bx],如果 bx=1000h,那么这条指令的作用和上面的指令作用一样。不过由于地址是在寄存器中,而不是直接给出,所以称其为寄存器间接寻址。 需要的操作数,同样存放在存储器中。