80x86的7种寻址方式

80x86的7种寻址方式

所需知识点:一个寄存器能够储存16bit信息,即1个字,也能够分红2部分(高位字节和低位字节),每部分存储8bit即1字节web

在这里插入图片描述

在8086中只有bx,bp,si,di能够在"[…]"中进行内存单元的寻址编程

1.当即寻址

操做数在指令中,紧跟在操做码以后,这样的操做数成为当即数
例如:
MOV AL,12H
MOV AX,1234H数组

2. 直接寻址

用一个常量来表示地址,可用于直接定位一个内存单元。
操做数的地址中的偏移量直接跟在操做码以后,默认状况下基址存放在DS中,这个时候不须要加前缀。若是是加了别的前缀,如ES,则表示基址在ES中。
例如:
mov ax,[40h]
svg

直接寻址

3.寄存器寻址

操做数在CPU的寄存器中,指令指定寄存器号,这种寻址速度快,它不须要访问存储器中的操做数,由于全部的操做数都在寄存器中。
例如:
mov ds,ax
mov al,dhoop

4.寄存器间接寻址

用一个变量表示地址
操做数在存储器中,操做数有效地址在SI,DI,BX,BP这四个寄存器之一中,在通常状况下,若是有效地址在SI,DI和BX中,则以DS段寄存器以内容为段值。若是有效地址在BP中,则以SS段寄存器以内容为段值
例如:
mov ax,[bx] 或 mov ax,[si]或 mov ax,[di]-----DS基址
mov ax,[bp]-----SS基址spa

5.寄存器相对寻址方式

用一个变量和一个常量表示地址
注:[bx+count]=[bx].count=coount[bx]code

(1)基址相对寻址

对于BX寄存器来讲,使用DS做为基址寄存器.例如:mov ax,count[bx] ------DS基址
对于BP寄存器来讲,使用SS做为基址寄存器.例如:mov ax,count[bp] ------SS基址xml

(2)变址相对寻址

注:si,di与bx的惟一区别是si,di不可拆分为2部分blog

mov ax, count[si]

该例子的物理地址计算是这样的:物理地址=16D(DS)+(si)+count*token

在编程时,咱们能够将一组内存单元定义为一个段,这个彻底取决于咱们
但段的长度必须<=64kb的连续地址,且起始地址为16的倍数
如:123B0H—123B9H
这个段内存的段地址就是1230H,长度就是10个字节了,5个字

那么问题来了——为何要*16D?
80x86将16位地址总线扩展成了20位地址,段地址左移4位即乘16
好比段地址ds=2000H,偏移地址bx=0040H,则物理地址=20040H
图片截图自汇编语言_第2版(王爽)

6.基址变址寻址

用两个变量表示地址,注意只有4种组合方式
例如:
mov ax,[bx][si] 原变址寻址
mov ax,[bp][si]
mov ax,[bx][di] 目的变址寻址
mov ax,[bp][di]
能够用来表示数组

;实现将数组si复制到数组di
	mov ax,2000H
	mov ds,ax
	mov si,00H
	mov di,10H
	mov bx,00H
s:  mov ax,si[bx]
	mov di[bx],ax
	add bx,1H
	loop s;循环给bx赋值

数组

7.相对基址变址寻址

用两个变量和一个常量寻址
EA=DS16+BX+SI(或DI)+DISP(8位或16位偏移量)
EA=SS
16+BP+SI(或DI)+DISP(8位或16位偏移量)
例如:
mov ax, [bx+si+count]

能够这样子记忆
基址:出现[ax]、[bx]等
变址:出现[si]、[di]
相对:出现常量[count]
在这里插入图片描述